CH573(四) TMOS
注意事项
- 每个任务包含16个事件,包括一个消息事件和15个自定义事件
- 事件以位的方式作ID
bit0 | bit1 | bit2 | ... | bit15 |
---|---|---|---|---|
0/1 | 0/1 | 0/1 | ... | 0/1 |
- 禁止中断中调用事件
- 如果使用了ble,建议不要在单个任务中执行超过连接间隔一半时长的任务,否则将影响蓝牙通讯
任务执行顺序
因此可以看作每个创建的任务是实时的,为了实现这种实时性,把每个任务拆成几个事件,事件之间要有时间冗余。
在编程的时候,任务之间的延时就能用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);
}
License:
CC BY 4.0