系统有关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消息参数。也都成功的传递了

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