ucos优先级位图算法分析

合集下载

嵌入式实时操作系统试题

嵌入式实时操作系统试题

1、目前使用的嵌入式操作系统主要有那些?请举出六种常用的。

Windwos CE、Windows Mobile、VxWork、Linux、uCos、Symbian、QNX2、一般而言,嵌入式系统的架构可以分为4个部分,分别是(处理器)、存储器、输入输出和软件,一般软件分为(操作系统)和应用软件两个主要部分。

3、从嵌入式操作系统特点可以将嵌入式操作系统分为(实时操作系统)和分时操作系统,其中实时系统可分为(硬实时系统)和软实时系统4、uc/os操作系统不包括以下哪集中状态A、运行B、挂起C、退出D、休眠5、0x70&0x11的运算结果是A、0x1B、0x11C、0x17D、0x76、下列哪种方式不是ucos操作系统中任务之间的通信方式A、信号量B、消息队列C、邮件D、邮箱7、在将ucos操作系统移植到ARM处理器上时,以下那些文件不需要修改A、OS_CORE.CB、include.hC、OS_CPU.HD、OSTaskInit设计实时操作系统时,首先应该考虑系统的()。

A.可靠性和灵活性B.实时性和可靠性C.分配性和可靠性D.灵活性和实时性2. 大多数嵌入式实时操作系统中,为了让操作系统能够在有突发状态时迅速取得控制权,以作出反映,大都采用()的功能。

A:抢占式任务调度B:时间片轮转调度C:单调速率调度D:FIFO调度8、所有的电子设备都属于嵌入式设备简单题:1、根据嵌入式系统的特点、写出嵌入式系统的定义答:以应用为中心,以计算机技术为基础,软硬件可裁剪、功能、可靠性、成本、体积、功耗严格要求的专用计算机系统2、试分析实时操作系统的工作特点及相互之间的转换运行:获得CPU的控制权就绪:进入任务等待队列,通过调度中转为运行状态挂起:由于系统函数调用而被设置成挂起状态,任务发生阻塞,等待系统实时事件的发生而被唤醒,从而转为就绪或运行。

休眠:任务完成或者错误被清除的任务,该任务此时不具有任务控制块。

第30讲UCOSII入门

第30讲UCOSII入门

30.1 UCOSII 简介
30.1.1 30.1.2 30.1.3 30.1.4 30.1.5 30.1.6 UCOSII背景知识 UCOSII体系结构 UCOSII基本概念 UCOSII的初始化和启动 UCOSII常用任务管理函数 UCOSII时间管理
广州星翼电子
官方淘宝店:
广州星翼电子 官方淘宝店: 技术支持论坛:
《原子教你玩STM32》系列视频
30.1.2 UCOSII体系结构
用户应用程序
UCOSII
UCOSII与处理器无关的代码 ucos_ii.h ucos_ii.c os_tmr.c os_time.c os_task.c os_sem.c os_q.c os_mutex.c os_mem.c os_mbox.c os_flag.c os_core.c
广州星翼电子
官方淘宝店:
技术支持论坛:
《原子教你玩STM32》系列视频
广州星翼电子
官方淘宝店:
技术支持论坛:
《原子教你玩STM32》系列视频
任务控制块OS_TCB
用来记录任务堆栈指针,任务当前状态以及任务优先级等任务 属性。UCOSII的任何任务都是通过任务控制块(TCB)的东西 来控制的,一旦任务创建了,任务控制块OS_TCB就会被赋值。 每个任务管理块有3个最重要的参数:1,任务函数指针;2, 任务堆栈指针;3,任务优先级;任务控制块就是任务在系统 里面的身份证(UCOSII通过优先级识别任务),任务控制块我 们就不再详细介绍了,详细介绍请参考任哲老师的《嵌入式实 时操作系统UCOSII原理及应用》一书第二章。
UCOSII与应用程序 相关代码 os_cfg.h includes.h
UCOSII与处理器相关的代码(移植时需要修改) os_cpu.h os_cpu_a.asm os_cpu_c.c

ucos ii优先级反转问题

ucos ii优先级反转问题

在这里先假高已经创建了三个不同优先级的任务,任务0的优先级为5,任务1的优先级为6,任务2的优先级为7;在main()函数里创建一个二值信号量;mutex=OSSemCreate(1);函数OSSemCreate()的参数值的范围为:0~65535;下面例子已经在程序里安排好时序了。

