二嵌入式实时操作系统分析

上传人:公**** 文档编号:593320382 上传时间:2024-09-24 格式:PPT 页数:33 大小:137.50KB
返回 下载 相关 举报
二嵌入式实时操作系统分析_第1页
第1页 / 共33页
二嵌入式实时操作系统分析_第2页
第2页 / 共33页
二嵌入式实时操作系统分析_第3页
第3页 / 共33页
二嵌入式实时操作系统分析_第4页
第4页 / 共33页
二嵌入式实时操作系统分析_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《二嵌入式实时操作系统分析》由会员分享,可在线阅读,更多相关《二嵌入式实时操作系统分析(33页珍藏版)》请在金锄头文库上搜索。

1、1 C/OS-内核结构内核结构刘立刘立2本章给出本章给出C/OS-的主要结构概貌的主要结构概貌ll lC/OS-是怎样处理临界段代码的是怎样处理临界段代码的;ll l什么是任务,怎样把用户的任务交给什么是任务,怎样把用户的任务交给C/OS-;ll l任务是怎样调度的任务是怎样调度的;ll l应应用用程程序序CPU的的利利用用率率是是多多少少,C/OS-是是怎怎样样知知道道的的;ll l怎样写中断服务子程序怎样写中断服务子程序;ll l什么是时钟节拍,什么是时钟节拍,C/OS-是怎样处理时钟节拍的是怎样处理时钟节拍的;ll lC/OS-是怎样初始化的,以及是怎样初始化的,以及怎样启动多任务怎样启

2、动多任务; 3临界段临界段(Critical Sections)l和其它内核一样,和其它内核一样,C/OS-为了处理临界段代码需要关中断,处理完毕后再为了处理临界段代码需要关中断,处理完毕后再开中断。这使得开中断。这使得C/OS-能够避免同时有其它任务或中断服务进入临界段代能够避免同时有其它任务或中断服务进入临界段代码。关中断的时间是实时内核开发商应提供的最重要的指标之一,因为这个指码。关中断的时间是实时内核开发商应提供的最重要的指标之一,因为这个指标影响用户系统对实时事件的响应性。标影响用户系统对实时事件的响应性。C/OS-努力使关中断时间降至最短,努力使关中断时间降至最短,但就使用但就使用

3、C/OS-而言,关中断的时间很大程度上取决于微处理器的架构以而言,关中断的时间很大程度上取决于微处理器的架构以及编译器所生成的代码质量。及编译器所生成的代码质量。l微处理器一般都有关中断微处理器一般都有关中断/开中断指令,用户使用的开中断指令,用户使用的C语言编译器必须有某种机语言编译器必须有某种机制能够在制能够在C中直接实现关中断中直接实现关中断/开中断地操作。某些开中断地操作。某些C编译器允许在用户的编译器允许在用户的C源源代码中插入汇编语言的语句。这使得插入微处理器指令来关中断代码中插入汇编语言的语句。这使得插入微处理器指令来关中断/开中断很容开中断很容易实现。而有的编译器把从易实现。而

4、有的编译器把从C语言中关中断语言中关中断/开中断放在语言的扩展部分。开中断放在语言的扩展部分。C/OS-定义两个宏定义两个宏(macros)来关中断和开中断,以便避开不同来关中断和开中断,以便避开不同C编译器厂商编译器厂商选择不同的方法来处理关中断和开中断。选择不同的方法来处理关中断和开中断。C/OS-中的这两个宏调用分别是:中的这两个宏调用分别是:OS_ENTER_CRITICAL()和和OS_EXIT_CRITICAL()。因为这两个宏的定义取决于所用的微处理器,故。因为这两个宏的定义取决于所用的微处理器,故在文件中可以找到相应宏定义。每种微处理器都有自己的文件。在文件中可以找到相应宏定义

