第6章时间管理_第1页
第6章时间管理_第2页
第6章时间管理_第3页
第6章时间管理_第4页
第6章时间管理_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、第第6章章 时间管理时间管理l 时钟l 时钟中断服务程序l C/OS-II的时钟l C/OS-II的时间管理函数时钟:操作系统需要一个周期性的信号源,以供处理时钟:操作系统需要一个周期性的信号源,以供处理与时间有关的事件与时间有关的事件 大多数嵌入式系统有两种时钟源: 实时时钟(real time clock,RTC) 定时器/计数器实时时钟:实时时钟: 一般靠电池供电,即使系统断电,也可以维持一般靠电池供电,即使系统断电,也可以维持日期和时间。日期和时间。 靠电压周期产生中断来计时靠电压周期产生中断来计时 实时时钟独立于操作系统,所以也被称为实时时钟独立于操作系统,所以也被称为硬件硬件时钟时

2、钟,为整个系统提供一个,为整个系统提供一个计时标准计时标准。 大多数嵌入式系统有两种时钟源: 实时时钟(real time clock,RTC) 定时器/计数器(可编程时钟)系统(系统(OSOS)时钟)时钟 系统时钟是指操作系统中的内部计数器,是一个可编程系统时钟是指操作系统中的内部计数器,是一个可编程时钟时钟 系统时钟的系统时钟的粒度粒度是是时钟中断到来的频率,就是时钟中断到来的频率,就是2个时钟个时钟中断之间的时间间隔,是中断之间的时间间隔,是OS时钟的计时单位时钟的计时单位 时钟粒度的大小决定了操作系统的时间精度以及对外界时钟粒度的大小决定了操作系统的时间精度以及对外界的响应速度的响应速

3、度第第6章章 时间管理时间管理l 时钟l 时钟中断服务程序l C/OS-II的时钟l C/OS-II的时间管理及应用实例时钟硬件根据已知时间间隔产生中断。时钟中断程序完成时钟硬件根据已知时间间隔产生中断。时钟中断程序完成相应功能相应功能时钟中断程序一般做:维护日时间防止进程超时运行对CPU的使用情况记账处理用户进程提出的报警系统调用为系统本身的各个部分提供监视定时器完成概要剖析、监视和统计信息收集第第6章章 时间管理时间管理l 时钟l 时钟中断服务程序l C/OS-II的时钟l C/OS-II的时间管理及应用实例6.3 C/OS-II的时钟 用硬件定时器产生一个周期为毫秒(ms)级的周期性中断

4、来实现系统时钟。 最小的时钟单位就是两次中断之间间隔的时间,叫时钟节拍(time tick) 硬件定时器以时钟节拍为周期定时产生中断,该中断的中断服务程序叫做OSTickISR()。 这个中断服务程序通过调用函数OSTimeTick()来完成系统在每个时钟节拍时需要做的工作。C/OS-II的中断服务子程序ISROSTickISR()()OSTimeTick()()时钟节拍函数OSTimeTick()void OSTimeTick (void)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif OS_TCB *ptcb; OSTimeTickHook

5、(); #if OS_TIME_GET_SET_EN0 OS_ENTER_CRITICAL(); OSTime+; OS_EXIT_CRITICAL();#endif时钟节拍数时钟节拍数 If(OSRunning=TRUE) ptcb = OSTCBList; while (ptcb-OSTCBPrio != OS_IDLE_PRIO) OS_ENTER_CRITICAL(); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) if (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) OSRdyGrp |= ptcb-

6、OSTCBBitY; OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OSTCBDly = 1; ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); 允许任务等待时的最多节拍数允许任务等待时的最多节拍数时钟节拍函数OSTimeTick()做两件事: 节拍数加1 沿着OS_TCB链表,直到空闲任务,把各个任务的时间延迟项OSTCBDly减1,当该项为0时,如果该任务没有被挂起,该任务进入就绪状态OSTimeTick()扩展void OSTimeTick (void)#if OS_CRITICAL_METHOD=3

