任务挂起和中断

今天看uc/os分不清任务挂起和中断的概念,于是猛找资料,终于有了点心得。

挂起:

所谓挂起一个任务,就是暂停这个任务运行,它仍然占用一定的内存空间,有可能对CPU也在占用着.

示意如图

任务切换宏OS_TASK_SW()

任务切换的工作主要是靠OSCtxSw()来完成的。它需要做7项工作:

(1) 把被终止任务的断点指针保存到任务堆栈中;

(2) 把CPU通用寄存器的内容保存到任务堆栈中;

(3) 把被终止任务的任务堆栈指针当前值保存到该任务的任务控制块的OSTCBStkPt中

(4) 获得待运行任务的任务控制块;

(5) 使CPU通过任务控制获得待运行任务的堆栈指针;

(6) 把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中;

(7) 使CPU获得待运行任务的断点指针。

示意代码:

viod OSCtxSw(void)

{

用压栈指令把CPU通用寄存器R1,R2..压入堆栈;

OSTCBCur->OSTCBStkPtr = SP; //在中止任务控制块中保存SP

OSTCBCur = OSTCBHighRdy; //任务控制块的切换

OSPrioCur = OSPrioHighRdy;

SP = OSTCBCur->OSTCBStkPtr;

用出栈指令把R1,R2..弹入CPU的通用寄存器;

IRET; //中断返回,使PC指向待运行的任务

}

当然OSSemPend()等待信号量等一系列函数也使任务进入等待状态,但是任务挂起函数OSTaskSuspend()可以挂起当前任务,也可以挂起其他任务;而等待信号量OSSemPend()只能挂起当前任务,而且可以多个任务等待同一个信号量,实现任务的同步;

OSSemPend()主要是判断待要挂起的任务是否调用这个函数任务本身。

(1) 如果是任务本身是,则必须删除就绪表中的就绪标志,并在任务控制成员OSTCBStat中做挂起记录,然后引发一次任务调度,以使CPU去运行就绪的其他任务;

(2) 如果不是本身,那么只要删除任务就绪表中被挂起任务的就绪标志,并在任务控制块成员OSTCBStat中做挂起标志。

任务中断

系统接收到中断请求后,如果这是CPU处于中断允许状态(即中断是开放的),系统就会终止正在运行的当前任务,而按照中断向量(中断服务子程序的入口地址)的指向转而去运行中断服务子程序(ISR);当子程序运行完毕后,系统会根据情况返回到被中止的任务继续运行,或者转而运行一个更高优先级的就绪任务。

实验报告三:(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 个任务。提示:多个任务可以执行一个函数。运行结果如下图所示。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值