第4章 uCOS-II的时钟和中断_第1页
第4章 uCOS-II的时钟和中断_第2页
第4章 uCOS-II的时钟和中断_第3页
第4章 uCOS-II的时钟和中断_第4页
第4章 uCOS-II的时钟和中断_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第第 四四 章:章: uC/OS-II的中断和时钟的中断和时钟目标目标:介绍介绍uc/osII实时操作系统的中断概念及时间管理,通过实时操作系统的中断概念及时间管理,通过本章的学习,应该掌握如下知识:本章的学习,应该掌握如下知识:1)uC/OSII的中断管理和中断服务程序的的中断管理和中断服务程序的 结构结构2)uC/OSII的系统时钟及实现方法的系统时钟及实现方法3)时间管理服务:延时、取消延时)时间管理服务:延时、取消延时24.1 uC/OS-II的中断的中断 中断:中断:任务在运行过程中,应内部或外部异步事件的请求任务在运行过程中,应内部或外部异步事件的请求中止当前任务,而去处理异步事

2、件所要求的任务的过程叫中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。做中断。 中断服务程序:中断服务程序:应中断请求而运行的程序叫中断服务子程应中断请求而运行的程序叫中断服务子程序序(ISR)(ISR)。 中断向量:中断向量:中断服务子程序的入口地址叫中断向量。中断服务子程序的入口地址叫中断向量。 CPUCPU响应中断的条件:响应中断的条件:至少有一个中断源向至少有一个中断源向CPUCPU发出中断信号发出中断信号系统允许中断,且对此中断信号未予屏蔽系统允许中断,且对此中断信号未予屏蔽34.1.1 uC/OS-II的中断过程的中断过程uC/OS-II中断的响应过程:中断的响应过程:中

3、断请求中断请求关闭中断关闭中断转到中断向量转到中断向量保存保存CPU寄存器寄存器通知内核进入通知内核进入ISR通知内核退出通知内核退出ISR恢复恢复CPU寄存器寄存器中断返回中断返回无新高级任务则无新高级任务则返回原任务返回原任务有新高级任务有新高级任务则运行高级任则运行高级任务务ISR给任务发信号给任务发信号通知内核退出通知内核退出ISR恢复恢复CPU寄存器寄存器中断返回中断返回图图4-1 中断的响应过程中断的响应过程中断响应中断响应中断恢复中断恢复任务响应时间任务响应时间中断恢复中断恢复任务响应时间任务响应时间注意注意: :对于可剥夺型内核,中断服务对于可剥夺型内核,中断服务子程序结束后,

4、系统进行一次任务子程序结束后,系统进行一次任务调度去运行优先级最高的就绪任务,调度去运行优先级最高的就绪任务,而不是一定要接续运行被中断的任而不是一定要接续运行被中断的任务务。(1)进入中断函数)进入中断函数void OSIntEnter (void) if(OSRunning=TRUE)if(OSIntNesting255) OSIntNesting+; /中断嵌套层数计数器加中断嵌套层数计数器加1调用情况:调用情况: 此函数在中断服务程序保护断点数据后,运行用户中断服此函数在中断服务程序保护断点数据后,运行用户中断服务代码之前来调用,所以通常把它叫做进入中断服务函数。务代码之前来调用,所以

5、通常把它叫做进入中断服务函数。函数作用就是把全局变量函数作用就是把全局变量OSIntNesting加加1,从而用它来,从而用它来记录中断嵌套的层数记录中断嵌套的层数中断的进入和离开中断的进入和离开5图图4-2 函数函数OSIntExit()的流程图的流程图(2)退出中断服务函数)退出中断服务函数中断嵌套层数中断嵌套层数=0?调度器未被锁调度器未被锁任务是被中断的任务任务是被中断的任务入口入口获得最高优先级别就绪任务的获得最高优先级别就绪任务的prio获得任务获得任务TCB的指针的指针执行中断级任务切换执行中断级任务切换返回中断服务程序返回中断服务程序NoNoNoYesYesYesvoid OS

