在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 = 0;    //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();
    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();
}
posted @ 2023-07-31 20:44  JayWell  阅读(558)  评论(1编辑  收藏  举报