在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();
}

 

posted @ 2024-10-29 10:43  JayWell  阅读(83)  评论(0编辑  收藏  举报