目录
TMOS系统中,每个taskID下都预留了一个事件编号0x8000,用于在不同的taskID中传递数据。由于0x8000占据了一个事件编号,故每个taskID下,用户只能最多自定义15个事件。
不同的taskID可以用于将不同的功能划分到不同的作用域中,将代码模块化,方便管理和移植。比如说某个工程中,BLE相关的应用逻辑统一放在BLE.C中,USB相关的应用逻辑统一放在USB.C中,所有两个源文件之间无法直接调用对方包含的TMOS事件。那么想做BLE和USB之间的数据透传,就可以通过编号0x8000的事件打通一个通道。
简单的字符串传递测试代码见下,可拷贝到peripheral例程的peripheral_main.c中编译。
打印日志如下。
const uint8_t STRING_MSG_TEST[100] = "hakuna matata x1 ""hakuna matata x2 ""hakuna matata x3 ";#define MAIN_CRIC_T 0x0001 //XXX 自定义的事件编号uint8_t Main_TaskID_T = 0xFF; //XXX 自定义的taskID uint8_t Main_TaskID_R = 0xFF; //XXX 自定义的taskID uint16_t adcBuff[10];uint32_t tmos_memory_getlen(void); //查询协议栈内存函数声明//XXX 自定义的事件处理函数 uint16_t Mian_ProcessEvent_T(uint8_t task_id, uint16_t events) {//自定义的TMOS内存发送,send事件可以自定义事件编号if(events & MAIN_CRIC_T){uint8_t *pMsg_T;uint32_t mem_len_0 = 0;uint32_t mem_len_1 = 0;mem_len_0 = tmos_memory_getlen();PRINT("Before_T = %d\n",mem_len_0);//TMOS内存申请函数if( (pMsg_T = tmos_msg_allocate(100)) != NULL ){tmos_memcpy(pMsg_T, STRING_MSG_TEST, 100);//TMOS内存传递发送函数 tmos_msg_send(Main_TaskID_R, pMsg_T);}else{PRINT("allocate_fail\n");}mem_len_1 = tmos_memory_getlen();PRINT("After_T = %d\n", mem_len_1);//检查调用tmos_msg_send函数后的协议栈ram开销PRINT("TMOS_Memory_Cost = %d\n", mem_len_0 - mem_len_1);tmos_start_task(Main_TaskID_T, MAIN_CRIC_T, 1600); //每秒传递一次内存return (events ^ MAIN_CRIC_T);}return 0; }//XXX 自定义的事件处理函数 uint16_t Mian_ProcessEvent_R(uint8_t task_id, uint16_t events) {//SYS_EVENT_MSG事件编号为TMOS系统保留值,专门用来接收tmos_msg_send发来的内存if(events & SYS_EVENT_MSG){uint8_t *pMsg_R;uint32_t mem_len_0 = 0;uint32_t mem_len_1 = 0;mem_len_0 = tmos_memory_getlen();PRINT("Before_R = %d\n",mem_len_0);//TMOS内存传递接收函数if((pMsg_R = tmos_msg_receive(Main_TaskID_R)) != NULL){PRINT("%s\n", pMsg_R);//TMOS内存释放函数 tmos_msg_deallocate(pMsg_R);}mem_len_1 = tmos_memory_getlen();PRINT("After_R = %d\n", mem_len_1);//检查释放内存前后的协议栈ram开销PRINT("TMOS_Memory_Cost = %d\n", mem_len_0 - mem_len_1);PRINT("——————————————————————————————\n");// return unprocessed eventsreturn (events ^ SYS_EVENT_MSG);}return 0; }/********************************************************************** @fn Main_Circulation** @brief 主循环** @return none*/ __HIGH_CODE __attribute__((noinline)) void Main_Circulation() {while(1){TMOS_SystemProcess();} }/********************************************************************** @fn main** @brief 主函数** @return none*/ int main(void) { #if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)PWR_DCDCCfg(ENABLE); #endifSetSysClock(CLK_SOURCE_PLL_60MHz); #if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU); #endif #ifdef DEBUGGPIOA_SetBits(bTXD1);GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);UART1_DefInit(); #endifPRINT("%s\n", VER_LIB);CH59x_BLEInit();//CH58X_BLEInit();根据MCU型号自行修改 HAL_Init(); // GAPRole_PeripheralInit(); //本测试不跑BLE功能 // Peripheral_Init();//本测试不跑BLE功能//XXX 注册自定义的taskID和事件处理函数Main_TaskID_T = TMOS_ProcessEventRegister(Mian_ProcessEvent_T);Main_TaskID_R = TMOS_ProcessEventRegister(Mian_ProcessEvent_R);tmos_start_task(Main_TaskID_T, MAIN_CRIC_T, 1600);Main_Circulation(); }