μC/OS-Ⅲ系统的中断管理
一、典型的μC/OS-Ⅲ中断服务程序解析
μC/OS-Ⅲ系统中典型有内核参与中断服务程序示例如下:
MyISR: (1)
Disable all interrupts; (2)
Save the CPU registers; (3)
OSIntNestingCtr++; (4)
if(OSIntNestingCtr == 1){ (5)
OSTCBCurPtr->StkPtr = Current task's CPU stack pointer register value;
}
Clear interrupting device; (6)
Re-enable interrupts(optional); (7)
Call user ISR; (8)
OSIntExit(); (9)
Restore the CPU registers; (10)
Return from interrupt; (10)
(1)中断服务程序需要用汇编语言编写,MyISR需要替换为自定义的中断服务程序名称。
(2)在进入中断后进行其他处理前需要关闭所有中断,防止其他中断打断现场保护程序。若CPU对此功能进行硬件处理,则不需软件做任何工作。
(3)现场保护。μC/OS-Ⅲ系统中要求将全部需要进行现场保护的通用寄存器和特殊寄存器存入任务堆栈。
(4)递增OSIntNestingCtr变量,该变量指示中断嵌套层数。
(5)如果OSIntNestingCtr为1表示有任务被打断,进行现场保护时需要将被打断的任务指针保存到OS_TCB中。
(6)完成现场保护后,需要清除中断,以防止退出中断处理函数后重复执行中断。
(7)如果需要实现中断嵌套,此处可以重新打开中断。(可选)
(8)调用用户编写的中断处理程序user ISR。此程序应该尽量精简。
(9)中断服务程序结束后,调用OSIntExit()程序通知系统内核发生中断。在OSIntExit()中会递减OSIntNestingCtr,当发现OSIntNestingCtr为0,即已返回任务级程序,则执行任务调度,有优先级更高的程序需要执行,则直接执行,不再返回中断。若无更高优先级任务,则返回中断。
(10)若能返回中断继续执行,则进行现场恢复。并返回之前中断的任务。
μC/OS-Ⅲ系统中典型无内核参与中断服务程序示例如下:
MyshortISR: (1)
Save enough registers as needed by the ISR; (2)
Clear inter rupting device; (3)
DO NOT re-enable interrupts; (4)
Call user ISR; (5)
Restore the saved CPU registers; (6)
Return from interrupt; (6)
(1)同上,该名称需要替换为自定义中断服务函数名。
(2)此处仅保存中断服务程序需要使用的寄存器。
(3)清中断,避免中断服务程序退出后再次响应中断。
(4)注意此处不可重开中断,因为重开中断后,高优先级中断可能打断此中断执行,若高优先级中断调用系统内核,会导致中断时间变长。
(5)调用中断处理函数。
(6)中断处理完成,恢复CPU寄存器,返回原任务。
问题:此代码中无关中断操作,为何?
二、中断向任务发布消息的方式
(1)直接发布
直接发布方式是指响应中断后,中断处理函数处理了中断所需请求,然后调用系统内核,检测是否有高优先级任务就绪,进行任务调度。此模式下使用关中断方式来保护临界段代码。
(2)延迟发布
延迟发布方式是指响应中断后,中断处理函数对中断请求进行初步处理,然后将中断送入中断队列,等待进一步处理,之后就从中断返回。此模式下使用锁定调度器的方式保护临界段代码。
三、系统节拍中断
基于μC/OS-Ⅲ的系统通常需要底层平台提供一个周期性的定时信号,称为时钟节拍,或系统节拍。该时钟信号周期一般为10~1000Hz。
时钟节拍中断大体与其他中断相同,只是必须调用OSTimeTick()函数。该中断仅用于通知系统时钟节拍的到来。
时钟节拍可以用来实现延时、超时等待等系统功能服务。
μC/OS-Ⅲ系统的中断管理的更多相关文章
- 7.1-uC/OS-III中断管理
在 uC/OS 系统中,中断相当于一个优先级最高的任务.中断一般用于处理比较紧急的事件, 而且只做简单处理,例如标记该事件,带退出中断后再做详细处理.在使用 uC/OS系统时, 一般建议使用信号量. ...
- STM32中断管理函数
CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 ...
- ARM公布“物联网”嵌入式mbed OS系统软件平台
继ARM公司发布了为嵌入式微控制器设计的Cortex-M7架构处理器,ARM又公布了专为廉价低功耗“物联网”设计的新版软件及系统平台,以加速物联网设备的发展及部署.该软件为基于ARM现有Cortex- ...
- 使用VMware Workstation Pro 12 虚拟机安装Mac OS系统教程 全程图解
导读:使用虚拟机安装Windows.Linux或者Ubuntu系统大家或许看了很多,但如何使用VMware Workstation Pro 12安装Mac OS,的确需要好好研究一番:否则无法下手,因 ...
- Linux中断管理
CPU和外设之间的交互,或CPU通过轮询机制查询,或外设通过中断机制主动上报. 对大部分外设中断比轮询效率高,但比如网卡驱动采取轮询比中断效率高. 这里重点关注ARM+Linux组合下中断管理,从底层 ...
- Linux中断管理 (1)Linux中断管理机制
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
- Linux中断管理 (2)软中断和tasklet
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
- Linux中断管理 (3)workqueue工作队列
目录: <Linux中断管理> <Linux中断管理 (1)Linux中断管理机制> <Linux中断管理 (2)软中断和tasklet> <Linux中断管 ...
- linux 的基本操作(linux系统的日常管理)
系统的日常管理 笔者在前面介绍的内容都为linux系统基础类的,如果你现在把前面的内容全部很好的掌握了,那最好了.不过笔者要说的是,即使你完全掌握了,你现在还是不能作为一名合格的linux系统管理员的 ...
- 【swupdate文档 一】嵌入式系统的软件管理
嵌入式系统的软件管理 嵌入式系统变得越来越复杂, 它们的软件也反映了这种复杂性的增加. 为了支持新的特性和修复,很有必要让嵌入式系统上的软件 能够以绝对可靠的方式更新. 在基于linux的系统上,我们 ...
随机推荐
- 通过sharedpreferences实现记住密码功能
通过sharedpreferences实现记住密码功能
- Spark学习(二) -- Spark整体框架
标签(空格分隔): Spark 还记得上次的wordCount程序嘛?通过这个小程序,我们来一窥Spark的框架是什么样子的. sc.textFile("/usr/local/Cellar/ ...
- Vi指令,随时追加
1.设置tab键的空格数 :set tabstop=4 2.显示行号 :set nu
- InfoCube信息立方体的优化
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- QAbstractItemView::setRootIndex(const QModelIndex & index) 失效
问题: 在逻辑中使用了, QAbstractItemView::setRootIndex(const QModelIndex & index), 第一次设置生效, view 进入了model ...
- Virtualbox中不能为虚拟机打开一个新任务的原因及解决方法
VirtualBox新建虚拟机时报错,不能为虚拟机打开一个新任务的原因 解决办法如下 1.保证bios里的virtualization technology的选项开启,不同电脑BIOS设置可能会不一样 ...
- linux内核学习心得
最初在其他课程做实验的时候接触到了linux,震撼于linux的开源精神,想更了解linux的内部原理,选了这门课程.通过这门课程对linux内部实现有了一定的了解,主要是中断.进程切换.系统函数的具 ...
- Error:No suitable device found: no device found for connection "System eth0"
环境描述: Vmware 故障说明: 在克隆几台虚拟机,发现启动后不能配置IP地址等信息,使用linux命令: “ifup eth0”也不能激活网卡, 而在使用"service networ ...
- JavaScript中的防篡改对象
由于JavaScript共享的特性,任何对象都可以被放在同一环境下运行的代码修改. 例如: var person = {name:"caibin'} person.age = 21; 即使第 ...
- 《C++ Primer》学习笔记【第三部分 类设计者的工具】
第13章 拷贝控制 使用default:=defult只能修饰默认构造函数或拷贝控制成员,显式地要去编译器生成合成的版本. 使用delete:=delete通知编译器不希望定义这些成员,禁止试图使用它 ...