学习日记——ESP8266TASK设置(2020.5.21)
系统有关TASK的API1、system_os_task功能:创建系统任务,最多⽀持创建 3 个任务,优先级分别为 0/1/2函数定义boolsystem_os_task(os_task_ttask,uint8prio,os_event_t*queue,uint8qlen)参数• os_task_ttask:任务函数• uint8prio:任务优先级,可为 0/1/2;0 为最低优先级。这表示最多
系统有关TASK的API
1、system_os_task
- 功能:创建系统任务,最多⽀持创建 3 个任务,优先级分别为 0/1/2
- 函数定义
bool system_os_task(
os_task_t task,
uint8 prio,
os_event_t *queue,
uint8 qlen
)
- 参数
• os_task_t task:任务函数
• uint8 prio:任务优先级,可为 0/1/2;0 为最低优先级。这表示最多只⽀持建⽴ 3 个任务
• os_event_t *queue:消息队列指针
• uint8 qlen:消息队列深度 - 示例
#define SIG_RX 0
#define TEST_QUEUE_LEN 4
os_event_t *testQueue;
void test_task (os_event_t *e)
{
switch (e->sig)
{
case SIG_RX:
os_printf(sig_rx %c/n, (char)e->par);
break;
default:
break;
}
}
void task_init(void)
{
testQueue=(os_event_t *)os_malloc(sizeof(os_event_t)*TEST_QUEUE_LEN);
system_os_task(test_task,USER_TASK_PRIO_0,testQueue,TEST_QUEUE_LEN);
}
2、system_os_post
- 功能:向任务发送消息
- 函数定义
bool system_os_post (
uint8 prio,
os_signal_t sig,
os_param_t par
)
- 参数
• uint8 prio:任务优先级,与建⽴时的任务优先级对应。
• os_signal_t sig:消息类型
• os_param_t par:消息参数 - 返回
true:成功
false:失败 - 示例
void task_post(void)
{
system_os_post(USER_TASK_PRIO_0, SIG_RX, ‘a’);
}
//打印输出 sig_rx a
程序撰写步骤
1、在创建任务和给系统安排任务之前,我们需要设置消息队列深度。
#define MESSAGE QUEUE LEN 2//消息队列深度(对于同一个任务,系统最多接受的叠加任务数)
2、定义任务指针
os_ event_ t * Pointer_ Task_ 1 ; // 定义任务1 (串口打印任务)
3、为任务分配内存
给任务1分配空间(任务1空间= 1个队列空间*队列数)
Pointer_ Task_1=(os_ event_ t*) os_ ma | |oc((sizeof (os_ event_ t)) *MESSAGE_ QUEUE_ LEN) ;
4、创建任务函数
任务执行函数(形参:类型必须为[os_ event. _t *] )
void FuneTask 1(os event t * Task message) // Task message = Pointer. Task 1
5、执行创建任务API
创建任务(参数1=任务执行函数/参数2=任务等级/参数3=任务空间指针1参数4=消息队列深度)
system os task (Func_ Task_ 1, USER TASK PR1O 0, Pointer. Task 1. MESSAGE QUEUE LEN) ;
6、给系统安排任务
调用任务(参数1=任务等级1参数2=消息类型…参数3=消息参数)
注意:参数3必须为无符号整数,否则需要强制类型转换
system_ os_ post USER TASK PR1O C Message_ Type++, Message_ Para++):
7、执行任务函数(当系统空闲的时候)
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) ;
}
8、撰写user init
void ICACHE_ FLASH_ ATTR user init(void)
{
u8C_Task=0;//调用任务计数
u8 Message_ Type = 1; // 消息类型
u8 Message_ Para = 'A'; //消息参数
uart_ init (115200, 115200); // 初始化串口波特率.
os_ delay_ us (10000) ;//等待串口稳定
os_ printf("\t Project:\t%s\r\n", ProjectName) ;
os_ printf("\t SDK vers ion: \t%s",system_ get_ sdk_ version()) ;
}
/给任务分配空间
/创建任务
//调用4次任务
for (C_ Task=1; C_ _Task<=4; C_ _Task++)
{
system_ soft_ _wdt_ feed(); //喂狗,防止复位
delay_ ms (1000) ;// 延时1秒
os_ pr intf ("\r\n安排任务: Task == %d\r\n", C_ Task) ;
/每次循环给系统安排一个任务(安排任务)
}
现象(实话说这个现象比较难调,因为这里面得关系比较复杂,需要多看几次视频以及博客)
由串口打印得结果可得,给系统安排了四次任务,分别是安排任务Tack=1/安排任务TACK=2/安排任务Tack=3/安排任务Tack=4.但是系统没有立即执行任务函数。而是等到系统空闲了才执行任务函数。这里给任务安排了四次任务。我们设置消息队列深度定义得是2.所以说当系统执行任务函数得时候只保留了前两次的任务,第三第四次任务被丢弃。而且我们可以看到安排任务是传递的参数2消息类型,参数3消息参数。也都成功的传递了
更多推荐
所有评论(0)