1、函数与任务
函数,调用就会执行。
任务,先给安排了,系统空闲时执行。
函数和任务,都是系统要做的事,就像是作业。
函数是课堂作业,立刻马上就要做。
任务是家庭作业,记下来带回去再做,就像你吃饱喝足空闲了再开始…
2 、任务
2.1、消息队列深度
设置消息队列的深度,也就是可以存放的任务个数。
用来记家庭作业的小本本有厚的有薄的,随你。
2.2、任务优先级
Non-OS SDK 最多只⽀持 3 个⽤户任务,优先级从低到高依次为 0、1、2。
身体是革命的本钱,只有三个科目的家庭作业。
优先级就是,到家打开小本本你要考虑,嗯,先做最欢的化学,再做数学,最后再写那些语文。
什么???今天全是语文,好吧,从第一项按顺序做吧。
2.3、任务不可被抢占/切换
non-OS SDK 不⽀持抢占任务或进程切换。
专注力是一种战斗力!
做作业要一项一项来,不可三心二意的。
3、任务
3.1、创建任务
API: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 为最低优先级 |
os_event_t *queue | 消息队列指针,安排任务的时候,存放参数 |
uint8 qlen | 消息队列深度,可以存放的任务数 |
//创建任务:任务执行函数,优先级,任务指针,消息队列深度
system_os_task(Chemistry_Task,USER_TASK_PRIO_0,Chemistry,MESSAGE_QUEUE_LEN);
3.2、安排任务
1、API:bool system_os_post (uint8 prio, os_signal_t sig, os_param_t par)
参数 | 含义 |
---|---|
uint8 prio | 任务优先级,与建⽴时的任务优先级对应 |
os_signal_t sig | 消息类型 |
os_param_t par | 消息参数 |
system_os_post(USER_TASK_PRIO_0,message_type,message_para);
化学老师布置作业,你记下:化学(
优先级最高),实验(类型),自制汽水(参数)。
2、安排的任务多了,超过消息队列的深度,会被丢弃。
老师可以布置很多家庭作业啊,那是他的自由,但是我的小本本就几页,写不下我就不记了,也就不做了。
3.3 执行任务
1、在系统空闲的时候,会从消息队列中调用任务来执行。
回去要先吃饭喝水,然后才能坐下来打开小本子(空闲),准备做作业(调用任务)。
2、任务内容
system_os_task中第一个参数所指向的函数,决定执行任务的内容。
//化学任务的内容
void Chemistry_Task(os_event_t * task_message)
{
os_printf("化学作业:类型=%d,参数=%c\r\n",task_message->sig,task_message->par);
}
自制汽水步骤如下:
凉白开:200ml
榨橙汁:300ml
白砂糖:2匙
小苏打:1.5g
柠檬酸:1.5g
倒入瓶中,拧紧瓶盖,摇匀,放入冰箱冷藏1小时。
4、代码
#define MESSAGE_QUEUE_LEN 3 //消息队列深度
os_event_t * Chemistry; //定义任务指针,"化学"
//化学任务的内容
void Chemistry_Task(os_event_t * task_message)
{
os_printf("化学作业:类型=%d,参数=%c\r\n",task_message->sig,task_message->par);
}
//*******************用户初始化函数**********************
void ICACHE_FLASH_ATTR user_init(void)
{
u8 task_num;
u8 message_type = 1; //消息类型
u8 message_para = 'A'; //消息参数
uart_init(115200,115200);
my_delay_ms(1000); //等待串口稳定,避免起始数据错误
//分配"化学"任务的内存 最多消息队列中三个任务全是"化学"
Chemistry = (os_event_t*)os_malloc((sizeof(os_event_t))*MESSAGE_QUEUE_LEN);
//创建任务:任务执行函数,优先级,任务指针,消息队列深度
system_os_task(Chemistry_Task,USER_TASK_PRIO_0,Chemistry,MESSAGE_QUEUE_LEN);
//安排任务
for(task_num=1;task_num<=4;task_num++){
system_soft_wdt_feed(); //喂狗,防止复位
my_delay_ms(500);
os_printf("\r\n安排任务%d\r\n",task_num);
system_os_post(USER_TASK_PRIO_0,message_type++,message_para++);
}
os_printf("\r\n安排任务完毕!\r\n");
}
5、记录一个Bug
上电后每次运行到任务都会打印Fatal exception 28这个致命错误,然后就不停地重启。
原因是os_printf的数据格式错了。
u8类型,用%d、%c打印都OK,但是我写成%s了就会有上面的现象。
解释一下,本来想根据消息类型和参数,打印一些字符串信息,但是加入几个条件判断代码就多了,不如不加看清重点,所以就没加这段了。