在TMOS系统的main.c中添加事务处理代码
EVT包中跑BLE的默认代码,一般只添加了必要的事件处理函数,且有一定的作用域范围。比如BLE从机例程中,Peripheral_TaskID是加了static修饰的,故以默认代码的逻辑,只能在peripheral.c中启用Peripheral_TaskID下的事件和对应的Peripheral_ProcessEvent事件处理函数。借着EVT包中已有的框架,也是可以直接在其他文件中启用事件的,只需要将Peripheral_TaskID定义前的static去掉,使其成为全局变量,再在需要调用Peripheral_TaskID的文件中声明Peripheral_TaskID。
如果按EVT默认代码的逻辑走下去,是可以限制BLE功能的代码里块只在peripheral.c中出现,方便后续排查问题的。下文以在BLE的从机代码中添加ADC采集为例,介绍如何在main.c中添加自定义的TMOS处理代码,这样一来有少量的测试代码也不用再创建.c、.h文件,不用在其他“模块化”的文件中添加测试事件,更好地控制变量。
令TMOS系统运行一个事件,需要有①任务ID、②事件处理函数和③作为事件编号的宏,需要增加的代码处见下方//XXX注释处。当自定义事件代码量较大时,可以将有//XXX注释的代码提出来放到自定义的头、源文件中,留一个初始化函数在main函数中调用。
#define MAIN_ADC_CRIC 0x0001 //XXX 自定义的事件编号 uint8_t Main_TaskID = 0xFF; //XXX 自定义的taskID uint16_t adcBuff[10]; //XXX 自定义的事件处理函数 uint16_t Mian_ProcessEvent(uint8_t task_id, uint16_t events) { //XXX 自定义添加的采集VIO33引脚电压的事件,可以用于采集纽扣电池的电压 if(events & MAIN_ADC_CRIC) { PRINT("VIO33_ADC\n"); ADC_InterBATSampInit(); for(uint8_t i = 0; i < 10; i++) { adcBuff[i] = ADC_ExcutSingleConver(); // 连续采样 } for(uint8_t i = 0; i < 10; i++) { PRINT("adcBuff[%d] = %d\n", i, adcBuff[i]*1050/512-3*1050); } tmos_start_task(Main_TaskID, MAIN_ADC_CRIC, 16000); return (events ^ MAIN_ADC_CRIC); } 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(); Peripheral_Init(); //XXX 注册自定义的taskID和事件处理函数 Main_TaskID = TMOS_ProcessEventRegister(Mian_ProcessEvent); tmos_start_task(Main_TaskID, MAIN_ADC_CRIC, 1600); Main_Circulation(); }