6、IntExit (void) OS_ENTER_CRITICAL(); if (-OSIntNesting & OSLockNesting) = = 0) OSIntExitY = OSUnMapTblOSRdyGrp; OSPrioHighRdy = (INT8U)(OSIntExitY OSTCBStkPtr=SPOSTCBCur-OSTCBStkPtr=SPNONO中断嵌套层中断嵌套层OSIntNEsting=1OSIntNEsting=1?YESYES清中断源的中断申请标志清中断源的中断申请标志图图4-3 中断服务子程序中断服务子程序的流程图的流程图CPUCPU寄存器内容进栈寄

7、存器内容进栈调用调用OSIntEnter()OSIntEnter()通知系统:进入中断服务程序通知系统:进入中断服务程序 重新开放中断重新开放中断 运行中断服务代码运行中断服务代码 调用调用OSIntExit()OSIntExit()通知系统:推出中断服务程序通知系统:推出中断服务程序 恢复恢复CPUCPU寄存器内容寄存器内容 执行中断返回指令执行中断返回指令在在uC/OS-IIuC/OS-II中,通常用一个任务来完成异中,通常用一个任务来完成异步事件的处理工作,而在中断服务程序中步事件的处理工作,而在中断服务程序中只是向任务发送消息的方法去激活这个任只是向任务发送消息的方法去激活这个任务。务

8、。并非为每个任务都定义一个充分大的栈空并非为每个任务都定义一个充分大的栈空间,中断嵌套时单独定义一个中断嵌套栈,间,中断嵌套时单独定义一个中断嵌套栈,在发生第在发生第1次中断时次中断时,中断服务程序将栈空中断服务程序将栈空间切换到中断嵌套栈间切换到中断嵌套栈,这样这样,以后发生的嵌以后发生的嵌套中断就一直使用这个栈空间。套中断就一直使用这个栈空间。84.1.2 中断级任务切换中断级任务切换OSIntCtxSw ( )OSTCBCur = OSTCBHighRdy;/ 任务控制块的切换任务控制块的切换OSPrioCur = OSPrioHighRdy;SP = OSPrioHighRdy-OST

9、CBStkPtr;/ 使使SP指向待运行任务堆栈指向待运行任务堆栈用出栈指令把用出栈指令把R1、R2弹入弹入CPU的通用寄存器;的通用寄存器;RETI;/ 中断返回,使中断返回,使PC指向待运行任务指向待运行任务 与任务级切换函数与任务级切换函数OSCtxSW()的原因一样,中断级任务切换函数的原因一样,中断级任务切换函数OSIntCtxSw()通常是用汇编语言来编写的通常是用汇编语言来编写的:94.1.3 应用程序中的临界段应用程序中的临界段p 在应用程序中经常有一些代码段必须不受任何干扰地连在应用程序中经常有一些代码段必须不受任何干扰地连续运行,这样的代码叫做临界段。续运行,这样的代码叫做

10、临界段。p 怎样保证临界段的安全?怎样保证临界段的安全?p 系统当有异步事件发生时会引发中断请求,系统当有异步事件发生时会引发中断请求,CPUCPU何时响何时响应这个请求?应这个请求?p 需要的条件和策略?需要的条件和策略?p 宏宏OS_ENTER_CRITICAL()和和OS_EXIT_CRITICAL()。临界段的概念:临界段的概念:10当处理临界段代码时,需要关中断,处理完毕后,再开中断;当处理临界段代码时,需要关中断,处理完毕后,再开中断;关中断时间是实时内核重要的指标之一;关中断时间是实时内核重要的指标之一;在实际应用中,关中断的时间很大程度中取决于微处理器的在实际应用中,关中断的时

11、间很大程度中取决于微处理器的结构和编译器生成的代码质量;结构和编译器生成的代码质量; C/OSC/OS-II -II定义两个宏开关中断定义两个宏开关中断: :OS_ENTER_CRITICAL()OS_ENTER_CRITICAL(); OS_EXIT_CRITICAL();OS_EXIT_CRITICAL(); 因为这因为这2 2个宏的定义取决于所使用的微处理器,因此在个宏的定义取决于所使用的微处理器,因此在OS_CPU.HOS_CPU.H中可以找到相应的宏定义。中可以找到相应的宏定义。 OS_CPU.HOS_CPU.H是微处理是微处理器相关的。器相关的。开关中断的宏开关中断的宏11 OS_

12、CRITICAL_METHOD=1OS_CRITICAL_METHOD=1用处理器指令关中断用处理器指令关中断 执行执行OS_ENTER_CRITICAL( )OS_ENTER_CRITICAL( ),关中断,关中断 执行执行OS_EXIT_CRITICAL( ) OS_EXIT_CRITICAL( ) ,开中断;,开中断;方法方法1 1的示意性代码的示意性代码#define OS_ENTER_CRITICAL()#define OS_ENTER_CRITICAL()asm(“DI”)asm(“DI”)#define OS_EXIT_CRITICAL()#define OS_EXIT_CRIT

13、ICAL()asm(“EI”)asm(“EI”)开关中断的实现方法开关中断的实现方法1 1 以上代码所列假定编译器允许直接在以上代码所列假定编译器允许直接在C代码行之间插入行汇编语句。代码行之间插入行汇编语句。根据微处理器和根据微处理器和CC编译器的不同,通过在移植文件编译器的不同,通过在移植文件OS_CPU.HOS_CPU.H中配置中配置OS_CRITICAL_METHODOS_CRITICAL_METHOD来选择开来选择开/ /关中断的方法:关中断的方法:12方法方法2 2的示意性代码的示意性代码#define OS_ENTER_CRITICAL()#define OS_ENTER_CRI

14、TICAL()asm(“PUSH PSW”)asm(“PUSH PSW”)asm(“DI”)asm(“DI”)#define OS_EXIT_CRITICAL()#define OS_EXIT_CRITICAL()asm(“POP PSW”)asm(“POP PSW”) 开关中断的实现方法开关中断的实现方法2 2一些编译器对插入的行汇编代码优化得并不好,上述办法未必可行,一些编译器对插入的行汇编代码优化得并不好,上述办法未必可行,尤其是堆栈指针相对寻址模式时。尤其是堆栈指针相对寻址模式时。 OS_CRITICAL_METHOD=2OS_CRITICAL_METHOD=2实现实现OS_ENTER

15、_CRITICAL()OS_ENTER_CRITICAL()时,先在堆栈中保存中断的开时,先在堆栈中保存中断的开/ /关状态,然后再关中断;关状态,然后再关中断;实现实现OS_EXIT_CRITICAL()OS_EXIT_CRITICAL()时,从堆栈中弹出原来中断的开时,从堆栈中弹出原来中断的开/ /关状态;关状态;第第2种方法可使种方法可使CPU中中断允许标志的状态在断允许标志的状态在临界段前和临阶段后临界段前和临阶段后不发生改变。不发生改变。13void Some_uCOS_II_Service(arguments)void Some_uCOS_II_Service(arguments)

16、 OS_CPU_SROS_CPU_SRcpu_srcpu_srcpu_sr = get_processor_psw();cpu_sr = get_processor_psw();disable_interrupts();disable_interrupts();/ /* * 处理临界代码处理临界代码* */ /set_processor_psw(cpu_sr);set_processor_psw(cpu_sr); 方法方法3 3的示意性代码的示意性代码#define OS_ENTER_CRITICAL()#define OS_ENTER_CRITICAL()cpu_sr = get_proce

17、sser_psw();cpu_sr = get_processer_psw();disable_interrrupts();disable_interrrupts();#define OS_EXIT_CRITICAL()#define OS_EXIT_CRITICAL()set-processer_psw(cpu_sr);set-processer_psw(cpu_sr);开关中断的实现方法开关中断的实现方法3 3 OS_CRITICAL_METHOD=3OS_CRITICAL_METHOD=3 把当前处理器的状态字保存在局部变量中(如把当前处理器的状态字保存在局部变量中(如OS_CPU_SR

18、)OS_CPU_SR),关中,关中断时保存,开中断时恢复。这样需要在选择用这种方法进入临界代码断时保存,开中断时恢复。这样需要在选择用这种方法进入临界代码的应用程序中定义一个局部变量的应用程序中定义一个局部变量cpu_srcpu_sr。第第3种方法的前提条件:用户使用种方法的前提条件:用户使用C编译器具有扩展功能,用户可获得程序状编译器具有扩展功能,用户可获得程序状态字的值,这样就可以把该值保存在态字的值,这样就可以把该值保存在C语言函数的局部变量中,而不必压到语言函数的局部变量中,而不必压到堆栈里。堆栈里。14任何操作系统都要提供一个周期性的信号源,以供系统处理任何操作系统都要提供一个周期性

