ucosIII 中断.临界区与时间管理

本文内容简介

讲述了进入和退出中断的方法

临界区的介绍以及延时函数,取消延时函数和获取系统时间

ucosIII中断

中断:应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。

void USART1_IRQHandler(void){ OSIntEnter(); //中断服务程序 OSIntExit();} 1

2

3

4

5

6

进入中断

void OSIntEnter (void){ if (OSRunning != OS_STATE_OS_RUNNING) {//用于确定系统是否正常运行 return } if (OSIntNestingCtr >= (OS_NESTING_CTR)250u) { return; } OSIntNestingCtr++;//中断嵌套的层数}1

2

3

4

5

6

7

8

9

10

OSIntNestingCtr来记录中断嵌套次数,UCOSIII最多支持250级的中断嵌套。退出中断服务函数时要调用函数OSIntExit()。

退出中断

退出函数内部步骤如下:

1.系统是否运行。不符合则退出

2.关闭全局中断

3.中断嵌套次数和任务切换次数记录

4.进行中断级任务切换

void OSIntExit (void){ CPU_SR_ALLOC();//宏定义的CPU_SR if (OSRunning != OS_STATE_OS_RUNNING) { /* Has the OS started? */ return; /* No */ } /*关闭全局中断,包括关闭滴答定时器中断*/ CPU_INT_DIS(); if (OSIntNestingCtr == (OS_NESTING_CTR)0) { /* Prevent OSIntNestingCtr from wrapping */ CPU_INT_EN(); return; } OSIntNestingCtr--;//中断嵌套次数 if (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* ISRs still nested? */ CPU_INT_EN(); /* Yes */ return; } /*OSSchedLockNestingCtr 调度器是否加锁的标志*/ if (OSSchedLockNestingCtr > (OS_NESTING_CTR)0) { /* Scheduler still locked? */ CPU_INT_EN(); /* Yes */ return; } /*获得最高优先级的任务*/ OSPrioHighRdy = OS_PrioGetHighest(); /* Find highest priority */ OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr; /* Get highest priority task ready-to-run */ if (OSTCBHighRdyPtr == OSTCBCurPtr) { /* Current task still the highest priority? */ CPU_INT_EN(); /* Yes */ return; }#if OS_CFG_TASK_PROFILE_EN > 0u OSTCBHighRdyPtr->CtxSwCtr++; /* Inc. # of context switches for this new task */#endif OSTaskCtxSwCtr++; //任务切换的次数 /* Keep track of the total number of ctx switches */#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u) OS_TLS_TaskSw();#endif /*中断级任务调度*/ OSIntCtxSw(); /* Perform interrupt level ctx switch */ CPU_INT_EN();}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

临界区

临界段代码也叫做临界区,是指那些必须完整连续运行,不可被打断的代码段。当访问这些临界段代码的时候需要对这些临界段代码进行保护

宏OS_CFG_ISR_POST_DEFERRED_EN:

0:UCOSIII使用关中断的方式来保护临界段代码

1:采用给调度器上锁的方式来保护临界段代码。

UCOSIII定义了一个进入临界段代码的宏:OS_CRITICAL_ENTER(),定义了两个退出临界段代码的宏:OS_CRITICAL_EXIT和OS_CRITICAL_EXIT_NO_SCHED()。

时间管理

任务延时

UCOSIII中的任务是一个无限循环并且还是一个抢占式内核,为了使高优先级的任务不至于独占CPU,可以给其他优先级较低任务获取CPU使用权的机会,UCOSIII中除空闲任务外的所有任务必须在合适的位置调用系统提供的延时函数或者任务调度函数,让当前的任务暂停运行一段时间并进行一个任务切换。

延时函数有两种,OSTimeDly()—指定节拍数

和OSTimeDlyHMSM()—参数直观。

OSTimeDly()函数有三种工作模式:相对模式、周期模式和绝对模式。

OSTimeDlyHMSM()函数仅在相对模式下工作。

取消任务延时

延时任务任务可通过在其他任务中调用函数OSTimeDlyResume()取消延时而进入就绪状态,此函数最后会引发一次任务调度。

获取和设置系统时间

UCOSIII定义了一个CPU_INT32U类型的全局变量OSTickCtr来记录系统时钟节拍数,在调用OSInit()时被初始化为0,以后每发生1个时钟节拍,OSTickCtr加1。

OSTimeSet()允许用户改变当前时钟节拍计数器的值,慎用!!!!!

OSTimeGet()用来获取动迁时钟节拍计数器的值。

本文内容简介

讲述了进入和退出中断的方法

临界区的介绍以及延时函数,取消延时函数和获取系统时间

ucosIII中断

中断:应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。

void USART1_IRQHandler(void){ OSIntEnter(); //中断服务程序 OSIntExit();} 1

2

3

4

5

6

进入中断

void OSIntEnter (void){ if (OSRunning != OS_STATE_OS_RUNNING) {//用于确定系统是否正常运行 return } if (OSIntNestingCtr >= (OS_NESTING_CTR)250u) { return; } OSIntNestingCtr++;//中断嵌套的层数}1

2

3

4

5

6

7

8

9

10

OSIntNestingCtr来记录中断嵌套次数,UCOSIII最多支持250级的中断嵌套。退出中断服务函数时要调用函数OSIntExit()。

退出中断

退出函数内部步骤如下:

1.系统是否运行。不符合则退出

2.关闭全局中断

3.中断嵌套次数和任务切换次数记录

4.进行中断级任务切换

void OSIntExit (void){ CPU_SR_ALLOC();//宏定义的CPU_SR if (OSRunning != OS_STATE_OS_RUNNING) { /* Has the OS started? */ return; /* No */ } /*关闭全局中断,包括关闭滴答定时器中断*/ CPU_INT_DIS(); if (OSIntNestingCtr == (OS_NESTING_CTR)0) { /* Prevent OSIntNestingCtr from wrapping */ CPU_INT_EN(); return; } OSIntNestingCtr--;//中断嵌套次数 if (OSIntNestingCtr > (OS_NESTING_CTR)0) { /* ISRs still nested? */ CPU_INT_EN(); /* Yes */ return; } /*OSSchedLockNestingCtr 调度器是否加锁的标志*/ if (OSSchedLockNestingCtr > (OS_NESTING_CTR)0) { /* Scheduler still locked? */ CPU_INT_EN(); /* Yes */ return; } /*获得最高优先级的任务*/ OSPrioHighRdy = OS_PrioGetHighest(); /* Find highest priority */ OSTCBHighRdyPtr = OSRdyList[OSPrioHighRdy].HeadPtr; /* Get highest priority task ready-to-run */ if (OSTCBHighRdyPtr == OSTCBCurPtr) { /* Current task still the highest priority? */ CPU_INT_EN(); /* Yes */ return; }#if OS_CFG_TASK_PROFILE_EN > 0u OSTCBHighRdyPtr->CtxSwCtr++; /* Inc. # of context switches for this new task */#endif OSTaskCtxSwCtr++; //任务切换的次数 /* Keep track of the total number of ctx switches */#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u) OS_TLS_TaskSw();#endif /*中断级任务调度*/ OSIntCtxSw(); /* Perform interrupt level ctx switch */ CPU_INT_EN();}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

临界区

临界段代码也叫做临界区,是指那些必须完整连续运行,不可被打断的代码段。当访问这些临界段代码的时候需要对这些临界段代码进行保护

宏OS_CFG_ISR_POST_DEFERRED_EN:

0:UCOSIII使用关中断的方式来保护临界段代码

1:采用给调度器上锁的方式来保护临界段代码。

UCOSIII定义了一个进入临界段代码的宏:OS_CRITICAL_ENTER(),定义了两个退出临界段代码的宏:OS_CRITICAL_EXIT和OS_CRITICAL_EXIT_NO_SCHED()。

时间管理

任务延时

UCOSIII中的任务是一个无限循环并且还是一个抢占式内核,为了使高优先级的任务不至于独占CPU,可以给其他优先级较低任务获取CPU使用权的机会,UCOSIII中除空闲任务外的所有任务必须在合适的位置调用系统提供的延时函数或者任务调度函数,让当前的任务暂停运行一段时间并进行一个任务切换。

延时函数有两种,OSTimeDly()—指定节拍数

和OSTimeDlyHMSM()—参数直观。

OSTimeDly()函数有三种工作模式:相对模式、周期模式和绝对模式。

OSTimeDlyHMSM()函数仅在相对模式下工作。

取消任务延时

延时任务任务可通过在其他任务中调用函数OSTimeDlyResume()取消延时而进入就绪状态,此函数最后会引发一次任务调度。

获取和设置系统时间

UCOSIII定义了一个CPU_INT32U类型的全局变量OSTickCtr来记录系统时钟节拍数,在调用OSInit()时被初始化为0,以后每发生1个时钟节拍,OSTickCtr加1。

OSTimeSet()允许用户改变当前时钟节拍计数器的值,慎用!!!!!

OSTimeGet()用来获取动迁时钟节拍计数器的值。


相关内容

  • 操作系统答案(考试重点题目答案)
  • 1.2 操作系统以什么方式组织用户使用计算机? 答:操作系统以进程的方式组织用户使用计算机.用户所需完成的各种任务必须由相应的程序来表达出来.为了实现用户的任务,必须让相应功能的程序执行.而进程就是指程序的运行,操作系统的进程调度程序决定CPU 在各进程间的切换.操作系统为用户提供进程创建和结束等的 ...

  • 关于长日照植物与短日照植物的问题
  • 一.概念 1.长日照植物: 只有当日照长度超过临界日长(14-17小时),或者说暗期必须短于某一时数才能形成花芽的植物.否则不能形成花芽,只停留在营养生长阶段.长日照植物有冬小麦.大麦.油菜.萝卜等,纬度超过60°的地区,多数植物是长日照植物. 2.短日照植物: 只有当日照长度短于其临界日长(少于1 ...

  • 渗透破坏的成因和分类
  • 第一节 渗透破坏的成因和分类 发布时间:2008-11-18 16:8:24 稿件来源: [字体调整:大 中 小] 只要堤防的临水侧和背水侧存在水头差,堤防就有渗流产生.随着汛期水位的升高,堤身内的浸润线逐步形成并不断抬高,堤基和堤身内的渗透比降也逐渐增大.当渗流产生的实际渗透比降J大于土的临界渗透 ...

  • 嵌入式助理工程师硬件试题
  • 嵌入式硬件助理工程师认证考试试题题库 一. 选择题 1.以下说法不正确的是(B ). A.任务可以有类型说明 B.任务可以返回一个数值 C.任务可以有形参变量 D.任务是一个无限循环 2.用图形点阵的方式显示一个16*16点阵汉字需要(B )字节. A.8 B.32 C.16 D.64 3.下列描述 ...

  • 各种泵的原理
  • 电磁阀工作原理在气路(或液路) 上来说,两位三通电磁阀具有1个进气孔(接进气气源) .1个出气孔(提供给目标设备气源) .1个排气孔(一般安装一个消声器,如果不怕噪音的话也可以不装. 两位五通电磁阀具有1个进气孔(接进气气源) .1个正动作出气孔和1个反动作出气孔(分别提供给目标设备的一正一反动作的 ...

  • OS练习题带答案1
  • 操作系统练习题-习题加答案 注:本答案只提供参考只用,中间不免有些错误,可以QQ或当面大家交流,也希望不要把这个当成期末的宝贝,只背答案是不行的,能理解尽量理解的了,加油!!! 1~3章(引论.处理机管理) 1.现代操作系统的特征是: 并发 . 共享 . 虚拟 . 异步 . 2.进程与进程控制块(P ...

  • VxWorks操作系统及实时多任务程序设计
  • VxWorks 操作系统及实时多任务程序设计 刘尉悦 张万生 邢涛 王砚方 (中国科技大学近代物理系,合肥,230027) 摘要 :数字式声纳系统需要实时的显示其搜索.跟踪结果,同时对用户命令作出及时的响应,并实时控制前端的硬件.本文介绍基于VxWorks 实时操作系统和X 窗口系统的显示及控制程序 ...

  • 作用在明钢管上的力
  • 第四节 作用在明钢管上的力 一.力和荷载种类 (一) 力 1.内水压力: (1) (1) 正常蓄水位的静水压力: (2) (2) 正常工作情况最高压力(正常蓄水位, 丢弃全负荷) : (3) (3) 特殊工作情况最高压力(最高发电水位, 丢弃全负荷) : (4) (4) 水压试验内水压力: 2.钢管 ...

  • 操作系统填空题
  • 第一.二章 二.填空 39. 操作系统的基本功能包括(处理器管理)(存储管理)(设备管理)(文件管理)及接口功能. 40. 按内存中同时运行程序的数目可以将批处理系统分为两类:(单道批处理)(多道批处理) 41. (并发)和(共享)是操作系统的两个最基本的特征,两者之间互为存在条件. 42. 进程的 ...