每个任务里都有足够长的延时。

任务0与任务2一起使用这个二值信号量;任务1只执行打印输出语句;当任务2在使用这个二值信号量时,任务1与任务0都处于就绪态,任务2的程序执行到延时挂起时,任务0就会被系统调度执行。

执行到申请信号量的函数OSSemPend()时,由于该二值信号量正被任务2使用,所以任务0没有申请到该资源,因而任务0被阻塞,然后被系统挂起,系统再次进行任务调度,此时任务1的优先级最高,所以任务1就会进入运行态。

当任务1被挂起时,就算任务0已经处于就绪态,但仍然要等任务2释放这个二值信号量才到运行。

这样就出现了,当一个共享资源被低优先级占用时,高优先级就得等这个低优先级的任务释放这个共享资源时才能进入运行态。

所以在上面出现了,任务1与任务2的优先级都比任务0的优先的情况。

这就是优先级反转问题。

下面补充一些资料--摘自uC_OS-II内核实验指导书:1、OSSemCreate ();该函数建立并初始化一个信号量,信号量的作用如下:允许一个任务和其他任务或者中断同步取得设备的使用权标志事件的发生函数原型:OSSemCreate(INT16U value);参数说明:value是所建立的信号量的初始值,可以取0到65535之间的任意值。

返回值:OSSemCreate()函数返回指向分配给所建立的信号量的控制块的指针。

如果没有可用的控制块,OSSemCreate()函数返回空指针。

2、OSSemPend()该函数用于任务试图取得设备的使用权、任务需要和其他任务或中断同步、任务需要等待特定事件的发生场合。

如果任务调用OSSemPend()函数时,信号量的值大于零,OSSemPend()函数递减该值并返回该值。

ucOS-II 入门教程好好学

ucOS-II  入门教程好好学

嵌入式实时操作系统μC/OS-II讲座北华大学任哲2006 广州为什么要学习μC/OS-II一.凡从事嵌入式系统开发工作的人,必须对嵌入式操作系统有足够的了解。

二.对于初学者,从μC/OS-II开始是个明智的选择。

1. μC/OS-II麻雀虽小,却五脏基本全(它是个微内核)。

2.可以学习实时系统的一些编程技巧。

3.可以把在学校中学到的操作系统抽象概念具体化。

4.具有很强的实用性。

5.学习数据结构应用的好例子。

讲座的主要内容一.计算机操作系统的基本概念二.操作系统中常用的数据结构三.并发操作系统的概念四.任务的要素五. μC/OS-II的任务管理(任务调度)六. μC/OS-II的中断和时钟七. μC/OS-II的任务的同步与通信八. μC/OS-II的存储管理九.硬件抽象层和测试台什么是计算机操作系统(Operating System,OS)•操作系统是一种为应用程序提供服务的系统软件,是一个完整计算机系统的有机组成部分。

•从层次来看,操作系统位于计算机硬件之上,应用软件之下。

所以也把它叫做应用软件的运行平台。

•它在计算机应用程序与计算机硬件系统之间,屏蔽了计算机硬件工作的一些细节,并对系统中的资源进行有效的管理。

•通过提供函数(应用程序接口(API )),从而使应用程序的设计人员得以在一个友好的平台上进行应用程序的设计和开发,大大地提高了应用程序的开发效率。

计算机操作系统的作用从用户的角度来看,它就是一大堆函数(API 和系统函数),用户可以调用(普通调用或系统调用)它们来对系统资源进行操作。

计算机硬件用汇编语言编写的硬件抽象层高级语言的接口应用软件操作系统操作系统计算机操作系统的功能处理器的管理存储管理网络和通信的管理I/O 设备管理文件管理任务管理任务表存储分配表文件目录设备表总之,需要一大堆表的数据结构(数组)数组1。

同一数据类型数据的集合;2。

占用连续内存空间;3。

其中的所有元素名称都相同,但每个元素都有一个编号;4。

嵌入式系统中的实时操作系统调度算法

嵌入式系统中的实时操作系统调度算法

嵌入式系统中的实时操作系统调度算法嵌入式系统是一种特殊的计算机系统,其设计目标是在特定的应用领域内提供高度可靠和实时的性能。

实时操作系统(RTOS)是嵌入式系统中常用的操作系统类型,它以管理任务和资源的方式为应用程序提供服务。

实时操作系统中的任务调度算法起着至关重要的作用,它们决定了任务执行的顺序和优先级,直接影响系统的实时性能和稳定性。

