avatar

松果工作室

欢迎光临

  • 首页
  • freeRTOS
  • ESP
  • 开发手册
  • 快速笔记
  • 个人收藏
  • 工具
Home CH573(四) TMOS
文章

CH573(四) TMOS

Posted 2024-07-16 Updated 2024-09- 22
By YCP
19~25 min read

注意事项

  1. 每个任务包含16个事件,包括一个消息事件和15个自定义事件
  2. 事件以位的方式作ID
bit0bit1bit2...bit15
0/10/10/1...0/1
  1. 禁止中断中调用事件
  2. 如果使用了ble,建议不要在单个任务中执行超过连接间隔一半时长的任务,否则将影响蓝牙通讯

任务执行顺序

20210510204018685.png
因此可以看作每个创建的任务是实时的,为了实现这种实时性,把每个任务拆成几个事件,事件之间要有时间冗余。
在编程的时候,任务之间的延时就能用tmos_start_task(task_id_a,TASK_TMOS_EVT_TEST_A3,MS1_TO_SYSTEM_TIME(1000));延时启用下个任务实现了。
这样可以实现低功耗,不浪费CPU。
TMOS循环查询任务链表,根据任务ID确定优先级,越小越高

示例代码

#ifndef EXAM_H
#define EXAM_H

#include "CH57x_common.h"
#include "CH57xBLE_LIB.h"
#include "stdint.h"

#define TASK_TMOS_EVT_1   (0x0001<<0)
#define TASK_TMOS_EVT_2   (0x0001<<1)
#define TASK_TMOS_EVT_3   (0x0001<<2)
#define TASK_TMOS_EVT_4   (0x0001<<3)
#define TASK_TMOS_EVT_5   (0x0001<<4)

extern tmosTaskID  task_id_a;
extern tmosTaskID  task_id_b;

void exam_init_a();
void exam_init_b();

#endif // EXAM_H

#include "exam.h"

/****************************************************************************
* @brief		Task process one
* @details
****************************************************************************/
#define MESSAGE_LENGTH 200

uint32_t system_time = 0;
tmosTaskID  task_id_a = INVALID_TASK_ID;

uint16_t task_a( uint8_t task_id, uint16_t events ) {
    if(events & SYS_EVENT_MSG){
        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( task_id_b, msg ); // 发送消息到接收任务
        } else {
            PRINT("Failed to allocate memory for message\r\n" );
        }
        tmos_start_task(task_id_a,SYS_EVENT_MSG,MS1_TO_SYSTEM_TIME(1000));
        return events ^ SYS_EVENT_MSG;
    }
    if(events & TASK_TMOS_EVT_1) {
        system_time++;
        PRINT("system_time:%ld\r\n",system_time);
        tmos_start_task(task_id_a,TASK_TMOS_EVT_2,MS1_TO_SYSTEM_TIME(1000));
        return (events ^ TASK_TMOS_EVT_1);
    }
    if(events & TASK_TMOS_EVT_2){
        system_time++;
        PRINT("system_time:%ld\r\n",system_time);
        tmos_start_task(task_id_a,TASK_TMOS_EVT_3,MS1_TO_SYSTEM_TIME(1000));
        return (events ^ TASK_TMOS_EVT_2);
    }
    if(events & TASK_TMOS_EVT_3){
        system_time++;
        PRINT("system_time:%ld\r\n",system_time);
        tmos_start_task(task_id_a,TASK_TMOS_EVT_1,MS1_TO_SYSTEM_TIME(1000));
        return (events ^ TASK_TMOS_EVT_3);
    }
    return 0;
}

void exam_init_a(){
    task_id_a  = TMOS_ProcessEventRegister( task_a);
    tmos_set_event(task_id_a,SYS_EVENT_MSG);
}

/****************************************************************************
* @brief		Task process two
* @details
****************************************************************************/
tmosTaskID  task_id_b = INVALID_TASK_ID;
uint16_t task_b( uint8_t task_id, uint16_t events ) {
    if(events & SYS_EVENT_MSG){
        uint8_t *msg;
        uint8_t received_message[MESSAGE_LENGTH];
        msg = tmos_msg_receive( task_id_b ); // 接收消息
        if (msg != NULL) {
            tmos_memcpy( received_message, msg, MESSAGE_LENGTH ); // 将消息内容复制到本地缓冲区
            tmos_msg_deallocate( msg ); // 释放消息所占用的内存空间
            PRINT("Received message: %s\r\n", received_message); // 打印接收到的消息内容
            } else {
            PRINT("Failed to receive message\r\n" );
            }
        return events ^ SYS_EVENT_MSG;
    }
    if(events & TASK_TMOS_EVT_1) {
        system_time++;
        PRINT("6666\r\n");
        tmos_start_task(task_id,TASK_TMOS_EVT_2,MS1_TO_SYSTEM_TIME(1000));
        return (events ^ TASK_TMOS_EVT_1);
    }
    if(events & TASK_TMOS_EVT_2){
        system_time++;
        PRINT("6666\r\n");
        tmos_start_task(task_id,TASK_TMOS_EVT_3,MS1_TO_SYSTEM_TIME(1000));
        return (events ^ TASK_TMOS_EVT_2);
    }
    if(events & TASK_TMOS_EVT_3){
        system_time++;
        PRINT("6666\r\n");
        tmos_start_task(task_id,TASK_TMOS_EVT_1,MS1_TO_SYSTEM_TIME(1000));
        return (events ^ TASK_TMOS_EVT_3);
    }
    return 0;
}

void exam_init_b(){
    task_id_b  = TMOS_ProcessEventRegister( task_b);
    tmos_set_event(task_id_b,TASK_TMOS_EVT_1);
}

WCH
License:  CC BY 4.0
Share

Further Reading

OLDER

Airtag Tag

NEWER

一个未验证的查找陆地角度算法

Recently Updated

  • ESP32(八) 简单的webserver
  • ESP32(七) NVS
  • ESP32(四) STA & AP
  • 多级菜单
  • ESP32(五) ESP32 OTA

Trending Tags

WCH Linux Elec freeRTOS STM ESP Flutter Others SwiftUI

Contents

©2025 松果工作室. Some rights reserved.

Using the Halo theme Chirpy