5、。每种微处理器都有自己的文件。 4任务任务 l一一个个任任务务通通常常是是一一个个无无限限的的循循环环,如如程程序序清清单单所所示示。一一个个任任务务看看起起来来像像其其它它C的的函函数数一一样样,有有函函数数返返回回类类型型,有有形形式式参参数数变变量量,但但是是任任务务是是绝绝不不会会返返回回的的。故故返返回回参参数数必须定义成必须定义成void。l void YourTask (void *pdata) (1)l l for (;) (2)l /* 用户代码用户代码 */ 调用调用uC/OS-II的某种系统服务的某种系统服务:l OSMboxPend();l OSQPend();l OS

6、SemPend();l OSTaskDel(OS_PRIO_SELF);l OSTaskSuspend(OS_PRIO_SELF);l OSTimeDly();l OSTimeDlyHMSM();l /* 用户代码用户代码 */l l 5l当当任任务务完完成成以以后后,任任务务可可以以自自我我删删除除,注注意意任任务务代代码码并并非非真真的的删删除除了了,C/OS-C/OS-只只是是简简单单地地不不再再理理会会这这个个任任务务了了,这这个个任任务务的的代代码码也也不不会会再再运运行行,如如果果任任务务调调用用了了OSTaskDel()OSTaskDel(),这这个个任任务务绝绝不不会会返返回回

7、什什么么。任任务务完完成成后自我删除后自我删除l void YourTask (void *pdata)l l /* 用户代码用户代码 */l OSTaskDel(OS_PRIO_SELF);l l形式参数变量是由用户代码在第一次执行的时候带入的。请注意,该变量形式参数变量是由用户代码在第一次执行的时候带入的。请注意,该变量的类型是一个指向的类型是一个指向voidvoid的指针。这是为了允许用户应用程序传递任何类型的指针。这是为了允许用户应用程序传递任何类型的数据给任务。这个指针好比一辆万能的车子,如果需要的话,可以运载的数据给任务。这个指针好比一辆万能的车子,如果需要的话,可以运载一个变量的

8、地址,或一个结构,甚至是一个函数的地址。也可以建立许多一个变量的地址,或一个结构,甚至是一个函数的地址。也可以建立许多相同的任务,所有任务都使用同一个函数(或者说是同一个任务代码程序)相同的任务,所有任务都使用同一个函数(或者说是同一个任务代码程序)。例如,用户可以将四个串行口安排成每个串行口都是一个单独的任务。例如,用户可以将四个串行口安排成每个串行口都是一个单独的任务, ,而每个任务的代码实际上是相同的。并不需要将代码复制四次,用户可以而每个任务的代码实际上是相同的。并不需要将代码复制四次,用户可以建立一个任务,向这个任务传入一个指向某数据结构的指针变量,这个数建立一个任务,向这个任务传入

9、一个指向某数据结构的指针变量,这个数据结构定义串行口的参数(波特率、据结构定义串行口的参数(波特率、I/OI/O口地址、中断向量号等)。口地址、中断向量号等)。 6任务状态任务状态 l睡睡眠眠态态(DORMANTDORMANT)指指任任务务驻驻留留在在程程序序空空间间之之中中,还还没没有有交交给给C/OS-C/OS-管管理理,把把任任务务交交给给C/OS-C/OS-是是通通过过调调用用下下述述两两个个函函数数之之一一:OSTaskCreate()OSTaskCreate()或或OSTaskCreateExt()OSTaskCreateExt()。当当任任务务一一旦旦建建立立,这这个个任任务务就

10、就进进入入就就绪绪态态准准备备运运行行。任任务务的的建建立立可可以以是是在在多多任任务务运运行行开开始始之之前前,也也可可以以是是动动态态地地被被一一个个运运行行着着的的任任务务建建立立。如如果果一一个个任任务务是是被被另另一一个个任任务务建建立立的的,而而这这个个任任务务的的优优先先级级高高于于建建立立它它的的那那个个任任务务,则则这这个个刚刚刚刚建建立立的的任任务务将将立立即即得得到到CPUCPU的的控控制制权权。一一个个任任务务可可以以通通过过调调用用OSTaskDel()OSTaskDel()返返回回到到睡睡眠眠态态,或或通通过过调调用用该该函函数让另一个任务进入睡眠态。数让另一个任务

