打印
[蓝牙芯片]

TMOS的消息发送的完整例程

[复制链接]
369|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
木木guainv|  楼主 | 2024-9-9 08:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 木木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 );
    • 参数说明:
      • len: 需要申请的内存长度,单位为字节。
    • 返回值:返回一个指向申请到的内存空间的指针,如果申请失败则返回NULL。
  • 内存释放函数
    • 功能描述:该函数用于释放已使用完毕的消息数据占用的内存空间。
    • 函数原型:bStatus_t tmos_msg_deallocate( uint8_t *msg_ptr );
    • 参数说明:
      • 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则负责接收并处理这条消息。通过这种方式,可以实现不同任务之间的数据交换和同步操作。


使用特权

评论回复
沙发
呐咯密密| | 2024-9-9 17:17 | 只看该作者
怎么移植到项目中,有没有开放这个资料

使用特权

评论回复
板凳
LEDyyds| | 2024-9-13 09:59 | 只看该作者
第一次听说TMOS这个操作系统

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

4040

帖子

5

粉丝