第三章 中断与时钟_第1页
第三章 中断与时钟_第2页
第三章 中断与时钟_第3页
第三章 中断与时钟_第4页
第三章 中断与时钟_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、嵌入式系统嵌入式系统 Embedded System教师:白华教师:白华邮箱:邮箱:电话:电话公室:办公室:4A-4092.2.4 任务的其他管理函数任务的其他管理函数堆栈检验:堆栈检验:OSTaskStkChk() 确定任务实际需要的堆栈空间大小确定任务实际需要的堆栈空间大小删除任务:删除任务:OSTaskDel() 任务休眠,任务代码并未删除,只是不再被调用任务休眠,任务代码并未删除,只是不再被调用请求删除任务:请求删除任务:OSTaskDelReq()改变任务的优先级:改变任务的优先级:OSTaskChangePrio()挂起任务:挂起任务:OSTaskSusp

2、end() 空闲任务不能被挂起空闲任务不能被挂起恢复任务:恢复任务:OSTaskResume() 被挂起的任务只能通过该函数恢复被挂起的任务只能通过该函数恢复获得任务信息:获得任务信息:OSTaskQuery() 获得指定任务的获得指定任务的OS_TCB中内容的拷贝中内容的拷贝2.3 例程解析例程解析共有共有10个任务在屏幕随机的位置上显示一个个任务在屏幕随机的位置上显示一个09的数字。的数字。每个任务只显示同一个数字,也就是其中一个任务在随每个任务只显示同一个数字,也就是其中一个任务在随机位置显示机位置显示0,另一个显示,另一个显示1,等等。,等等。该例程目的在于演示该例程目的在于演示m m

3、C/OS-II的多任务处理能力。的多任务处理能力。#include includes.hincludes.h是主控头文件,包含所有相关的头文是主控头文件,包含所有相关的头文件,从此可使用系统提供的数据类型、系统函数件,从此可使用系统提供的数据类型、系统函数和全局变量等。和全局变量等。#define TASK_STK_SIZE 512 #define N_TASKS 10定义两个常数:定义两个常数:TASK_STK_SIZE表示堆栈可容纳的表示堆栈可容纳的指针元数目;指针元数目;N_TASKS表示需要建立的任务数。表示需要建立的任务数。OS_STK TaskStk N_TASKS TASK_ST

4、K_SIZE; OS_STK TaskStartStk TASK_STK_SIZE;char TaskData N_TASKS; OS_EVENT *RandomSem;定义不同类型的变量(或数组)定义不同类型的变量(或数组)void Task(void *data); void TaskStart(void *data); static void TaskStartCreateTasks(void);static void TaskStartDispInit(void);static void TaskStartDisp(void);自定义函数声明自定义函数声明前往第17页void main

5、 (void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); RandomSem = OSSemCreate(1); OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0); OSStart();PC_DispClrScr()为系统函数,具有为系统函数,具有清屏功能。()中的参数表示前景色清屏功能。()中的参数表示前景色为白色,背景色为黑色。为白

6、色,背景色为黑色。void main (void) PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_BLACK); OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); RandomSem = OSSemCreate(1); OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0); OSStart();非常重要的系统函数,执行非常重要的系统函数,执行C/OS-II的初始化。的初始化。l在使用在使用C/OS-IIC/O

7、S-II的所有服务之前,必须要调用的所有服务之前,必须要调用C/OS-IIC/OS-II的初始化的初始化函数函数OSInit( )OSInit( )对对C/OS-IIC/OS-II自身的运行环境进行初始化。自身的运行环境进行初始化。l函数函数OSInit( )OSInit( )将对将对C/OS-IIC/OS-II的所有的全局变量和数据结构进行初的所有的全局变量和数据结构进行初始化,同时创建空闲任务始化,同时创建空闲任务OSTaskIdleOSTaskIdle,并赋之以最低的优先级别和,并赋之以最低的优先级别和永远的就绪状态。如果用户应用程序还要使用统计任务的话(常数永远的就绪状态。如果用户应用

8、程序还要使用统计任务的话(常数OS_TASK_STAT_EN=1OS_TASK_STAT_EN=1),则),则OSInit( )OSInit( )还要以优先级别为还要以优先级别为OS_LOWEST_PRIO-1OS_LOWEST_PRIO-1来创建统计任务。来创建统计任务。 l初始化函数初始化函数OSInit( )OSInit( )对数据结构进行初始化时,主要要创建对数据结构进行初始化时,主要要创建5 5个空个空数据缓冲区(任务控制块、事件控制块、消息队列控制块、标志控数据缓冲区(任务控制块、事件控制块、消息队列控制块、标志控制块、存储控制块)。制块、存储控制块)。l为了可以快速地查询任务控制