11、进入睡眠态。l调调用用OSStart()OSStart()可可以以启启动动多多任任务务。OSStart()OSStart()函函数数运运行行进进入入就就绪绪态态的的优优先先级级最最高高的的任任务务。就就绪绪的的任任务务只只有有当当所所有有优优先先级级高高于于这这个个任务的任务转为等待状态,或者是被删除了,才能进入运行态。任务的任务转为等待状态,或者是被删除了,才能进入运行态。l正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,正在运行的任务可以通过调用两个函数之一将自身延迟一段时间,这两个函数是这两个函数是OSTimeDly()OSTimeDly()或或OSTimeDlyHMSM()O

12、STimeDlyHMSM()。这个任务于是进。这个任务于是进入等待状态,等待这段时间过去,下一个优先级最高的、并进入入等待状态,等待这段时间过去,下一个优先级最高的、并进入了就绪态的任务立刻被赋予了了就绪态的任务立刻被赋予了CPUCPU的控制权。等待的时间过去以后,的控制权。等待的时间过去以后,系统服务函数系统服务函数OSTimeTick()OSTimeTick()使延迟了的任务进入就绪态使延迟了的任务进入就绪态l正正在在运运行行的的任任务务期期待待某某一一事事件件的的发发生生时时也也要要等等待待,手手段段是是调调用用以以下下3 3个个函函数数之之一一:OSSemPend()OSSemPend

13、(),OSMboxPend()OSMboxPend(),或或OSQPend()OSQPend()。调调用用后后任任务务进进入入了了等等待待状状态态(WAITINGWAITING)。当当任任务务因因等等待待事事件件被被挂挂起起(PendPend),下下一一个个优优先先级级最最高高的的任任务务立立即即得得到到了了CPUCPU的的控控制制权权。当当事事件件发发生生了了,被被挂挂起起的的任任务务进进入入就就绪绪态态。事事件件发发生生的的报报告告可可能能来来自自另另一一个个任任务务,也也可能来自中断服务子程序。可能来自中断服务子程序。l正正在在运运行行的的任任务务是是可可以以被被中中断断的的,除除非非该

14、该任任务务将将中中断断关关了了,或或者者C/OS-C/OS-将将中中断断关关了了。被被中中断断了了的的任任务务就就进进入入了了中中断断服服务务态态(ISRISR)。响响应应中中断断时时,正正在在执执行行的的任任务务被被挂挂起起,中中断断服服务务子子程程序序控控制制了了CPUCPU的的使使用用权权。中中断断服服务务子子程程序序可可能能会会报报告告一一个个或或多多个个事事件件的的发发生生,而而使使一一个个或或多多个个任任务务进进入入就就绪绪态态。在在这这种种情情况况下下,从从中中断断服服务务子子程程序序返返回回之之前前,C/OS-C/OS-要要判判定定,被被中中断断的的任任务务是是否否还还是是就就

15、绪绪态态任任务务中中优优先先级级最最高高的的。如如果果中中断断服服务务子子程程序序使使一一个个优优先先级级更更高高的的任任务务进进入入了了就就绪绪态态,则则新新进进入入就就绪绪态态的的这这个个优优先先级级更更高高的的任任务务将将得得以以运运行行,否否则则原原来来被被中中断了的任务才能继续运行。断了的任务才能继续运行。l当所有的任务都在等待事件发生或等待延迟时间结束,当所有的任务都在等待事件发生或等待延迟时间结束,C/OS-C/OS-执行空闲任务(执行空闲任务(idle taskidle task),执行),执行OSTaskIdle()OSTaskIdle()函数。函数。 9任务控制块任务控制块

16、 l一旦任务建立了,任务控制块一旦任务建立了,任务控制块OS_TCBsOS_TCBs将被赋值。任务控制块是一个数据结将被赋值。任务控制块是一个数据结构,当任务的构,当任务的CPUCPU使用权被剥夺时,使用权被剥夺时,C/OS-C/OS-用它来保存该任务的状态。当任用它来保存该任务的状态。当任务重新得到务重新得到CPUCPU使用权时,任务控制块能确保任务从当时被中断的那一点丝毫使用权时,任务控制块能确保任务从当时被中断的那一点丝毫不差地继续执行。不差地继续执行。OS_TCBsOS_TCBs全部驻留在全部驻留在RAMRAM中。任务建立的时候,中。任务建立的时候,OS_TCBsOS_TCBs就被初始