实时操作系统中常用的任务调度算法包括时间片轮转调度(Round-Robin Scheduling)、优先级调度(Priority Scheduling)、最早截止时间优先调度(Earliest Deadline First Scheduling)等。

每种调度算法都有其自身的特点和适用场景,下面将逐一进行介绍。

1. 时间片轮转调度算法时间片轮转调度算法是实时操作系统中最常见的调度算法之一。

它基于任务的优先级,为每个任务分配一个固定长度的时间片,并按顺序轮流执行任务,每个任务在一个时间片内执行完毕后转移到下一个任务。

当时间片用尽时,下一个任务将获得执行机会。

这种调度算法保证了每个任务的执行时间相对均匀,避免了某个任务霸占资源而导致其他任务无法运行的情况。

时间片轮转调度算法适用于任务的执行时间相对较短和相对平衡的场景,对于响应时间要求较高的实时系统非常有效。

然而,当任务的执行时间差异较大或任务的数量过多时,时间片轮转调度算法可能会导致任务响应时间的不确定性,不适用于要求确定性响应时间的实时系统。

2. 优先级调度算法优先级调度算法是一种简单而直观的调度算法,它为每个任务分配一个优先级,并按照优先级顺序进行调度,具有较高优先级的任务将优先执行。

在实时操作系统中,任务的优先级通常由开发者根据任务的重要性、对实时性的要求和资源的需求等因素进行设定。

优先级调度算法适用于对任务执行时间要求相对灵活的实时系统。

这种调度算法在任务完成时间较长的情况下可以保证重要任务先执行,但是如果任务的数量过多或优先级设置不当,可能会导致低优先级任务长时间等待的情况,从而影响系统的实时性。

ucos+lwip应用心得

ucos+lwip应用心得

ucos+lwip应用心得UC/OS和lwIP是两个广泛应用于嵌入式系统中的软件库,UC/OS是一种实时操作系统,而lwIP是一种轻量级的TCP/IP协议栈。

在将它们应用到嵌入式系统中时,我得到了一些经验和教训,下面是我总结的一些心得。

首先,对于UC/OS的应用,我发现了以下几点。

首先,UC/OS的任务调度机制相对简单,只有优先级调度,因此在设计任务时要注意任务的优先级设置,以确保高优先级任务能够及时响应。

其次,UC/OS提供了一些常用的同步和通信机制,如信号量、消息队列等,可以有效地实现不同任务之间的协作。

最后,在多任务编程中,要注意避免资源竞争和死锁等问题,可以使用UC/OS提供的互斥锁和事件标志等机制来解决。

对于lwIP的应用,我也有一些心得体会。

首先,lwIP提供了一套完整的TCP/IP协议栈,具有较小的内存占用和较高的性能,适用于嵌入式系统的资源受限环境。

在使用lwIP时,需要根据系统资源的情况进行相应的配置,以减小内存占用并提高性能。

其次,lwIP支持多种网络接口和协议,如以太网、PPP等,可以根据实际需求选择适当的接口和协议。

最后,在使用lwIP时,要注意处理网络异常和错误,如连接断开、超时等情况,可以通过适当设置超时时间和错误处理机制来增加应用的稳定性。

综上所述,UC/OS和lwIP是在嵌入式系统中广泛应用的软件库,它们分别提供了实时操作系统和TCP/IP协议栈的功能。

在使用它们时,需要注意任务调度、资源竞争、网络配置等问题,以提高应用的性能和稳定性。

通过对UC/OS和lwIP的深入理解和实践,可以更好地应用它们到项目中,完成嵌入式系统的开发。

ucosiii处理调度器锁信号量问题

ucosiii处理调度器锁信号量问题

ucosiii处理调度器锁信号量问题
在uC/OS-III中,处理调度器锁和信号量之间的问题主要涉及
两个方面:处理调度器锁的优先级继承和信号量的使用。

首先,处理调度器锁的优先级继承问题。

在uC/OS-III中,任
务在执行期间需要屏蔽任务切换,以保证任务的原子性操作。

处理调度器锁可以用来实现这一点。

例如,在临界区内部使用处理调度器锁,可以禁止其他优先级高于当前任务的任务进行切换,从而保护关键数据的操作。

然而,当任务在执行临界区内部等待某个信号量时,需要考虑到优先级继承的问题。

优先级继承是指当一个任务在等待一个资源(如信号量)时,该任务的优先级被提升到最高等待该资源的任务的优先级。