9、块链表中的各个元素,初始化函数为了可以快速地查询任务控制块链表中的各个元素,初始化函数OSInit( )OSInit( )还要创建一个数组还要创建一个数组OSTCBPrioTblOS_LOWEST_PRIO + 1OSTCBPrioTblOS_LOWEST_PRIO + 1,在这个数组中,按任务的优先级别的顺序把任务控制块的指针存放在这个数组中,按任务的优先级别的顺序把任务控制块的指针存放在了对应的元素中。在了对应的元素中。2.3.1 C/OS-IIC/OS-II的初始化(的初始化(OSInit()OSInit()函数)函数)void main (void) PC_DispClrScr(DIS

10、P_FGND_WHITE + DISP_BGND_BLACK); OSInit(); PC_DOSSaveReturn(); PC_VectSet(uCOS, OSCtxSw); RandomSem = OSSemCreate(1); OSTaskCreate(TaskStart, (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0); OSStart();PC_DOSSaveReturn(); /* 返回到没有运行返回到没有运行mCOS-II之前的之前的DOS环境环境 */PC_VectSet(uCOS, OSCtxSw); /* 指定任务切换处理函数指

11、定任务切换处理函数 */RandomSem = OSSemCreate(1); /* 建立一个信号量建立一个信号量 */信号量是由信号量是由m mC/OS-II提供的一种机制,用于防止多提供的一种机制,用于防止多个任务同时访问同一资源(如产生随机数的函数)。个任务同时访问同一资源(如产生随机数的函数)。这里信号量初值设置为这里信号量初值设置为1,通知,通知m mC/OS-II在某一时在某一时刻只有一个任务可以调用随机数产生函数。该信号刻只有一个任务可以调用随机数产生函数。该信号量建立函数返回一个指向信号量的指针。量建立函数返回一个指向信号量的指针。OSTaskCreate(TaskStart,

12、 (void *)0, &TaskStartStkTASK_STK_SIZE - 1, 0);/* 在开始多任务之前,必须建立至少一个任务。这里建立了一个叫做在开始多任务之前,必须建立至少一个任务。这里建立了一个叫做TaskStart()的任务的任务 */OSStart(); /* 将控制权交给将控制权交给m mC/OS-II内核,开始运行多任务内核,开始运行多任务 */2.3.2 C/OS-IIC/OS-II的启动(的启动(OSStart()OSStart()函数)函数)多任务的启动是通过多任务的启动是通过OSStart()实现的。实现的。在启动在启动m mC/OS-II之前,至少须建立一个

13、应用任务。之前,至少须建立一个应用任务。OSStart()函数完成以下两个工作:函数完成以下两个工作:从任务就绪表中找出用户建立的优先级最高的任务的任务控制块,从任务就绪表中找出用户建立的优先级最高的任务的任务控制块,将该任务设为当前任务。将该任务设为当前任务。将上述任务的堆栈中保存的值弹回到将上述任务的堆栈中保存的值弹回到CPUCPU寄存器中,然后执行一寄存器中,然后执行一条中断返回指令,强制执行该任务代码。条中断返回指令,强制执行该任务代码。当当OSStart()执行后,即多任务启动以后,系统将在用户任执行后,即多任务启动以后,系统将在用户任务之间,或用户任务与系统任务之间切换,不再返回到

14、主函务之间,或用户任务与系统任务之间切换,不再返回到主函数数main()。void TaskStart (void *pdata) #if OS_CRITICAL_METHOD = 3 OS_CPU_SR cpu_sr; #endif char s100; INT16S key; pdata = pdata; TaskStartDispInit(); OS_ENTER_CRITICAL(); PC_VectSet(0 x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); OSStatInit(); Task

15、StartCreateTasks(); 与进入临界段代码的方式有与进入临界段代码的方式有关关定义定义16位变量位变量key,用于按键输入,用于按键输入本任务无参数传递,未使用本任务无参数传递,未使用pdata,但为,但为了避免编译器警告,故执行该语句了避免编译器警告,故执行该语句初始化屏幕显示,作者自定义的函数,初始化屏幕显示,作者自定义的函数,详见光盘中的源程序代码详见光盘中的源程序代码处理临界段代码处理临界段代码1)处理临界段代码)处理临界段代码关中断关中断 处理完成后处理完成后开中断开中断 注:开注:开/关中断的方法与编译器相关。关中断的方法与编译器相关。2)C/OS-II定义了两个宏(

16、定义了两个宏(macros)来开中断和关中断:)来开中断和关中断: OS_ENTER_CRITICAL( ) OS_EXIT_CRITICAL( ) 这两个宏的定义取决于微处理器,在文件这两个宏的定义取决于微处理器,在文件OS_CPU.H中可以找到相应的中可以找到相应的宏定义,而每种微处理器都有自己的宏定义,而每种微处理器都有自己的OS_CPU.H2.3.3 临界段代码(临界段代码(critical sectionscritical sections)代码的临界段也称为临界区,指处理时不可分割的代码。代码的临界段也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则一旦这部分代码开始

17、执行,则不允许任何中断打入不允许任何中断打入,因此在进,因此在进入临界段之前必须关中断,而临界段代码执行完后,要立即开入临界段之前必须关中断,而临界段代码执行完后,要立即开中断。中断。OS_ENTER_CRITICAL( )OS_ENTER_CRITICAL( )、 OS_EXIT_CRITICAL( )OS_EXIT_CRITICAL( )具体实现具体实现方法有方法有3 3种种1 1)OS_CRITICAL_MATHODOS_CRITICAL_MATHOD1 1 用处理器的关中断指令完成用处理器的关中断指令完成OS_ENTER_CRITICAL( )OS_ENTER_CRITICAL( )