17、化了就被初始化了 所有的任务控制块分为两条链表,空闲链表和使用链表所有的任务控制块分为两条链表,空闲链表和使用链表。任务控制块结构任务控制块结构lStruct os_tcb OS_STK *OSTCBStkPtr; struct os_tcb *OSTCBNext; struct os_tcb *OSTCBprev; OS_EVENT *OSTCBEventPtr; void *OSTCBMsg; INT16U OSTCBDly;当需要把任务延时若干时钟节拍时要用到这个当需要把任务延时若干时钟节拍时要用到这个变量变量 INT8U OSTCBStat; INT8U OSTCBPrio;任务优先级

18、。任务优先级。 INT8U OSTCBX, OSTCBY, OSTCBBitX, OSTCBBitY; OS_TCB加速任务进入就绪态的过程事件控制块的指针任务的状态字11空任务列表空任务列表系统初始化时,所有任务控制块被链接成空任务控制块的单向链表系统初始化时,所有任务控制块被链接成空任务控制块的单向链表12l为为确确定定下下次次该该哪哪个个优优先先级级的的任任务务运运行行了了,内内核核调调度度器器总总是是将将OS_LOWEST_PR1OOS_LOWEST_PR1O在在就就绪绪表表中中相相应应字字节节的的相相应应位位置置1 1。是是按按以以下下规规则则给出的:给出的:l当当OSRdyTbl0

19、OSRdyTbl0中的任何一位是中的任何一位是1 1时,时,OSRdyGrpOSRdyGrp的第的第0 0位置位置1 1,l 当当OSRdyTbl1OSRdyTbl1中的任何一位是中的任何一位是1 1时,时,OSRdyGrpOSRdyGrp的第的第1 1位置位置1 1,l当当OSRdyTbl2OSRdyTbl2中的任何一位是中的任何一位是1 1时,时,OSRdyGrpOSRdyGrp的第的第2 2位置位置1 1,l当当OSRdyTbl3OSRdyTbl3中的任何一位是中的任何一位是1 1时,时,OSRdyGrpOSRdyGrp的第的第3 3位置位置1 1,l当当OSRdyTbl4OSRdyTb

20、l4中的任何一位是中的任何一位是1 1时,时,OSRdyGrpOSRdyGrp的第的第4 4位置位置1 1,l 当当OSRdyTbl5OSRdyTbl5中的任何一位是中的任何一位是1 1时,时,OSRdyGrpOSRdyGrp的第的第5 5位置位置1 1,l当当OSRdyTbl6OSRdyTbl6中的任何一位是中的任何一位是1 1时,时,OSRdyGrpOSRdyGrp的第的第6 6位置位置1 1,l 当当OSRdyTbl7OSRdyTbl7中的任何一位是中的任何一位是1 1时,时,OSRdyGrpOSRdyGrp的第的第7 7位置位置1 1 13就绪表就绪表 l每每个个任任务务被被赋赋予予不

21、不同同的的优优先先级级等等级级,从从0 0级级到到最最低低优优先先级级OS_LOWEST_PR1OOS_LOWEST_PR1O,包包括括0 0和和OS_LOWEST_PR1OOS_LOWEST_PR1O在在内内(见见文文件件)。当当C/OS-C/OS-初初始始化化的的时时候候,最最低低优优先先级级OS_LOWEST_PR1OOS_LOWEST_PR1O总总是是被被赋赋给给空空闲闲任任务务idle idle tasktask。注注意意,最最多多任任务务数数目目OS_MAX_TASKSOS_MAX_TASKS和和最最低低优优先先级级数数是是没没有有关关系系的的。用用户户应应用用程程序序可可以以只只

