任务的状态-挂起和恢复

任务可以通过等待信号量和消息、延时函数使自己挂起,系统开始调度运行其它任务OSTaskSuspend(5)。当然也可以通过相应的函数是自己恢复OSTaskResume(5)

延时函数:通过短延时OSTimeDly(n)和长延时函数OSTimeDlyHMSM(h,m,s,m)(最长11天)系统进入调度,延时完成后返回继续执行,也可通过STimeDlyResume(n)不经过延时完成随时恢复执行。

信号量:

1创建:OS_EVENT *sem=OSSemCreate(n) //参数n(0~65535的值,不同的值代表不同的意义)

2等待: value=OSSemAccept(sem);   //查看资源是否可以使用,返回信号量的值
       OSSemPend(sem,timeout,&err);//等待接收信号 才往下执行.任务timeout代表等待timeout个信号量后还没得到信号量,自动恢复运行状态,如果    timeout=0,表示无限等待信号量;   

3发送:OSSemPost(sem);//发送信号量

邮箱:用于任务间大数据量(共享数据)的数据传输。把一个指针定义的变量从一个任务传递到另一个或多个任务中去,等待邮箱的任务也是可以设置无限等待和等待若干个时钟节拍后任务自动恢复执行。

1创建:OS_EVENT * Come=OSMboxCreate((void *)0);//建立邮箱

2发送: u16 buffer="0x0FFF";//要发送的信息

    OSMboxPost(Come,&buffer);//通过邮箱发送信息(指针)给任务

3接收:u16 msg=OSMboxPend(Come,timeout,&err);//从指定邮箱com中获得信息指针即(指针msg指向buffer),若timeout=0为阻塞式,非0表示等待固定时钟周期后自动运行。

消息队列:其实是多个邮箱的数组,可以看做是个指针数组。用于处理有序的事件。

OS_EVENT *Com1 //定义一个指针

void *ComMsg1[3]; //定义一个指针数组

1创建:Com1=OSQCreate(&ComMsg1[0],3);//建立一个消息队列,即创建一个指针数组。(将数组指针的首地址赋值给com1) ,队列的个数为3

2发送: OSQPost(Com1,(void*)&st[0]);          //发送到队列即 *ComMsg1[0]指向数组st的首地址,同时队列消息数加一
       OSQPost(Com1,(void*)&aa[0]);         //发送到队列 
       OSQPost(Com1,(void*)&a1);             //发送到队列 

2接收: void *msg1=OSQPend(Com1,0,&err);获得指针数组里的第一个指针ComMsg1[0],该指针指向st[0].每调用一次OSQPend函数,该函数会将队列的消息减1,Com1指向下一个消息指针*ComMsg1[i++]。

 

转载于:https://www.cnblogs.com/jieruishu/p/4349990.html

实验报告三:(1)设计 Task0、Task1 两个任务任务 Task0 不断地挂起自己,再被任务 Task1 解挂,两个任务不断地切换执行,并输出两个任务在各个时刻的状态。Task0 的主要功能是显示 Task1 的状态,Task1 的主要功能是显示 Task0 的状态。整个应用的运行流程如图 1 所示,其描述如下:在 main 函数创建起始任务 TaskStart,其优先级为 0。TaskStart 任务主要完成创建 2 个应用任务 Task0、Task1,并挂起自己(不再被其它任务唤醒)。之后整个系统的运行流程如下:t1 时刻,Task0 开始执行,它运行到 t2 时刻挂起自己;t2 时刻,系统调度处于就绪状态的优先级最高任务 Task1 执行,它在 t3 时刻唤醒 Task0,后者由于优先级较高而抢占 CPU;Task0 执行到 t4 时刻又挂起自己,内核调度 Task1执行;Task1 运行至 t5 时刻再度唤醒 Task0; 注意:图中的栅格并不代表严格的时间刻度,而仅仅表现各任务启动和执行的相对先后关系。 (2)设计 MyTask、YouTask、KeyTask 三个任务:MyTask 任务输出 M;YouTask 任务输出 Y,并输出 MyTask 任务状态;KeyTask 任务从键盘接收字符 Y 或 N,当接收 Y 时挂起 MyTask 任务,当接收 N 时恢复 MyTask 任务。 (3)设计 KeyTask 任务,当从键盘输入+号时动态创建任务,最多可以创建 10 个任务,这 10个任务都执行一个函数 MyTask,要求优先级是(PRIO_BASE+0,1,2,3,4,5,6,7,8,9),还要向不同的任务传递不同的参数(0,1,2,3,4,5,6,7,8,9)给 MyTask 函数,优先级为(PRIO_BASE+0,1,2,3,4,5,6,7,8,9)的任务分别输出数字(0,1,2,3,4,5,6,7,8,9)。当从键盘输入-号时动态的删除刚创建的一个任务,最多可删除 10 个任务。提示:多个任务可以执行一个函数。运行结果如下图所示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值