目录
- 概述
- 任务初始化
- 任务的调度执行
- TMOS 处理事件方法
概述
CH32V 系列是基于青稞 32 位 RISC-V 设计的工业级通用微控制器,片上集成 2Mbps 低功耗蓝牙通讯模块,支持低功耗蓝牙 BLE5.x,低功耗蓝牙协议栈以及应用均基于 TMOS(Task Management Operating System),TMOS
是一个控制循环,通过 TMOS 可设置事件的执行方式。TMOS 作为调度核心,BLE 协议栈、profile 定义、所有的应用都围绕它来实现。TMOS 不是传统意义上的操作系统,而是一种以实现多任务为核心的系统资源管理机制。
任务初始化
为保证 TMOS 持续运行,需要在 main()的最后循环执行 TMOS_SystemProcess()。而初始化任务需要调用 TMOS_ProcessEventRegister 函数,将事件的回调函数注册到 TMOS 中,并生成唯一的 8 位任务 ID。不同的任务初始化后任务 ID 依次递增,而任务 ID 越小任务优先级最高。协议栈任务必须具有最高的优先级。 函数实现如下:
halTaskID = TMOS_ProcessEventRegister( HAL_ProcessEvent );
任务的调度执行
TMOS 通过轮询的方式进行调度,系统时钟一般来源于 RTC,单位为 625μs。用户通过注册任务(Task)将自定义的事件(Event)添加到 TMOS 的任务链表中,再由 TMOS 调度运行。在任务初始化完成之后,TMOS 就会在循环中轮询任务事件,事件的标志存储在 16 位变量中,其中每一位在同一任务中对应一个唯一的事件。标志位为 1 代表该位对应的事件运行,为 0则为不运行。TMOS 根据任务的优先级轮询其是否有事件需要执行,系统任务,如 2.4G 自动模式中发送结束自动接收应答和蓝牙中相关事务,拥有最高优先级。待系统任务执行完成,若存在用户事件则执行相应的回调函数。当一个循环结束之后,若还有时间空余,系统会进入空闲或睡眠模式。如下图:
TMOS 处理事件方法
每个Task 用户最多可以自定义 15 个事件,0x8000 为系统预留的SYS_EVENT_MSG
事件,即系统消息传递事件,不可被定义,在TMOS中定义如下:
// defined for all task
#define SYS_EVENT_MSG (0x8000) // A message is waiting event
我们以LED 闪灯消息为例,说明 TMOS 处理事件的通用代码格式,以 HAL 层的 HAL_LED_EVENT 事件为例,这里的 HAL_LED_EVENT 定义一个 LED闪烁 事件,在 HAL 层的任务初始化完成之后,在任务回调函数中添加事件 HAL_LED_EVEN,其基本格式如下:
1. if ( events & HAL_LED_EVENT )
2. {
3. //LED闪烁功能实现
4. return events ^ HAL_TEST_EVENT;
5. }
事件执行完成后需要返回对应的 16 位事件变量以清除事件,防止重复处理同一事件,
以上代码通过 return events ^ HAL_TEST_EVENT;清除了 HAL_TEST_EVENT 标志。