UCOS为啥不能在多任务前打开节拍中断?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UCOS为啥不能在多任务前打开节拍中断?相关的知识,希望对你有一定的参考价值。
参考技术A 没有创建任务之前就打开了节拍中断,中断服务后在无任务状态下无法进行执行。最先创建的任务,无条件运行,所以要先建立一个初始化任务来打开节拍 参考技术B 但是总中断还是要关的吧,不然任务还没建立,怎么跑任务呢,那个时钟节拍中断就是任务切换用的,如果任务还没建立起来,也就是说任务的堆栈还没初始化,那任务指向哪里呢。本回答被提问者和网友采纳ucos源码分析--基础概念
资源:单片机上的每个外设,内存,乃至变量都是资源。
代码的临界区:指处理时不可分割的代码,一旦开始执行必须执行完毕,不可以后中断打断,所以在进入临界区时需要关闭中断,访问完临界区需要立即打开中断。
共享资源:可以被一个以上的任务占用的资源称为共享资源,为了防止数据出错,每个任务在使用共享资源的时候必须独占资源,即互斥访问。
任务:一个任务也被称为一个线程,是一个简单的程序,且在任务执行时该程序认为CPU完全属于该程序自己,每个任务都被赋予一定的优先级,有他自己的一套CPU寄存器和自己的栈空间。
多任务:在单片机上运行的多任务实际是靠CPU在许多任务之间转换、调度。CPU只有一个,轮番服务众多任务中的某一个任务。多任务可以使CPU的利用率达到最大发挥,也可以使应用程序模块化。在多任务的编程条件下,开发人员可以将很复杂的应用程序进行层次化,使用多任务应用程序也更加方便设计与维护。
任务切换:即上下文切换,也称为CPU寄存器内容切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,即CPU寄存器中的全部内容。这些内容保存在任务的当前状况保存区,也就是任务自己的栈区之中。入栈工作完成以后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。这个过程叫做任务切换。
内核:实时操作系统分为不可剥夺型内核与可剥夺型内核,ucosiii是可剥夺型内核。可以通过延时来实现切换任务,并且在中断任务完成后可以运行就绪任务队列中优先级最高的任务。
进程调度算法:ucosiii使用的是时间片轮番调度算法,当两个或两个以上的任务具有相同的优先级,内核允许一个任务运行事先确定的运行一定的时间,之后切换给另外的一个任务,这被称为时间片调度。ucosii不支持时间片轮番调度算法,因为ucosii中任务的优先级必须不相同,其使用的是任务优先级抢占式调度算法。
互斥条件:任务之间实现资源共享的最简便方式就是资源共享,这样虽然简化了任务间的信息交换,但是任务访问时必须保证互斥,以免竞争和数据的损坏,一般互斥的方法有:关中断、禁止任务切换、使用信号量。这里在源码中有实现的相关代码。
中断:中断是一种硬件机制,用于通知CPU有个异步事件发生了,中断一旦被识别CPU保存部分或者全部现场,也就是寄存器的值,跳转到中断子程序中,处理完中断子程序后程序根据内核类型恢复到对应的程序继续运行,在UCOSiii中是回到就绪队列中优先级最高的任务开始运行。为了保证实时操作系统的实时性,我们在执行关中断的时间应该尽量短。
中断延时:实时性内核最重要的指标就是中断关了多长时间,所有的实时系统在进入临界区代码段之前都要关中断,执行完临界区代码后开中断。关中断的时间越长,中断的延迟就越长,中断延迟 = 关中断的最长时间 + 开始执行中断服务子程序的第一条指令的时间。
中断响应:中断响应是中断发生到开始执行用户的中断服务子程序来处理这个中断的时间。中断响应包括开始处理这个中断前的时间。不可剥夺内核:中断响应时间 = 中断延迟 + 保存CPU内部寄存器的时间,可剥夺内核:中断响应 = 中断延迟 + 保存CPU内部寄存器的时间 + 内核的进入中断服务。
中断恢复时间:中断恢复时间是处理器返回到被中断的程序所需要的时间。恢复CPU内部寄存器的时间和执行中断返回指令的时间,对于可剥夺内核来说还需要判断是否有更高优先级的任务进入了就绪状态。
以上是关于UCOS为啥不能在多任务前打开节拍中断?的主要内容,如果未能解决你的问题,请参考以下文章
在ucos中 我使用了CAN的接受中断 程序就一直执行中断,不去执行任务,然后不喂狗超时重启,这个怎么解决
在ucos中任务之间是如何切换的?l例如建立两个任务。任务A正在运行如何切换到任务B?