18、用处理器的开中断指令完成用处理器的开中断指令完成OS_EXIT_CRITICAL( )OS_EXIT_CRITICAL( )2 2)OS_CRITICAL_MATHODOS_CRITICAL_MATHOD2 2 在堆栈中保存中断的开在堆栈中保存中断的开/ /关状态,然后再关中断,实现关状态,然后再关中断,实现OS_ENTER_CRITICAL( )OS_ENTER_CRITICAL( ) 从堆栈中弹出原来的中断开从堆栈中弹出原来的中断开/ /关状态,实现关状态,实现OS_EXIT_CRITICAL( ) OS_EXIT_CRITICAL( ) define OS_ENTER_CRITICAL(

19、 ) asm(“push psw”) asm(“DI”)define OS_EXIT_CRITICAL( ) asm(“pop psw”) 3) OS_CRITICAL_MATHOD3 一些编译器提供了扩展功能,用户可以得到当前处理一些编译器提供了扩展功能,用户可以得到当前处理器状态字的值,并保存在器状态字的值,并保存在C函数的局部变量中,这个函数的局部变量中,这个变量可以恢复变量可以恢复PSW。 #define OS_ENTER_CRITICAL() cpu_sr = get_processor_psw(); disable_interrupts(); #define OS_EXIT_CRI

20、TICAL() set_processor_psw(cpu_sr);如果使用这种方式保护临界段代码,则须在应用程序的相关如果使用这种方式保护临界段代码,则须在应用程序的相关函数中多定义一个局部变量函数中多定义一个局部变量cpu_srcpu_sr。void TaskStart (void *pdata) #if OS_CRITICAL_METHOD = 3 OS_CPU_SR cpu_sr; #endif char s100; INT16S key; pdata = pdata; TaskStartDispInit(); OS_ENTER_CRITICAL(); PC_VectSet(0 x08