这是为了保证资源的及时分配和避免优先级反转问题。


uC/OS-III中,可以使用处理调度器锁实现优先级继承。

另外,信号量的使用也需要注意。

信号量是一种用来同步和互斥共享资源的机制。

在uC/OS-III中,可以使用信号量来实现
任务之间的同步和互斥。

例如,一个任务可以等待某个信号量,直到该信号量变为可用,然后再继续执行。

另一个任务可以通过释放信号量来通知等待该信号量的任务可以继续执行。

在使用信号量时,需要注意正确的使用方法,以避免死锁和竞态条件等问题。

综上所述,处理调度器锁和信号量的问题在uC/OS-III中是非
常重要的,需要根据具体的应用场景和需求来进行合理的设计
和使用。

在使用处理调度器锁和信号量时,需要考虑到优先级继承和正确的使用方法,以确保系统的正确性和可靠性。

ucos多任务调度的基本原理

ucos多任务调度的基本原理

ucos多任务调度的基本原理题目:ucos多任务调度的基本原理引言:在嵌入式系统中,任务调度是一个重要而复杂的问题。

为了实现多任务的并发执行,实时操作系统(RTOS)ucos提供了一种成熟而高效的多任务调度方案。

本文将介绍ucos多任务调度的基本原理,包括任务管理、任务优先级、时间片轮转和中断处理等方面,以帮助读者更好地理解和应用ucos。

一、任务管理在ucos中,任务是系统中最基本的执行单位。

ucos的任务管理分为任务创建、任务删除和任务切换几个步骤。

1. 任务创建:ucos通过函数OSTaskCreate来创建任务。

该函数包括了任务的入口函数、任务的堆栈大小和任务的优先级等参数。

在任务创建过程中,ucos为任务分配堆栈空间,并把任务插入到任务就绪表中。

2. 任务删除:当任务完成了它的工作或者不再需要执行时,可以通过函数OSTaskDel来删除任务。

任务删除时,ucos会释放任务占用的资源,并将任务从任务就绪表中移除。

二、任务优先级ucos支持任务的优先级调度,即不同优先级的任务有不同的执行顺序。

优先级越高的任务会先于优先级较低的任务执行。

1. 任务优先级范围:ucos的任务优先级范围是0到ucos最大任务数减1(通常为256)。

优先级为0的任务为最高优先级任务,优先级为ucos 最大任务数减1的任务为最低优先级任务。

2. 任务的优先级设置:任务的优先级可以在任务创建的时候通过函数OSTaskCreate来设置,也可以在运行时通过函数OSTaskChangePrio来修改。

3. 任务的优先级比较和切换:ucos将优先级比较和任务切换过程放在了任务调度中,当有多个任务就绪时,ucos会选择优先级最高的任务执行。

任务调度过程是由ucos内核中的调度器负责的。

三、时间片轮转在ucos中,为了保证不同优先级任务的公平性和实时性,采用了时间片轮转的调度算法。

1. 时间片:时间片是指任务在一次调度中执行的时间。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Ucos优先级位图算法详解By lynn/liuyunjay66 1. ucos任务相关简介在实时操作系统中,由于系统不可能太庞大,因此任务数量也不会太大,ucos中共有64个优先级(0~63级,数字越小优先级越高)。

因为是实时系统,所以对应每个任务就分配一个优先级。

2.二进制和十进制的转换数学基础这里先介绍一个数学知识,二进制如何变为十进制,比如十进制26,其8位二进制表示为:00011010。

当十进制为0~63时,前两位无作用,所以只看后6位,011 010.怎么计算成十进制呢?很简答:如下所示这个过程就是,把这个十进制数,分为两个部分,高三位和低三位,这个十进制数的大小就等于高三位的十进制*8+第三位的十进制数。

高三位的011=3 ,低三位的010=2.所以26=3*8+2.=(011)<<3+(010).即将高三位左移三位就是*8再加上低三位。

所以下面要介绍的算法也是这个数学方法。

3..整个过程的流程1.创建任务并分配优先级2.通过算法,操作系统对创建了的任务即就绪任务进行标记。

并通过标记来查找当中任务中优先级最高的任务3.调用调度函数进行调度,让最高优先级任务运行。

3..1任务的优先级怎么创建的。

