首页 > 其他分享 >在TMOS系统的不同taskID间交互数据

在TMOS系统的不同taskID间交互数据

时间:2024-10-29 10:31:03浏览次数:2  
标签:tmos mem len TMOS taskID PRINT Main 交互

目录

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

 

标签:tmos,mem,len,TMOS,taskID,PRINT,Main,交互
From: https://www.cnblogs.com/JayWellsBlog/p/17777891.html

相关文章

  • 3个模型的交互式多模型IMM,基于EKF的目标跟踪实例(附MATLAB代码)
    文章目录3个模型的IMM源代码运行结果代码介绍总结3个模型的IMM代码实现了基于IMMIMMIMM(Interacting......
  • 【玩转金融素材生成】探索交互式AIGC组合素材生成技术
    作者:京东科技蒋煜襄  本文介绍了一种交互式可控组合素材生成技术,本方案基于StableDiffusion模型,结合位置控制生成技术,实现了金融领域中的多元素素材组合交互式生成能力,增加了素材生成的丰富性以及使用上的易用性,可以帮助设计师和运营人员快速制作banner图或活动页中所需要......
  • 生产、交互、消费全链路升级,开启“三智”视频新时代
    谷歌在2015年曾预测:“未来互联网世界80%的内容将是以视频形式呈现的。”未来已来!十年前的预判在今天几乎全部实现。不仅如此,视频在工作生活中的渗透率不断提升,并且过去一年中又有很多全新视频体验来到我们身边:AIGC可以快速生产短剧,抖音联合博纳影业出品的《三星堆:未来启示录》......
  • 【MySQL】实战篇—应用开发:使用MySQL与编程语言(如Python、Java、PHP等)进行交互
    MySQL是存储和管理数据的强大工具,而编程语言(如Python、Java、PHP等)则用于开发应用程序和处理业务逻辑。将这两者结合起来,可以实现数据的存储、查询、更新和管理,进而构建功能强大的应用程序。2.重要性和实际应用场景在软件开发中,数据库与编程语言的交互至关重要,以下是一些常......
  • HarmonyOS:Node-API实现跨语言交互(3)使用Node-API实现跨语言交互开发流程
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18504008➤如果链接不是为敢技术的博客园地址,则可能是......
  • HarmonyOS:Node-API实现跨语言交互(2)Node-API支持的数据类型和接口
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18502733➤如果链接不是为敢技术的博客园地址,则可能是......
  • HarmonyOS:Node-API实现跨语言交互(1)Node-API简介
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18503923➤如果链接不是为敢技术的博客园地址,则可能是......
  • 鸿蒙案例实践:智能家居控制面板的并发任务与UI交互设计
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。1.项目概述与需求分析背景:随着物联网......
  • HarmonyOS:Node-API实现跨语言交互
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/18502733➤如果链接不是为敢技术的博客园地址,则可能是......
  • 软件测试、交互测试有什么区别
    ​​软件测试与交互测试的区别:1.软件测试概念;2.交互测试概念;3.目的和重点;4.测试方法;5.测试内容;6.应用场景;7.测试工具;8.测试人员;9.测试结果的处理。软件测试更注重产品的功能性、性能及稳定性,而交互测试则侧重于用户体验和界面操作的流畅性。1.软件测试概念软件测试是在软件开发......