19、的信号源,以供系统处理诸如延时、超时等与时间有关的事件,这个周期性的信号源诸如延时、超时等与时间有关的事件,这个周期性的信号源叫做时钟。叫做时钟。硬件定时器产生一个周期为毫秒级的周期性中断来实现系统硬件定时器产生一个周期为毫秒级的周期性中断来实现系统时钟。最小的时钟单位就是两次中断之间间隔的时间,这个时钟。最小的时钟单位就是两次中断之间间隔的时间,这个最小时钟单位叫做时钟节拍。最小时钟单位叫做时钟节拍。硬件定时器以时钟节拍为周期定时的产生中断,该中断的中硬件定时器以时钟节拍为周期定时的产生中断,该中断的中断服务程序叫做断服务程序叫做OSTickISR()OSTickISR(),中断服务程序通过

20、调用函数,中断服务程序通过调用函数OSTimeTick()OSTimeTick()来完成系统在每个时钟节拍时需要做的工作。来完成系统在每个时钟节拍时需要做的工作。4.2 uC/OS-II的时钟的时钟 C/OS节拍率应选在节拍率应选在10100次次/秒。秒。必须在多任务系统启动必须在多任务系统启动OSStart()以后,再开启时钟节拍器。以后,再开启时钟节拍器。15void main (void) OSInit(); / 初始化uC/OS-II /* 创建用户起始任务(以TaskStart()作为起始任务)*/ OSStart(); / 开始多任务调度void TaskStart (void *

21、pdata) /* 在这里安装并启动uC/OS-II的时钟节拍 */ OSStatInit(); / 初始化统计任务 /* 创建用户应用程序任务 */ for (;) /* 这里是TaskStart()的代码 */ F 16void OSTickISR(void) 保存保存CPU寄存器;寄存器; 调用调用OSIntEnter(); / 记录中断嵌套层数记录中断嵌套层数 if(OSIntNesting = 1) OSTCBCur - OSTCBStkPtr = SP; / 在任务在任务TCB中保存堆栈指针中保存堆栈指针 调用调用OSTimeTick(); / 节拍处理节拍处理 清除中断清除中断;

