首页 > 其他分享 >CH57x/CH58x/CH59xBLE芯片TMOS任务详解

CH57x/CH58x/CH59xBLE芯片TMOS任务详解

时间:2023-09-15 11:56:51浏览次数:72  
标签:CH57x TMOS 任务 CH58x 事件 Task 执行 ID

概述:

蓝牙为了实现同多个设备相连,实现多功能和多任务,产生了调度问题。虽然软件和协议栈可扩充,但终究最底层的执行部门只有一个。为了实现多事件和多任务切换,需要把事件和任务对应,针对这种应用起了一个TMOS名字操作系统抽象层。

TMOS作为调度核心,BLE协议栈、profile定义、所有的应用都围绕它来实现。TMOS不是传统大家使用的操作系统,而是一个允许软件建立和执行事件的循环。

多任务管理方式实际上只有一个任务在运行,但是可以使用任务调度的策略将多个任务进行调度,每个任务占用一定的时间(独占式,执行完当前任务退出,继续查询其他可执行任务),所有的任务通过时间分片的方式处理。

操作:

TMOS 系统时钟单位为 625us,以 RTC 为基准得到所有需要系统的时间。

软件功能是由任务事件来实现的,创建一个任务事件需要以下工作:

1、创建task identifier任务ID:

 

例如:

 

2、添加进程

编写任务初始化(task initialization routine)进程,并需要添加到TMOS初始化进程中,这就是说系统启动后不能动态添加功能(新的Task ID);

 

3、编写任务处理程序:

 

4、定义任务事件:

事件名按位定义,每一层taskID最多包含1个消息事件和15个任务事件(共16位)

列如:

按位定义EVT任务事件,如下图:

 

任务事件的启动有2种方式:(任务启动后只执行1次,如果重复执行,需要再重新开启任务)

1)  立即启动任务,调用后event时间立即执行

 

比如:

2)  设定延迟启动1个任务,从设定完成后开始计时

 

比如:Peripheral_TaskID功能下的自定义的SBP_PERIODIC_EVT任务,延迟(SBP_READ_RSSI_EVT_PERIOD*625)us后运行

 

用户代码功能,前面有讲生成TaskID的时候需要向Tmos注册EVT处理函数指针,EVT执行条件满足后,Tmos就会自动调用该函数,如下图所示:

 

externbStatus_ttmos_stop_task( tmosTaskIDtaskID, tmosEvents event );

此函数将停止一个会在taskID层生效的,名为event的任务,调用此函数后,该事件任务将不会生效。

5、查询并执行任务

主循环不停调用TMOS_SystemProcess,查询可执行event事件;如果开始HAL_SLEEP,芯片开启低功耗睡眠模式,Tmos会开启RTC唤醒功能,事件被执行前会自动唤醒,运行事件代码。

 

任务调度函数使用注意事项:

  1. 禁止在中断中调用
  2.  建议不要在单个任务中执行超过连接间隔一半时长的任务,否则将影响蓝牙通讯
  3.  同理,在中断中建议不要执行超过连接间隔一半时长的任务,否则将影响蓝牙通讯
  4. 在事件生效执行的代码中调用延时执行函数时,延时时间以当前事件生效时间点为基准偏移,所以对调用延时执行函数在生效执行的代码中摆放的位置没有要求。
  5. 任务存在优先级,根据在xxx_ProcessEvent函数中判断的先后顺序决定,同时生效的任务,先执行先判断,后执行后判断。注意,执行完先判断的事件任务后,要等到任务调度系统轮巡一遍后,才会执行后判断的事件任务。
  6. 事件名按位定义,每一层taskID最多包含1个消息事件和15个任务事件(共16位)

特殊用法:

前面讲了1个Task ID的应用情况,为了降低C文件或者功能之间的耦合,一般比较好的做法是把同功能或者相近的event放到同一个Task ID下,这样就产生了1个问题,不同的Task ID可能会有数据需要交互,Tmos提供了不同Task ID之间进行数据交互的函数。

比如:外设里面拿其中两个Task ID 举例子halTaskID和Peripheral_TaskID,假设这两个Task之间要进行数据交互。

 

之前有讲每个Task ID都有1个消息event

 

上图演示的是接收消息,接收主要用到2个函数

 

 

 

 

 

 

 

 