我们先来看一下,ucos中创建任务的函数原型:INT8U OSTASKCeate(void (*task)(void *pd),void *pdata,os_stk *ptos,INT8U prio),从这个函数可以看出,最后一个参数就是优先级,所以结论是,在创建任务的同时就要确定任务的优先级,并且是该优先级是8位的(0~2^8-1),这里也可以看出为什么会有64个优先级。

因为用户可以指定任务的优先级,但实时操作系统最大的好处就是高优先级的任务可以抢占低优先级的任务,那怎么实现的呢?通过优先级实现既然用户在调用系统函数创建任务的同时指定了任务的优先级,一旦创建了任务,该任务就会立即成为就绪状态,操作系统就会将该任务的优先级标志位置位,相当于做个记号,操作系统心里就会想,哦,这个优先级的任务已经就绪了,同样创建了其他的任务,操作系统都会在某个地方做好标记表明对应优先级的任务已经就绪,然后在调度函数的调度下进行调度,那么在哪个地方做个标记呢?既然是实时操作系统,操作系统考什么算法去查找优先级最高的任务呢?3.2 ucos怎么实现就绪状态任务优先级的标定什么是优先级的标定:就是操作系统要知道哪个任务已经就绪了,然后就在这些就绪了的任务里面切换调度。

所以第一步就是要知道哪些任务就绪了,然后就可以操作了。

这里要先介绍两个数据结构,:OSRdyGrp、OSRdyTbl[]。

这两个变量协同完成优先级的标定。

OSRdyGrp:优先级就绪组这是一个8位的变量。

每一个变量对应于OSRdyTbl[]中的一行(实际上是一个元素,但也可以理解为一行)。

OSRdyTbl[]:优先级就绪表这是一个数组,有8个成员,每个成员都是8位的变量,所以就可以构成了8*8的矩阵了。

所以64个优先级都是标定在这个数组中的。

他们的关系如图:从上图可以明显看出,这个图有64个空格(64个位),每个空格对应一个数字,该数字就是优先级的标号,但是这个是人为的标上的,实际上这是64个空格,现在要做的事情就是将就绪任务的优先级相对应的标号置1,表示这个优先级任务就绪了,比如刚创建了一个任务,它的优先级是7,所以往表格中数字为7的空格写入1.就表明该优先级的任务就绪了,可以被调度了。

另外当所有需要创建任务都创建完毕后,各个就绪任务的相应数字空格都会置1,表明这些任务都就绪了,比如,现在创建了5个任务,优先级分别为4,7,9,10,24.所以在创建完这些任务后,这个优先级就绪表中的相对应的数字空格都会被置1.要特别注意上图的优先级顺序,0的优先级最高,63的优先级最低。

那到底怎么往空格里置1的呢?这里就要分析这个优先级就绪表了,1.这个表的数据结构是数组,也就是说,这个数组有8个成员,每个成员都是8位的变量。

2.是通过二级查找实现对就绪任务的标定的。

这里可以理解为一个矩阵,找某个数,肯定是先找行,再找列。

从而找到这个元素位置。

思想就是这个。

怎么找行呢?这里的一个变量OSRdyGrp,是一个8位的变量。

每一位对应上图的一行,当某一位置1时,就表明就绪表对应的行有就绪任务,然后再查找列,就可以找到哪个任务就绪了。

现在举个列子来说明:创建了一个任务,它的优先级为prio=11.(这是用户指定的),此优先级用二进制表示(8位):最前面两位无用处,前面已说过00 001 011。

那么怎么在对应的OSRdyTbl[]优先级就绪表中进行标定呢?1. 把这个二进制数分为两个部分:高3位(001)和低3位(011)。

高三位负责找到数组中的行,低三位负责找到数组中的列(其实这里不是列,是一个变量的8个位,也可以按列理解),这样配合就可以寻址,对往相应数字标号里写1了。

对上面这个数来说001 =1说明是第1行(数组从0行开始),011=3说明在第3个位置要写入1.合在一起就是第一行的第三个位置写入1.这样就完成了对应数字优先级标号的标记。

那从上面的思路来看,我们只要数组中的第几组,和第几列的值就可以了,所以又引进了一个映射数组:OSMapTbl[],其具体内容如下。

下表0对应的就是0位为1,下表1对应的就是1位为1.把这个数赋值给OSRdyGrp优先级就绪组。

则OSRdyGrp哪个位为1则说明就是就绪表哪个行有就绪任务了。

这样做的好处就是快。

这也就是这个数组就是个映射数组,方便操作而已。