22、 开中断开中断; 调用调用OSIntExit(); 恢复恢复CPU寄存器寄存器; 执行中断返回指令执行中断返回指令;4.2.1 4.2.1 时钟节拍中断服务子程序时钟节拍中断服务子程序程序清单程序清单 : : 时钟节拍中断服务子程序的示意代码时钟节拍中断服务子程序的示意代码17 时钟节拍服务函数时钟节拍服务函数void OSTimeTick (void) OS_TCB *ptcb; OSTimeTickHook(); #if OS_TIME_GET_SET_EN 0 OS_ENTER_CRITICAL(); OSTime+; / 记录节拍数记录节拍数 OS_EXIT_CRITICAL(); #

23、endif if (OSRunning = TRUE) ptcb = OSTCBList; while (ptcb-OSTCBPrio != OS_IDLE_PRIO) OS_ENTER_CRITICAL( ); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) /任务的延时时间减任务的延时时间减1 if (ptcb-OSTCBStat & OS_STAT_SUSPEND) = OS_STAT_RDY) OSRdyGrp |= ptcb-OSTCBBitY; OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; el

24、se ptcb-OSTCBDly = 1 ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL( ); OSTimeTick()做了两件事情:做了两件事情:1.给计数器给计数器OSTime加加1;2.遍历任务控制块链表中的所有任务控遍历任务控制块链表中的所有任务控制块,把各个任务控制块中用来存放任制块,把各个任务控制块中用来存放任务延时时限的务延时时限的OSTCBDly变量减变量减1,同时,同时又不使被挂起的任务进入就绪态。又不使被挂起的任务进入就绪态。简单地说,函数简单地说,函数OSTimeTick()的任务就的任务就是在每个时钟节拍了解每个任务的延时是在每个时钟节

25、拍了解每个任务的延时状态,使其中已经到了延时时限的非挂状态,使其中已经到了延时时限的非挂起任务进入就绪状态。起任务进入就绪状态。18例程例程4-1:在在OS_CPU.COS_CPU.C文件中按如下代码定义函数文件中按如下代码定义函数OSTimeTickHook()OSTimeTickHook(),然后运行并查看运,然后运行并查看运行结果。行结果。INT16U d=0;INT16U d1=0;void OSTimeTickHook (void) char* s0 = “500”; char* s1 = “每每”; char* s2 = “次中断的调度次数次中断的调度次数”; char s8; i