22、有有1010个个任任务务,而仍然可以有而仍然可以有3232个优先级的级别(如果用户将最低优先级数设为个优先级的级别(如果用户将最低优先级数设为3131的话)。的话)。l每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRedyGrpOSRedyGrp和和OSRdyTblOSRdyTbl。在。在OSRdyGrpOSRdyGrp中,任务按优先级分组,中,任务按优先级分组,8 8个任务为一组。个任务为一组。OSRdyGrpOSRdyGrp中的每一位表示中的每一位表示8 8组任务中每一组中是否有进入就绪态的任务。任务组任务中每一组中是否

23、有进入就绪态的任务。任务进入就绪态时,就绪表进入就绪态时,就绪表OSRdyTblOSRdyTbl中的相应元素的相应位也置位。就绪表中的相应元素的相应位也置位。就绪表OSRdyTblOSRdyTbl数组的大小取决于数组的大小取决于OS_LOWEST_PR1O(OS_LOWEST_PR1O(见文件见文件OS_CFG.H)OS_CFG.H)。当用户的应用程序中。当用户的应用程序中任务数目比较少时,减少任务数目比较少时,减少OS_LOWEST_PR1OOS_LOWEST_PR1O的值可以降低的值可以降低C/OS-C/OS-对对RAMRAM(数据(数据空间)的需求量。空间)的需求量。 14根据优先级找到

24、任务在就绪任务表中的位置根据优先级找到任务在就绪任务表中的位置每个任务的就绪状态标志都放入就绪表中(每个任务的就绪状态标志都放入就绪表中(readylist)中,就绪表有)中,就绪表有两个变量:两个变量:OSRdyGrp、OSRdyTbl15根据优先级确定就绪表根据优先级确定就绪表l假假设设优优先先级级为为12的的任任务务进进入入就就绪绪状状态态,12=1 100b,则则OSRdyTbl1的的第第4位位置置1,且且OSRdyGrp的的第第1位位置置1,相相应的数学表达式为应的数学表达式为:OSRdyGrp|=0x02;OSRdyTbl1|=0x10;l而而优优先先级级为为21的的任任务务就就绪

25、绪21=10101b,则则OSRdyTbl2的的第第5位置位置1,且,且OSRdyGrp的第的第2位置位置1,相应的数学表达式为:相应的数学表达式为:OSRdyGrp|=0x04;OSRdyTbl2|=0x20;16根据优先级确定就绪表根据优先级确定就绪表l从从上上面面的的计计算算我我们们可可以以得得到到:若若第第n位位置置1,则则应应该该与与2n相相或或。uC/OS中中,把把2n的的n=0-7的的8个个值值先先计计算算好好存存在在数数组组OSMapTbl7中中,也也就就是:是:OSMapTbl0=20=0x1;OSMapTbl1=21=0x2;OSMapTbl7=27=0x80;17根据优先

26、级确定就绪表根据优先级确定就绪表l利利用用OSMapTbl,通通过过任任务务的的识识别别号号-优优先先级级prio来来设设置置任任务务在在就就绪绪组和就绪表数组中相应位置的数学式为:组和就绪表数组中相应位置的数学式为:OSRdyGrp|=OSMapTblprio3;OSRdyTblprio3|=OSMapTblprio&0x07;假设优先级为假设优先级为12,1100bOSRdyGrp|=0x02;OSRdyTbl1|=0x10;18根据就绪表确定最高优先级根据就绪表确定最高优先级两个关键两个关键:l优先级数分解为高三位和低三位优先级数分解为高三位和低三位分别确定;分别确定;l高优先级有高优先

27、级有着小的优先级号 ;19根据就绪表确定最高优先级根据就绪表确定最高优先级l通过通过OSRdyGrp值确定高值确定高3位,假设为位,假设为0x24=100 100b, - OSRdyTbl2 和和OSRdyTbl5,高优先级为,高优先级为2l通过通过OSRdyTbl2的值来确定低的值来确定低3位,位,假设为假设为0x12=010 010b ,-第第2个和第个和第5个任务,取高优先级第个任务,取高优先级第2个个-1720源代码中使用了查表法源代码中使用了查表法查查表表法法具具有有确确定定的的时时间间,增增加加了了系系统统的的可可预预测测性性,uC/OS中中所所有有的的系系统统调调用时间都是确定的

