1. 程式人生 > >uCosIII之訊息佇列與記憶體管理

uCosIII之訊息佇列與記憶體管理

#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));
	}   
}