26、f(d = 500) PC_DispStr(14,4,s1,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(18,4,s0,DISP_BGND_BLACK+DISP_FGND_WHITE);PC_DispStr(24,4,s2,DISP_BGND_BLACK+DISP_FGND_WHITE);sprintf(s,”%d”,OSCtxSwCtr);PC_DispStr(20,d1+5,s,DISP_BGND_BLACK+DISP_FGND_WHITE);d = 0;d1 += 1; d += 1;OSTimeTick()是系统调用的函数,为了是系统调用的函

27、数,为了方便应用程序设计人员能在系统调用的方便应用程序设计人员能在系统调用的函数中插入一些自己的工作。函数中插入一些自己的工作。19例程例程3-2:设计一个有设计一个有3 3个任务的应用程序。这个任务的应用程序。这3 3个任务分别是:个任务分别是:MyTaskMyTask、YouTaskYouTask、和、和InterTaskInterTask。其中任务。其中任务InterTaskInterTask是在时钟节拍中断服务程序中用钩子函数是在时钟节拍中断服务程序中用钩子函数OSTimeTickHook()OSTimeTickHook()中断了中断了1000010000次时使用一个信号变量次时使用一

28、个信号变量InterKeyInterKey激活的。运行并激活的。运行并分析由中断服务程序激活任务的工作特点。分析由中断服务程序激活任务的工作特点。20void main(void) OSInit(); / 初始化初始化uC/OS-II /* 应用程序初始化代码应用程序初始化代码 . */ /* . 通过调用通过调用OSTaskCreate()创建至少一个任务创建至少一个任务 */ 允许时钟节拍(允许时钟节拍(TICKER)中断)中断; / 千万不要在这里允许时钟节拍中千万不要在这里允许时钟节拍中断断! OSStart(); / 开始多任务调度开始多任务调度启动时钟节拍不正确的做法启动时钟节拍不

29、正确的做法这里潜在的危险是,时钟节拍中断有可能在这里潜在的危险是,时钟节拍中断有可能在C/OS-启动第一个任务之前发生,此时启动第一个任务之前发生,此时C/OS-是处在一种不确定的状态之中,用是处在一种不确定的状态之中,用户应用程序有可能会崩溃。户应用程序有可能会崩溃。21 与时间管理有关的函数除了时钟中断服务子程序和时钟节拍函数外还有与时间管理有关的函数除了时钟中断服务子程序和时钟节拍函数外还有5 5个个: :OSTimeDLY()OSTimeDLY()OSTimeDLYHMSM()OSTimeDLYHMSM()OSTimeDlyResmue() / OSTimeDlyResmue() /

30、由其他任务唤醒延迟未满的任务由其他任务唤醒延迟未满的任务OStimeGet() OStimeGet() / / 获得获得OSTime OSTime 的当前值的当前值OSTimeSet()OSTimeSet() / / 设置设置OSTime OSTime 的当前值的当前值必须通过设置必须通过设置OS_CFG.HOS_CFG.H中的一些配置常量,才能使它们使用。中的一些配置常量,才能使它们使用。时间管理函数时间管理函数在在OS_CFG.HOS_CFG.H中置中置1 1允许相应函数允许相应函数OSTimeDLY()OSTimeDLYHMSM()OS_TIME_DLY_HMSN_ENOSTimeDly

31、Resmue()OS_TIME_DLY_RESUME_ENOStimeGet()OS_TIME_GET_SET_ENOSTimeSet()OS_TIME_GET_SET_EN4.3 4.3 时间管理时间管理22 4.3.1 4.3.1 任务的延时任务的延时p 由于嵌入式系统的任务是一个无限循环由于嵌入式系统的任务是一个无限循环 , 且且uC/OS-IIuC/OS-II是一个抢占式内核。是一个抢占式内核。p 使高优先级的任务不至于独占使高优先级的任务不至于独占CPUCPU,uC/OS-IIuC/OS-II规定:规定:除了空闲任务之外的所除了空闲任务之外的所有任务必须在任务中延迟并进行一次任务调度

32、,以让出有任务必须在任务中延迟并进行一次任务调度,以让出CPUCPU的使用权。的使用权。void OSTimeDly (INT16U ticks) if (ticks 0) OS_ENTER_CRITICAL(); if (OSRdyTblOSTCBCur-OSTCBY &= OSTCBCur-OSTCBBitX) = 0) OSRdyGrp &= OSTCBCur-OSTCBBitY; / 取消当前任务取消当前任务的就绪状态的就绪状态 OSTCBCur-OSTCBDly = ticks; / 延时节拍数存入任务控制块延时节拍数存入任务控制块 OS_EXIT_CRITICAL(

33、); OS_Sched(); / 调用调度函数调用调度函数 INT8U OSTimeDlyHMSM ( INT8U hours,/ 时时 INT8U minutes,/ 分分 INT8U seconds,/ 秒秒 INT16U milli/ 毫秒毫秒 );参数参数ticks是以时钟节拍数为单位的延时时间。是以时钟节拍数为单位的延时时间。23 4.3.2 4.3.2 取消任务的延时取消任务的延时p 延时的任务可通过在其它任务中调用函数延时的任务可通过在其它任务中调用函数OSTimeDlyResume()OSTimeDlyResume()取消延时而取消延时而进入就绪状态。如果任务比正在运行的任务优

