在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 eventsreturn (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);
#endifSetSysClock(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 DEBUGGPIOA_SetBits(bTXD1);GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);UART1_DefInit();
#endifPRINT("%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();
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/823600.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swagger UI、RESTful简介

Swagger UI 简介Swagger UI允许任何人(无论您是开发团队还是最终用户)都可以可视化API资源并与之交互,而无需任何实现逻辑。它是根据您的OpenAPI(以前称为Swagger)规范自动生成的,具有可视化文档,可简化后端实现和客户端使用。 SwaggerUI 特点无依赖 UI可以在任何开发环…

Ubuntu QTCreator 程序打包

下载linuxdeployqt官网地址:https://github.com/probonopd/linuxdeployqt/releases安装更改名字 mv linuxdeployqt-6-x86_64.AppImage linuxdeployqtView Code修改权限 chmod 777 linuxdeployqtView Code全局访问 sudo mv linuxdeployqt /usr/local/binView Code测试 linuxdep…

❗Vue中常见的性能优化(被问到要尽可能说全呀cc!!!)

Webpack层级的优化(后面会讲) 前端通用的性能优化,如图片懒加载 使用SSR

算法与数据结构——计数排序

计数排序 计数排序(counting sort)通过统计元素数量来实现排序,通常应用于整数数组。 简单实现 给定一个长度为n的数组nums,其中的元素都是“非负整数”,计数排序的整体流程如下:遍历数组,找出其中最大的数组,记为m,然后创建一个长度为 m+1 的辅助数组counter。 借助c…

二分类结果评估指标

TP(True Positive):真正例,真值和预测值都是正例FP(False Positive):假正例,真值是负例,预测值是正例FN(False Negative):假负例,真值是正例,预测值是负例TN(True Negative):真负例,真值和预测值都是负例Accuracy(准确率):对于给定的测试数据集,分类器正…

GaussDB的行存表与列存表的选择

一、前言 行存表和列存表是数据库中两种常见的数据存储方式。随着信息技术的飞速发展,数据存储和管理以及如何高效地存储和处理大量的数据已经成为了我们的一大挑战。 为了解决这个问题,行存表与列存表应运而生,它们以其独特的优势在各个场景得到了高效的应用。GaussDB支持行…

什么是PlatformIo

PlatformIO是一个开源的物联网开发生态系统,它为多种硬件平台和开发环境提供了一致的、跨平台的开发体验,从而降低开发复杂性、提高开发效率。本文将详细解析PlatformIO的核心组成部分,运行原理以及在实际应用中的作用和优势。PlatformIO提供了统一的项目管理工具,包括项目…

麒麟系统修改镜像地址,并安装数据库mariadb

1.跳转到镜像源文件夹 cd /etc/yum.repos.d 2.备份系统镜像源文件 ps:要养成修改系统文件之前做文件备份的好习惯 cp kylin_aarch64.repo kylin_aarch64.repo.bak 3.修改的镜像源 vi kylin_aarch64.repo[ks10-adv-cdrom] name = Kylin Linux Advanced Server 10 - cdrom baseur…

强化学习的数学原理-05蒙特卡洛方法

目录MC BasicMC Exploring StartsMC Epsilon-Greedy MC Basic 从\(model \: base \:\)的\(Reinforcement \: learning \:\)过渡到\(model \: free \:\)的\(\: Reinforcement \: learning \:\)最难以理解的是怎么在没有模型的情况下去估计一些量。 这里面就有一个重要的\(\: id…

关于我卖的苹果~(甘肃-天水-山区-结果之后没打农药)

尽快发货❗🍎一大箱纯红富士120(小箱60)。🍎一大箱三合一100(小箱50)。⛰️自家种的,昼夜温差大。味道比较甜。一箱大概15斤。纯大果。 本文来自博客园,作者:一石数字欠我15w!!!,转载请注明原文链接:https://www.cnblogs.com/52-qq/p/18512197

关于我卖的苹果~(甘肃-天水-山区)

尽快发货❗🍎一大箱纯红富士120(小箱60)。🍎一大箱三合一100(小箱50)。⛰️自家种的,昼夜温差大。味道比较甜。一箱大概15斤。纯大果。 本文来自博客园,作者:一石数字欠我15w!!!,转载请注明原文链接:https://www.cnblogs.com/52-qq/p/18512197

法律智能助手:思通数科开源NLP系统助力文档分类与检索加速

一、系统概述 思通数科AI平台是一款融合了自然语言处理和多标签分类技术的开源智能文档分类工具,特别适用于法律行业。平台采用深度学习的BERT模型来进行特征提取与关系抽取,实现了精准的文档分类和检索。用户可以在线训练和标注数据,使系统持续学习,准确率、召回率等指标随…