本帖最后由 木木guainv 于 2024-9-9 08:32 编辑
TMOS是CH579/CH57x系列芯片中使用的一个非常轻量级的操作系统,主要用于蓝牙协议栈的管理。TMOS的核心是一个基于轮询的任务调度系统,并不支持抢占式任务管理。在实际应用中,消息发送是一个重要的功能,它允许不同的任务之间进行数据交换和同步操作。下面将详细展示一个TMOS消息发送的完整例程: - 消息发送函数
- 功能描述:该函数用于向指定的任务发送一个消息。
- 函数原型:bStatus_t tmos_msg_send( tmosTaskID taskID, uint8_t *msg_ptr );
- 参数说明:
- taskID: 目标任务的ID,消息将发送到这个任务。
- msg_ptr: 指向要发送的消息数据的指针。
- 返回值:函数返回一个状态码,表示操作是否成功。
- 消息接收函数
- 功能描述:该函数用于从当前任务接收一个消息。
- 函数原型:uint8_t *tmos_msg_receive( tmosTaskID taskID );
- 参数说明:
- taskID: 当前任务的ID,从这个任务接收消息。
- 返回值:返回一个指向接收到的消息数据的指针,如果没有消息则返回NULL。
- 内存申请函数
- 功能描述:该函数用于为消息数据申请内存空间。
- 函数原型:uint8_t *tmos_msg_allocate( uint16_t len );
- 参数说明:
- 返回值:返回一个指向申请到的内存空间的指针,如果申请失败则返回NULL。
- 内存释放函数
- 功能描述:该函数用于释放已使用完毕的消息数据占用的内存空间。
- 函数原型:bStatus_t tmos_msg_deallocate( uint8_t *msg_ptr );
- 参数说明:
- 返回值:函数返回一个状态码,表示操作是否成功。
示例代码以下是一个具体的例子,演示如何在一个任务中发送消息并在另一个任务中接收处理该消息: #include <stdint.h>
#include "CH57x_common.h"
#include "CH57xBLE_LIB.H"
#define SENDER_TASK_ID 0x01
#define RECEIVER_TASK_ID 0x02
#define MESSAGE_LENGTH 16
// 声明发送任务的事件处理函数
static uint16_t sender_task_process_event( uint8_t task_id, uint16_t events );
// 声明接收任务的事件处理函数
static uint16_t receiver_task_process_event( uint8_t task_id, uint16_t events );
void main()
{
// 注册发送任务和接收任务
TMOS_ProcessEventRegister( sender_task_process_event );
TMOS_ProcessEventRegister( receiver_task_process_event );
// 初始化系统时钟
TMOS_TimerInit( NULL );
// 开始主循环
while (1) {
TMOS_SystemProcess(); // 执行系统处理函数,进行任务调度
}
}
// 发送任务事件处理函数
static uint16_t sender_task_process_event( uint8_t task_id, uint16_t events ) {
if (task_id == SENDER_TASK_ID) {
if (events & (0x0001 << 0)) { // 判断事件是否触发
uint8_t *msg;
uint8_t message[MESSAGE_LENGTH] = "Hello, TMOS!";
msg = tmos_msg_allocate( MESSAGE_LENGTH ); // 申请内存空间
if (msg != NULL) {
tmos_memcpy( msg, message, MESSAGE_LENGTH ); // 复制消息内容到申请的内存空间
tmos_msg_send( RECEIVER_TASK_ID, msg ); // 发送消息到接收任务
} else {
// 内存申请失败处理
}
}
}
return 0;
}
// 接收任务事件处理函数
static uint16_t receiver_task_process_event( uint8_t task_id, uint16_t events ) {
if (task_id == RECEIVER_TASK_ID) {
if (events & (0x0001 << 0)) { // 判断事件是否触发
uint8_t *msg;
uint8_t received_message[MESSAGE_LENGTH];
msg = tmos_msg_receive( RECEIVER_TASK_ID ); // 接收消息
if (msg != NULL) {
tmos_memcpy( received_message, msg, MESSAGE_LENGTH ); // 将消息内容复制到本地缓冲区
tmos_msg_deallocate( msg ); // 释放消息所占用的内存空间
PRINT("Received message: %s\r
", received_message); // 打印接收到的消息内容
} else {
// 没有收到消息的处理逻辑
}
}
}
return 0;
}
以上代码展示了如何在TMOS系统中实现两个任务之间的消息传递。在这个例子中,sender_task负责生成并发送一条消息,而receiver_task则负责接收并处理这条消息。通过这种方式,可以实现不同任务之间的数据交换和同步操作。
|