至此:这里涉及3个数据结构了,现在来总结一下:1.OSRdyGrp:优先级就绪组第几位置1的话,就说明就绪表中第几行有就绪任务。

比如OSRdyGrp=0000 0001。

说明OSRdyTbl[0]行有任务就绪。

具体是这行的哪个列还要根据低三位的值来决定。

2.OSRdyTbl[]:优先级就绪表:行+列就能标定就绪任务的优先级3. OSMapTbl[] 优先级映射表:用来方便生成第几行,第几列的一个转换而已。

下面来看ucos中的源码怎么实现的:任务就绪源码如下;OSRdyGrp |= OSMapTbl[prio>>3]; (1)OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; (2)代码解释:prio>>3是获取优先级的高3位,prio&0x07是获取优先级的低3位。

然后在通过OSMapTbl的映射分别获得了就绪表中的行和就绪表中的列,然后查询就绪算法:y = OSUnMapTbl[OSRdyGrp];x = OSUnMapTbl[OSRdyTbl[y]];prio = (y << 3) + x;举个例子:只创建一个任务,且prio=11=001 011 的情况分析:高3位:001=1 通过OSMapTbl映射后,OSRdyGrp=0000 0010.即是就绪表中第一行有任务就绪。

低3位:011=3,通过OSMapTbl映射后OSRdyTbl[prio>>3]= OSRdyTbl[1]=0000 1000 ,通过这句代码就往就绪表第一行(从OSRdyTbl[1]看到)第3个位置(从右往左看0000 1000,第一个为1的位,0开始。

)写入1,表明该任务就绪了。

这样就完成了优先级的标定4 多个任务参与下怎么选定最高的优先级任务此时又要加入一个表格:优先级判定表OSUnMapTbl[],这个表的作用是为了节省时间,这样查表的话,耗的时间是一定的,很好的满足了实时性。

下面来分析这个表的作用。

1.先看最旁边的注释,说明的是该数组中对应的位置。

2.解释这个数组中内容,这些数字怎么来的。

举例:0x53 如上图所示的位置,为什么是0呢?我们把0x53变成二进制来看:0101 0011,从右往左看,第一个出现1的位就是0位所以为0.为什么是从右往左看呢?因为高优先级的数字低,你应该懂的。

例子:有4个任务,优先级分别为6,10,11,17.。

把上面就绪任务算法再贴一遍:前面2位不管。

6对应二进制:000 110高3位:000=0 通过OSMapTbl映射后,OSMapTbl[prio>>3]= OSMapTbl[0]=0000 0001低3位:110=6,通过OSMapTbl映射后OSRdyTbl[prio>>3]= OSRdyTbl[0]=0100 000010对应二进制:001 010高3位:001=1 通过OSMapTbl映射后,OSMapTbl[prio>>3]= OSMapTbl[1]=0000 0010.低3位:010=2,通过OSMapTbl映射后OSRdyTbl[prio>>3]= OSRdyTbl[1]=0000 010011对应二进制:001 011高3位:001=1 通过OSMapTbl映射后,OSMapTbl[prio>>3]= OSMapTbl[1]=0000 0010.低3位:011=3,通过OSMapTbl映射后OSRdyTbl[prio>>3]= OSRdyTbl[1]=0000 100017对应二进制:010 001高3位:010=2 通过OSMapTbl映射后,OSMapTbl[prio>>3]= OSMapTbl[2]=0000 0100.低3位:001=1,通过OSMapTbl映射后OSRdyTbl[prio>>3]= OSRdyTbl[2]=0000 0010通过就绪任务算法:OSRdyGrp |= OSMapTbl[prio>>3]; (1)OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; (2)最后OSRdyGrp的值就是将所有的OSMapTbl[prio>>3]进行位或运算:OSRdyGrp=0100 0000|0000 0010| 0000 0010|0000 0100= 0000 0111=0x07 OSRdyTbl[0]=0100 0000OSRdyTbl[1]=0000 0100 |0000 1000=0000 1100 (相同的列要或运算)OSRdyTbl[2]=0000 0010然后在查找优先级判定表OSUnMapTbl[]OSRdyGrp=0x07Y=OSUnMapTbl[0x07]=0.说明是最高优先级在第0组。

OSRdyTbl[0]=0100 0000=0x40X= OSUnMapTbl[0x40]=6最高优先级为:prio= y*8+x=6至此,最高优先级就选出来了。

相关文档
最新文档