21、, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXIT_CRITICAL(); OSStatInit(); TaskStartCreateTasks(); 把计算机本来为时钟节拍提供的中断把计算机本来为时钟节拍提供的中断服务程序替换成服务程序替换成m mC/OS-II需要用到的需要用到的时钟节拍中断服务程序时钟节拍中断服务程序设置时钟节拍的频率为设置时钟节拍的频率为200HzOS_TICKS_PER_SEC = 200通过该函数得知处理器在运行所有应用任务通过该函数得知处理器在运行所有应用任务时实际的时实际的CPU使用率使用率这是作者自定

22、义的一个函数,其作用是建立更多这是作者自定义的一个函数,其作用是建立更多的任务的任务接上页程序接上页程序 for (;) TaskStartDisp(); if (PC_GetKey(&key) = TRUE) if (key = 0 x1B) PC_DOSReturn(); OSCtxSwCtr = 0; OSTimeDlyHMSM(0, 0, 1, 0); 无限循环无限循环作者自定义的显示函数,在作者自定义的显示函数,在DOS窗口底部显窗口底部显示任务数、示任务数、CPU利用率等相关信息利用率等相关信息判断是否有按键输入判断是否有按键输入如果按下键为如果按下键为Esc返回返回DOS环境环境

23、如果没有按下如果没有按下Esc键,记录任务切换次数的键,记录任务切换次数的全局变量全局变量OSCtxSwCtr清零,以便记录下一清零,以便记录下一秒内发生的任务切换次数秒内发生的任务切换次数延时函数,()中从左到右分别表示时、分、秒、毫秒。任延时函数,()中从左到右分别表示时、分、秒、毫秒。任务调用该函数将自身挂起务调用该函数将自身挂起1秒,交出秒,交出CPU使用权,内核开始使用权,内核开始调度,找到下一个最高优先级的就绪任务调度,找到下一个最高优先级的就绪任务static void TaskStartCreateTasks (void) INT8U i; for (i = 0; i OSTC

24、BStkPtr = SP;清中断源;清中断源;重新开中断;重新开中断;执行用户代码做中断服务;执行用户代码做中断服务;调用调用OSIntExit( );恢复所有恢复所有CPU寄存器;寄存器;执行中断返回指令;执行中断返回指令;进入中断函数进入中断函数 OSIntEnter()void OSIntEnter (void) if (OSRunning = TRUE if ( OSIntNesting 0 ) OSIntNesting-; if (OSIntNesting | OSLockNesting) = 0) OSIntExitY = OSUnMapTblOSRdyGrp; OSPrioHig

25、hRdy = (INT8U)(OSIntExitY 3) + OSUnMapTblOSRdyTblOSIntExitY); if (OSPrioHighRdy != OSPrioCur) OSTCBHighRdy = OSTCBPrioTblOSPrioHighRdy; OSCtxSwCtr+; OSIntCtxSw(); /* 调用中断切换函数,而非任务切换函数调用中断切换函数,而非任务切换函数 */ OS_EXIT_CRITICAL();退出中断函数退出中断函数 OSIntExit()l时钟:任何操作系统都要提供一个周期性的信号源,以提供系统处理诸如时钟:任何操作系统都要提供一个周期性的信

26、号源,以提供系统处理诸如延时、超时等与时间有关的事件,这个周期性的信号源称之为时钟。延时、超时等与时间有关的事件,这个周期性的信号源称之为时钟。l时钟节拍:最小的时钟单位称之为时钟节拍(时钟节拍:最小的时钟单位称之为时钟节拍(Time Tick)。)。l硬件定时器以时钟节拍为周期定时产生中断,其服务子程序称为硬件定时器以时钟节拍为周期定时产生中断,其服务子程序称为OSTickISR()。()。l中断服务程序调用中断服务程序调用OSTimeTick()来完成系统在每个时钟节拍需要做的()来完成系统在每个时钟节拍需要做的工作如下:工作如下: (1)给计数器)给计数器OSTime1 (2)遍历任务控制块链表中的所有任务控制块,把各个任务块中用来存放任务延)遍历任务控制块链表中的所有任务控制块,把各个任务块中用来存放任务延

温馨提示

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

评论

0/150

提交评论