28、用时间都是确定的lHigh3=OSUnMapTblOSRdyGrp;lLow3=OSUnMapTblOSRdyTblHigh3;lPrio=(Hign33)+Low3;?为什么频繁的使用查表法?为什么频繁的使用查表法?请问?请问OSUnMapTbl的来历;的来历;21INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1,

29、0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 该处缺该处缺10排数据,请补充(下次课不上,为查资料时间,解决本道题目)排数据,请补充(下次课不上,为查资料时间,解决本道题目);22INT8U const OSUnMapTbl = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2

30、, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3

31、, 0, 1, 0, 2, 0, 1, 0, 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2

32、, 0, 1, 0, 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0;lC/OS-C/OS-总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,总是运行进入就绪态任务中优先级最高的那一个。确定哪个任务优先级最高,下面该哪个任务运行了的工作是由调度器(下面该哪个任务运行了的工作是由调度器(SchedulerScheduler)完成的。任务级的调度是由函)完成的。任务级的调度是由函数数OSSched()OSSched()完成的。中断级的调度是

33、由另一个函数完成的。中断级的调度是由另一个函数OSIntExt()OSIntExt()完成的,这个函数将在完成的,这个函数将在以后描述。以后描述。OSSched()OSSched()的代码如程序清单。的代码如程序清单。 lvoid OSSched (void)ll INT8U y;l OS_ENTER_CRITICAL();l if (OSLockNesting | OSIntNesting) = 0) (1)l y = OSUnMapTblOSRdyGrp;(2)l OSPrioHighRdy = (INT8U)(y 3) + OSUnMapTblOSRdyTbly);(2)l if (OS

34、PrioHighRdy != OSPrioCur) (3)l OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy;(4) OSTCBHighRdyOSTCBHighRdy必须必须指向优先级最高的那个任务控制块指向优先级最高的那个任务控制块OS_TCBOS_TCB ,通过将以通过将以OSPrioHighRdyOSPrioHighRdy为下标的为下标的OSTCBPrioTblOSTCBPrioTbl数组中的那个元素赋给数组中的那个元素赋给OSTCBHighRdyOSTCBHighRdy来实现的来实现的 l OSCtxSwCtr+; (5)l OS_TASK_SW();

35、完成实际上的任务切换完成实际上的任务切换 (6)l l l OS_EXIT_CRITICAL();l24空闲任务空闲任务 lC/OS-C/OS-总是建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运总是建立一个空闲任务,这个任务在没有其它任务进入就绪态时投入运行。这个空闲任务行。这个空闲任务OSTaskIdle()OSTaskIdle()永远设为最低优先级,即永远设为最低优先级,即OS_LOWEST_PRI0OS_LOWEST_PRI0。空闲。空闲任务任务OSTaskIdle()OSTaskIdle()什么也不做,只是在不停地给一个什么也不做,只是在不停地给一个3232位的名叫位的名叫

36、OSIdleCtrOSIdleCtr的计数的计数器加器加1 1,统计任务使用这个计数器以确定现行应用软件实际消耗的,统计任务使用这个计数器以确定现行应用软件实际消耗的CPUCPU时间。程序清时间。程序清单是空闲任务的代码。在计数器加单是空闲任务的代码。在计数器加1 1前后,中断是先关掉再开启的,因为前后,中断是先关掉再开启的,因为8 8位以及大位以及大多数多数1616位微处理器的位微处理器的3232位加位加1 1需要多条指令,要防止高优先级的任务或中断服务子需要多条指令,要防止高优先级的任务或中断服务子程序从中打入。空闲任务不可能被应用软件删除。程序从中打入。空闲任务不可能被应用软件删除。lv

37、oid OSTaskIdle (void *pdata)ll pdata = pdata;l for (;) l OS_ENTER_CRITICAL();l OSIdleCtr+;l OS_EXIT_CRITICAL();l ll 25中断处理中断处理l中断服务子程序要用汇编语言来写。然而,如果用户使用的中断服务子程序要用汇编语言来写。然而,如果用户使用的C C语言编译器支持在线汇语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在编语言的话,用户可以直接将中断服务子程序代码放在C C语言的程序文件中。中断服语言的程序文件中。中断服务子程序的示意码务子程序的示意码 l用户中断服