34、先级高,则立即引发一次任务调进入就绪状态。如果任务比正在运行的任务优先级高,则立即引发一次任务调度。度。INT8U OSTimeDlyResume ( INT8U Prio);INT8U OSTimeDlyResume (INT8U prio) if (prio = OS_LOWEST_PRIO) return (OS_PRIO_INVALID); OS_ENTER_CRITICAL(); ptcb = (OS_TCB *)OSTCBPrioTblprio; if (ptcb != (OS_TCB *)0) if (ptcb-OSTCBDly != 0) ptcb-OSTCBDly = 0;

35、if (ptcb-OSTCBStat & OS_STAT_SUSPEND) = OS_STAT_RDY) OSRdyGrp |= ptcb-OSTCBBitY; OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; OS_EXIT_CRITICAL();OS_Sched(); else OS_EXIT_CRITICAL(); return (OS_NO_ERR); else OS_EXIT_CRITICAL(); return (OS_TIME_NOT_DLY); OS_EXIT_CRITICAL(); return (OS_TASK_NOT_EXIST); 参

36、数参数prio为被取消延时任务的优先级别。为被取消延时任务的优先级别。24例程例程3-3:本例应用程序的任务使用了延时函数本例应用程序的任务使用了延时函数OSTimeDly()OSTimeDly()进行延时,在任务进行延时,在任务MyTaskMyTask中还中还调用了函数调用了函数OSTimeDlyResume()OSTimeDlyResume()取消了任务取消了任务YouTaskYouTask的延时。为了观察任务的延时。为了观察任务YouTaskYouTask的延时时间的变化,在钩子函数的延时时间的变化,在钩子函数OSTimeTickHook()OSTimeTickHook()输出了任务输出

37、了任务YouTaskYouTask在延时时间到时的时钟节拍数。在延时时间到时的时钟节拍数。25 4.3.3 获取和设置系统时间获取和设置系统时间p 系统定义一个系统定义一个INT32UINT32U类型的全局变量类型的全局变量OSTimeOSTime来记录系统发生的来记录系统发生的时钟节拍数。时钟节拍数。p OSTimeOSTime在调用在调用OSStart()OSStart()时被初始化为时被初始化为0 0,以后每发生,以后每发生1 1个时钟节个时钟节拍,拍, OSTime的值就被加的值就被加1。p 在应用程序调用在应用程序调用OSTimeGet()OSTimeGet()可获取可获取OSTimeOSTime的值。的值。p 如果如果应用程序调用应用程序调用OSTimeSet(),则可设置,则可设置OSTime的值。的值。INT32U OSTimeGet (void);void OSTimeSet (INT32U ticks);26例程例程3-4:设计一个应用程序,在任务中调用函数设计一个应用程序,在任务中调用函数OSTimeGet()OSTimeGet()函数获得并显示系统的时钟函数获得并显示系统的时钟节拍

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论