7、 OS_CPU_SR cpu_sr;#endif OS_TCB *ptcb; OSTimeTickHook(); #if OS_TIME_GET_SET_EN0 OS_ENTER_CRITICAL(); OSTime+; OS_EXIT_CRITICAL();#endif如果想对节拍函数功能扩展,可如果想对节拍函数功能扩展,可以写以写在OSTimeTickHook()中,中,放入放入OS_CPU.C中断服务子程序OSTickISR()还可以分解 将中断服务功能分成2 2部分: 中断服务程序通常都只处理一些必要的操作,其他操作则通过任务通过任务的方式来进行。 用来配合中断服务程序的另外的任务通常

8、被称为DSR(deferred service routine)。 为什么要分解?为什么要分解?由于中断服务程序中通常都对中断进行了屏蔽,要求中断服务程序应该由于中断服务程序中通常都对中断进行了屏蔽,要求中断服务程序应该尽可能尽可能比较短比较短,保证其他中断和系统中的任务能够得到及时处理,保证其他中断和系统中的任务能够得到及时处理时钟中断服务可以分解为ISR+DSRvoid TickTask (void *pdata) pdata = pdata; for (;) OSMboxPend(.); /* 等待从时钟节拍中断服务程序发来的信号 */ OSTimeTick(); OSTickISR()

9、如下:void OSTickISR(void) 保存处理器寄存器的值; 调用OSIntEnter()或是将OSIntNesting加1; 发送一个空消息(例如, (void *)1)到时钟节拍任务的邮箱; 调用OSIntExit(); 恢复处理器寄存器的值; 执行中断返回指令;第第6章章 时间管理时间管理l 时钟l 时钟中断服务程序l C/OS-II的时钟l C/OS-II的时间管理函数C/OS-II的时间管理函数 任务延时函数OSTimeDly() 按时分秒延时函数 OSTimeDlyHMSM() 取消任务的延时函数,OSTimeDlyResume() 设置系统时间OSTimeSet() 获

10、取系统时间OSTimeGet()任务延时函数OSTimeDly()函数OSTimeDly()的原型如下:void OSTimeDly (INT16U ticks); 参数:ticks表示要延时的时钟节拍数。 返回值:无作用:让出作用:让出cpu的控制权!每个任务都要调用!的控制权!每个任务都要调用! ticks的值会存放在TCB中的INT16U OSTCBDly; 会引发调度!会引发调度! 按时分秒延时函数 OSTimeDlyHMSM()函数OSTimeDlyHMSM()的原型如下:OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds,

11、 INT8U milli);参数:hours:延时小时数,范围从0-255。minutes:延时分钟数,范围从0-59。seconds:延时秒数,范围从0-59milli:延时毫秒数,范围从0-999。返回值:OS_NO_ERR:函数调用成功。OS_TIME_INVALID_MINUTES:参数错误,分钟数大于59。OS_TIME_INVALID_SECONDS:参数错误,秒数大于59。OS_TIME_INVALID_MILLI:参数错误,毫秒数大于999。OS_TIME_ZERO_DLY:四个参数全为0。调用了函数OSTimeDly( )或OSTimeDlyHMSM( )的任务,当规定的延时

12、时间期满,或有其他任务通过调用函数OSTimeDlyResume( )取消了延时时,它会立即进入就绪状态。取消任务的延时函数OSTimeDlyResume()函数OSTimeDlyResume()的原型如下:OSTimeDlyResume(INT8U prio) 参数:prio:指定要唤醒任务的优先级。返回值:返回值:OS_NO_ERR:函数调用成功。:函数调用成功。OS_PRIO_INVALID:参数指定的优先级大于:参数指定的优先级大于OS_LOWEST_PRIO。OS_TIME_NOT_DLY:要唤醒的任务不在延时状态。:要唤醒的任务不在延时状态。OS_TASK_NOT_EXIST:指定

13、的任务不存在。:指定的任务不存在。任务的基本状态图3-2 任务的状态转换图举例1、创建三个函数:main、 MyTask、 YouTask。2、 MyTask输出M, YouTask输出Y3、 YouTask调用延时函数OSTimeDly( )进行延时。在任务MyTask中还调用了函数OSTimeDlyResume(prio)取消了任务YouTask的延时。应用程序代码如下:/*TEST*/#include “includes.h”#define TASK_STK_SIZE 512 /任务堆栈长度OS_STK MyTaskStkTASK_STK_SIZE; /定义任务堆栈区OS_STK You

