uCosIII之訊息佇列與記憶體管理
阿新 • • 發佈:2019-02-09
#define TX_MSG_MEM_BLK_NUM 30 //記憶體分割槽的記憶體塊數量 #define TX_MSG_MEM_BLK_SIZE 60 //記憶體分割槽的記憶體塊大小 #define TX_MSG_QUEUE_SIZE 30 //傳送訊息佇列長度 OS_Q CommInfoQueue; OS_MEM CommInfoMem; OS_SEM g_stCommDataSendSem; //資料整合函式指標陣列 void (*add_info_fun)(void); void (*add_info_fun_list[3])(void) = { AddRealTimeWorkInfoPartA1ToSendQueue, AddRealTimeWorkInfoPartB1ToSendQueue, AddRealTimeWorkInfoPartB2ToSendQueue, }; /* *************************************************************************************************** * CommunicateTaskCreate() * * Description : The use of the the funciton is to create the task that manager the communication. * * Arguments : none. * * Returns : none * * Notes : none *************************************************************************************************** */ void CommTaskCreate(void) { OS_ERR err; OSTaskCreate((OS_TCB *)&CommTaskTCB, (CPU_CHAR *)"Comm Task Start", (OS_TASK_PTR) CommTask, (void *) 0, (OS_PRIO) COMM_TASK_PRIO, (CPU_STK *)&CommTaskStk[0], (CPU_STK_SIZE) COMM_TASK_STK_SIZE / 10, (CPU_STK_SIZE) COMM_TASK_STK_SIZE, (OS_MSG_QTY) 5u, (OS_TICK) 0u, (void *) 0, (OS_OPT)(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR), (OS_ERR *)&err); APP_TRACE_INFO(("Created communicate Task, and err code is %d...\r\n", err)); OSSemCreate(&g_stCommDataSendSem,"Comm data send sem",0,&err); OSQCreate((OS_Q *)&CommInfoQueue, (CPU_CHAR *)"Comm Info Queue", (OS_MSG_QTY)TX_MSG_QUEUE_SIZE, (OS_ERR *)&err); OSMemCreate((OS_MEM *)&CommInfoMem, (CPU_CHAR *)"Comm Info Mem", (void *)&CommInfoMemStorage[0][0],//記憶體分割槽起始地址 (OS_MEM_QTY )TX_MSG_MEM_BLK_NUM,//記憶體分割槽裡的記憶體塊數量 (OS_MEM_SIZE )TX_MSG_MEM_BLK_SIZE,//每個記憶體塊的大小(位元組) (OS_ERR *)&err); } void CommTask(void *p_arg) { OS_ERR err; while(DEF_TRUE) { OSTimeDlyHMSM(0, 0, 1, 000,OS_OPT_TIME_HMSM_STRICT,&err); if(g_u8WifiCmdRec == DEF_YES) { //響應上位機指令 ResponsePrgmCmd(g_u8SerRxMsgBuff); g_u8WifiCmdRec = DEF_NO; } //新增實時資訊到傳送佇列 for(uint8_t j = 0;j < 3 ;j++){ add_info_fun = add_info_fun_list[j]; add_info_fun(); } //傳送訊號量,啟動一次資料傳輸 OSSemPost(&g_stCommDataSendSem,OS_OPT_POST_1,&err); } } /* *************************************************************************************************** * CommDataSendTask() * * Description :Data send task. * * Argument(s) : none. * * Return(s) : none. * * Note(s) : none. *************************************************************************************************** */ static void CommDataSendTask(void *p_arg) { OS_ERR err; OS_MSG_SIZE msg_size; CPU_INT08U *pTxMsgData = NULL; while(DEF_TRUE) { pTxMsgData = OSQPend((OS_Q *)&CommInfoQueue, (OS_TICK )OS_CFG_TICK_RATE_HZ / 5, (OS_OPT )OS_OPT_PEND_BLOCKING, (OS_MSG_SIZE *)&msg_size, (CPU_TS *)NULL, (OS_ERR *)&err); if(err == OS_ERR_NONE){ if(pTxMsgData != NULL){ SendPrgmMsgFrame(msg_size, pTxMsgData);//傳送資料 OSMemPut(&CommInfoMem,pTxMsgData,&err); } } } }
static void AddRealTimeWorkInfoPartA1ToSendQueue(void) { OS_ERR err; CPU_INT08U *pTxBlkPtr; pTxBlkPtr = OSMemGet(&CommInfoMem,&err); if(err == OS_ERR_NONE){ //報頭段 *(pTxBlkPtr + HEAD_BYTE_ONE) = 0xF1; *(pTxBlkPtr + HEAD_BYTE_TWO) = 0xF2; *(pTxBlkPtr + HEAD_BYTE_THREE) = 0xF3; /*添加發送資料...*/ //報尾段 *(pTxBlkPtr + END_BYTE_ONE) = 0x5F; *(pTxBlkPtr + END_BYTE_TWO) = 0x6F; OSQPost(&CommInfoQueue, pTxBlkPtr, TX_MSG_MEM_BLK_SIZE, OS_OPT_POST_FIFO, &err); if(err != OS_ERR_NONE){ APP_TRACE_INFO(("- ->RT work info part_a1 msg post err,err code is %d\n\r",err)); } }else{ APP_TRACE_INFO(("- ->RT work info part_a1 mem blk get err,err code is %d\n\r",err)); } }