学习ESP8266_14_任务

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了就会有上面的现象。

解释一下,本来想根据消息类型和参数,打印一些字符串信息,但是加入几个条件判断代码就多了,不如不加看清重点,所以就没加这段了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值