学习记录
ESP8266 01S 任务
任务与函数的区别
函数:立即执行
任务:系统空闲时执行
api说明
API
给系统安排任务。
消息队列
#define MESSAGE_QUEUE_LEN 2 // 消息队列深度(对于同一个任务,系统最多接受的叠加任务数)
若已经安排了第一个任务,在任务执行之前,又给系统安排了第二个任务,系统是否接受任务取决于消息队列深度。
若深度为2,那么若已经安排了第一个任务, 它会接受第二个任务。当系统空闲时,依次执行。
若深度为2,那么若已经安排了两个任务, 它会丢弃三个任务。只执行前两个任务。
定义任务
// 全局变量
//=========================================================
os_event_t * Pointer_Task_1 ; // 定义任务1(串口打印任务) // 第①步:定义任务指针
//=========================================================
结构体 os_event_t定义如下,有两个参数。
typedef struct ETSEventTag ETSEvent;
struct ETSEventTag {
ETSSignal sig;
ETSParam par;
};
创建任务
// 给任务1分配空间(任务1空间 = 1个队列空间 * 队列数) // 第②步:为任务分配内存
//-------------------------------------------------------------------------------
Pointer_Task_1=(os_event_t*)os_malloc((sizeof(os_event_t))*MESSAGE_QUEUE_LEN);
//计算大小,乘以深度,申请空间,类型转换,赋值
// 创建任务(参数1=任务执行函数
// 参数2=任务等级
// 参数3=任务空间指针
// 参数4=消息队列深度)
// 第④步:创建任务
//-----------------------------------------------------------------------------------------
system_os_task(Func_Task_1, USER_TASK_PRIO_0, Pointer_Task_1, MESSAGE_QUEUE_LEN);
//创建任务API
// 调用4次任务
//--------------------------------
for(C_Task=1; C_Task<=4; C_Task++)
{
system_soft_wdt_feed(); // 喂狗,防止复位
delay_ms(1000); // 延时1秒
os_printf("\r\n安排任务:Task == %d\r\n",C_Task);
// 调用任务(参数1=任务等级 / 参数2=消息类型 / 参数3=消息参数)
// 注意:参数3必须为无符号整数,否则需要强制类型转换
//---------------------------------------------------------------
system_os_post(USER_TASK_PRIO_0, Message_Type++, Message_Para++); // 第⑤步:给系统安排任务
}
任务执行函数
// 任务执行函数(形参:类型必须为【os_event_t *】) // 第③步:创建任务函数
//======================================================================================
void Func_Task_1(os_event_t * Task_message) // Task_message = Pointer_Task_1
{
// Task_message->sig=消息类型、Task_message->par=消息参数 // 第⑥步:编写任务函数(根据消息类型/消息参数实现相应功能)
//--------------------------------------------------------------------------------
os_printf("消息类型=%d,消息参数=%c\r\n",Task_message->sig, Task_message->par);
}
//======================================================================================
注意事项
- 创建系统任务,最多⽀支持创建 3 个任务,优先级分别为 0/1/2。0 为最低优先级。
- system_os_post()调用任务。• uint8 prio:任务优先级,与建⽴立时的任务优先级对应。• os_signal_t sig:消息类型。• os_param_t par:消息参数
- 超过消息队列深度的任务会被丢弃
- 使用os_malloc需加入头文件,#include “mem.h” // 内存申请等函数。