14、TaskStkTASK_STK_SIZE; /定义任务堆栈区INT16S key; /用于退出c/os-II的键INT8U x=0,y=0; /字符显示位置void MyTask(void *data); /声明任务void YouTask(void *data); /声明任务/*主函数*/void main(void) char * s_M=“M”; /定义要显示的字符 OSInit( ); /初始化c/os-II PC_DOSSaveReturn( ); /保存保存DOS环境环境 PC_VectSet(uCOS,OSCtxSw); /安装安装c/os-II中断中断 OSTaskCreate

15、(MyTask, /创建任务MyTask s_M, /给任务传递参数 &MyTaskStkTASK_STK_SIZE-1, /设置任务堆栈栈顶指针 0); /使任务的优先级别为0 OSStart( ); /启动c/os-II的多任务管理/*任务MyTask*/void MyTask(void *pdata) char * s_Y=“Y”; /定义要显示的字符#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata; OS_ENTER_CRITICAL( ); PC_VectSet(0 x08,OSTickISR); /安装

16、c/os-II时钟中断向量 PC_SetTickRate(OS_TICKS_PER_SEC); /设置c/os-II时钟频率 OS_EXIT_CRITICAL( ); OSStatInit( ); /初始化c/os-II的统计任务 OSTaskCreate(YouTask, s_Y, &YouTaskStkTASK_STK_SIZE-1, 2); for( ; ; ) if(x50) x=0; y+=2; if(y1) OSTimeDlyResume(2); /取消YouTask任务的延时 PC_DispChar(x,y, /显示字符的位置 *(char *)pdata, DISP_B

17、GND_BLACK+DISP_FGND_WHITE); x+=1; /如果按下ESC键,则退出c/os-II if(PC_GetKey(&key)=TRUE) if(key=0 x1B) PC_DOSReturn( ); OSTimeDly(100); /延时100个时钟节拍 /*任务youtask*/void YouTask(void *pdata)#if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata;for( ; ; ) if(x50) x=0; y+=2; PC_DispChar(x,y, /显示字符的位置 *(

18、char *)pdata, DISP_BGND_BLACK+DISP_FGND_WHITE); x+=1; OSTimeDly(500); /延时500个时钟节拍 设置与获取系统时间OSTimeSet()设置系统时间原型如下:Void OSTimeSet(INT32U ticks); 参数:Ticks:要设置的时钟数,单位是时钟节拍数。INT32u OSTime获取系统时间原型如下:INT32U OSTimeGet(Void); 返回值:时钟节拍数。举例设计一个应用程序,在任务中调用函数设计一个应用程序,在任务中调用函数OSTimeGet()获得获得并显示系统的时钟节拍数并显示系统的时钟节拍数

19、OSTime。当任务运行。当任务运行10s时,调用时,调用函数函数OSTimeSet()将将OSTime设置为设置为10应用程序的代码如下:/*TEST*/#include “includes.h”#define TASK_STK_SIZE 512 /任务堆栈长度OS_STK TaskStartStkTASK_STK_SIZE; /定义任务堆栈区INT16S key; /用于退出c/os-II的键INT32U stime; /存放节拍的变量INT8U x=0; void MyTask(void *data); /声明任务/*主函数*/void main(void) OSInit( ); /初始

20、化c/os-II PC_DOSSaveReturn( ); /保存DOS环境 PC_VectSet(uCOS,OSCtxSw); /安装c/os-II中断 OSTaskCreate( MyTask, /创建任务MyTask (void*)0, /给任务传递参数 &TaskStartStkTASK_STK_SIZE-1, /设置任务堆栈栈顶指针 0); /使任务的优先级别为0 OSStart( ); /启动c/os-II的多任务管理/*任务MyTask*/void MyTask(void *pdata) char s5 #if OS_CRITICAL_METHOD=3 OS_CPU_SR cpu_sr;#endif pdata=pdata; OS_ENTER_CRITICAL( ); PC

温馨提示

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

评论

0/150

提交评论