38、务子程序用户中断服务子程序: l 保存全部保存全部CPU寄存器寄存器; (1) l调用调用OSIntEnter或或OSIntNesting直接加直接加1; (2) l 执行用户代码做中断服务执行用户代码做中断服务; (3) l 调用调用OSIntExit(); (4) l 恢复所有恢复所有CPU寄存器;寄存器; (5) l 执行中断返回指令;执行中断返回指令; (6)luC/OS中提供了中提供了OSIntEnter() 和和OSIntExit() 告诉内核进入了中断状态告诉内核进入了中断状态l程序清单程序清单 通知通知C/OS-C/OS-,中断服务子程序开始了,中断服务子程序开始了.lvoid

39、 OSIntEnter (void)ll OS_ENTER_CRITICAL();l OSIntNesting+;l OS_EXIT_CRITICAL();ll27时钟节拍时钟节拍 l时钟节拍是一种特殊的中断,操作系统的心脏。首先时钟节拍是一种特殊的中断,操作系统的心脏。首先32位的整数位的整数OSTime加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。最后进行上下文切换。28多任务的启动多任务的启动l首先创建任务首先创建任务l最后调用最后调用OSStart开始多任务调度开始多任务调度voi

40、dmain()OSInit();.OSTaskcreat().OSStart();29任务的格式任务的格式l每个任务不能占用全部每个任务不能占用全部CPU的资源的资源l需要有等待,或延时等系统调用需要有等待,或延时等系统调用l典型的一个无限循环。典型的一个无限循环。voidmytask(void*pdata)for(;)dosomething;waiting;dosomething;30任任务调度务调度lFor example1 创建创建2个任务,每个任务仅仅是进行延时,延时不同的个任务,每个任务仅仅是进行延时,延时不同的时间片,不同优先级时间片,不同优先级void Task1(void) v

41、oid Task2(void) while(1) while(1) blinkled1(); blinkled2();Task1Data+; Task2Data+; OSTimeDly(25); OSTimeDly(50); 31void main() sysinit(); OSInit (); OSTaskCreate ( Task1, (void *)&Task1Data, (void *)&Task1StkTASK_STK_SIZE,Task1prio); OSTaskCreate (Task2, (void *)&Task2Data, (void *)&Task2StkTASK_STK

42、_SIZE,Task2prio); ticker_start(OS_TICKS_PER_SEC); OSStart();void OSStart (void) INT8U y, x; if (OSRunning = FALSE) 判断是否没有启动内核判断是否没有启动内核 y = OSUnMapTblOSRdyGrp; x = OSUnMapTblOSRdyTbly; OSPrioHighRdy = (INT8U)(y 3) + x); 找到优先级最高的准备就绪任务找到优先级最高的准备就绪任务 OSPrioCur = OSPrioHighRdy; 当前运行任务优先级当前运行任务优先级 OSTCB

43、HighRdy = OSTCBPrioTblOSPrioHighRdy; 根据任务优先级找到任根据任务优先级找到任务务 OSTCBCur = OSTCBHighRdy; OSStartHighRdy(); 让优先级最高的任务运行起来让优先级最高的任务运行起来voidOSSched(void)INT8Uy;OS_ENTER_CRITICAL();if(OSLockNesting|OSIntNesting)=0)调度锁,或者处于中断状态禁止调度调度锁,或者处于中断状态禁止调度y=OSUnMapTblOSRdyGrp;OSPrioHighRdy=(INT8U)(y3)+OSUnMapTblOSRdyTbly);获取准备就绪组里最高优先级的任务获取准备就绪组里最高优先级的任务if(OSPrioHighRdy!=OSPrioCur)OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;设置运行任务为最高优先级任务设置运行任务为最高优先级任务OSCtxSwCtr+;OS_TASK_SW();执行上下文切换执行上下文切换OS_EXIT_CRITICAL();

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号