标签:CH57x,TMOS,任务,CH58x,事件,Task,执行,ID
From: https://www.cnblogs.com/BLEBaby/p/17704664.html

相关文章

  • CH59X/CH58X/CH57X sleep模式下串口唤醒收发数据
    整体程序逻辑:下方的具体程序及使用是基于CH592进行的SLEEP模式睡眠唤醒是由协议栈管理的,还在睡眠时,无法接收到数据。已经通过使能HAL_SLEEP开启睡眠。如果需要在睡眠时实时接收串口传来的数据是不可行的,需要先将设备唤醒之后再进行串口数据的接收;将唤醒的条件设置为下降沿唤醒......
  • [AGC002F] Leftmost Ball 题解
    很好的一道组合题。思路直接设\(dp_{i,j}\)表示已经放了\(i\)个白点与\(j\)中颜色。然后直接组合数算即可。CodeAC记录。......
  • CH58x三模模组方案(CH555主控)
    前言:通用三模键盘&三模鼠标(三模模组)通讯协议可以参考该博客,提供了串口发送命令帧的具体详解。本博客基于CH582通讯协议基础上增加CH555作为主控,通过串口发送命令帧控制CH582。通过CH555控制CH582的优点:CH582本身只有键扫/三模标准键盘等功能。如需要实现灯光效果,则可以通过CH555......
  • CH57x/CH58xUART3收数据并校验修改MAC地址
    前言:UART1中断例程中达到触发点或超时接收串口数据会立马发送出去。本博客实现的是接收数据保存在数组中,同时校验数据内容是否为修改MAC帧。接收数据不需要在UART_II_RECV_RDY中接收数据,可以都在UART_II_RECV_TOUT中收数据,直接读取RBR寄存器即可。程序参考: 基于BLE_UART例程......
  • CH57x/CH58x堆栈
    前言: 概念:inta=0;//全局初始化区域char*p1;//全局未初始化区域main(){staticintc=0;//全局(静态)初始化区intb;//栈chars[]="abc";//栈char*p2;//栈char*p3="123456";//"1234......
  • AT_agc002_f [AGC002F] Leftmost Ball 思考--zhengjun
    思维+dp。如果像题意那样先放球再染色的话不是很好做。所以考虑有\(n\)个白球,\(n\)种其他颜色的球各\(k-1\)个。那么限制就是说对于每个前缀,白球的个数\(\ge\)其他颜色球的种数。所以就可以设\(f_{i,j}\)为放了\(i\)个白球,\(j\)种颜色的\(k-1\)个球的方案数。......
  • ch57x\ch58x开启仿真
    本次使用的平台是MounRiverStudio,使用的是WCH的CH582m与WCH-LinkE仿真之前确保LinkE处在Risc-V模式下 空闲时蓝灯常灭Step1:首先通过ISP工具开启两线仿真; Step2:点击下载选项会出来一个Debug的配置紧接着会出现再点击仿真开关即可。如果仍无法进入仿真:点击DebugCon......
  • CH58x\CH57x硬件SPI操作外部flash学习记录
    官方提供的58x的spi例程,spi主机模式下的发送方式有三种单字节发送,FIFO连续发送,DMA连续发送。本文分别对SPI0主机模式下三种发送模式进行使用。本次使用的是CH582m做为主机,W25Q64FV作为从机。一、单字节发送本次调试中实现对W25Q64FVflas进行读id,擦除,写入,读取。在进行主要操作......
  • CH57x/CH58x原理图与PCB绘制
    前言针对供电系统、天线系统、下载以及出现问题进行汇总。一、供电系统1、供电以CH582M举例(其他见芯片手册的第二十参数章节),芯片可供供电范围[2.3-3.6],一般给到芯片引脚(VIO33/VDD33)的供电典型值为3.3V,只需要给该引脚供电,其他引脚均不需要供电。2、内部电路内部电路注意VSW/......
  • CH58xFLASH操作
    一、描述读:从FLASH将数据赋值给buff;写:从buff将数据赋值给FLASH;DataFlash特点:擦/ERASE写/READ读/WRITE0.25KB(的倍数)/4KB(的倍数)1Byte/多个Byte/256Byte(的倍数,best)1Byte/多ByteCodeFlash特点:擦/ERASE写/READ读/WRITE4KB(的倍数)4Byte4Byte/256Byte(的倍......