在TMOS系统的不同taskID间交互数据
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 events return (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); #endif SetSysClock(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 DEBUG GPIOA_SetBits(bTXD1); GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA); UART1_DefInit(); #endif PRINT("%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(); }