7.0-uC/OS-III中断管理
1.CPU的中断处理
理器通常有多个中断源。 例如, UART中断、 DMA中断、 ADC中断、定时器中断等。
2.中断器件标志中断处理器,然后中断处理器将优先级最高的中断
提交给CPU。
现在的中断控制器都是智能的,允许定义中断优先级,记住哪些中断还处于挂起状态。在大多数情况下,中断控制器会直接提供对应ISR的向量地址给CPU 。
如果全局中断被关闭,CPU就会忽视来自于中断控制器的中断请求,但这些请求会在中断控制器中被挂起直到CPU重新开启中断。
3. CPU处理中断有两种模式:
(1).所有的中断指向同一个ISR
(2).每个中断指向各自的ISR
4.典型的中断服务程序
进入中断时 CPU需执行的一些步骤。其中( 2)( 3)( 10)( 11)
是处理器自动完成的。( 4) ~( 9)需用户在ISR中编写。
( 9).ISR的工作完成后,用户必须调用OSIntExit()告诉uC/OS-III
中断服务程序已经完成。 OSIntExit()中将OSIntNestingCtr递减, 如果其值变为0,就意味着ISR将会返回到任务级代码(否则返回前一层的中断)。
中断服务中可能使能了比原任务更高优先级的任务。这时uC/OS-III选择优先级最高的就绪任务或返回原任务。
( 10).如果ISR使能了一个更低优先级的任务, OSIntExit()返回
原任务。
5.短中断服务程序( ISR)
上述顺序的代码是假定ISR会发送信号量或消息给任务。然而,
在很多情况下, ISR不需要发送通知任务, 而是在ISR中直接完成需要的工作(假定需要完成的工作代码较短)。在这种情况下, ISR的结构如下所示:
短ISR程序, 如上所定义, 是一个例外。 它不遵循uC/OS-III的规则,所有uC/OS-III不知道ISR中发生了什么。
6.每个中断向量指向不同的地址
中断向量控制器中的中断向量都指向对应的ISR地址。 ISR中的程序尽可能用汇编写(如章节9-2所示)。当然,这样会导致编程的复杂化。
然而,其中大部分的代码都是从另一个ISR中复制和黏贴的。
除了一些用户要改变的代码。
7.直接提交和延迟提交
uC/OS-III有两种方法处理来自于中断的时间; 直接提交和延迟提交。通过OS_CFH.H中的OS_CFG_ISR_POST_DEFERRED_EN来选
择。当设置为0时, uC/OS-III使用直接提交方法。 当设置为1时,
使用推迟提交方法。
(1).直接提交
( 3)若ISR使能了低于或等于原任务优先级的任务, ISR
结束时, uC/OS-III返回原任务并从被中断处继续执行。
( 4)若ISR使能了高于原任务优先级的任务, ISR结束
后,进入调度。 uC/OS-III切换到高优先级任务。
(2).延迟提交方式
延迟提交方式(通过设置OS_CFG_ISR_POST_DEFERRED_EN为1),代替了关中断方式用于处理临界段。 uC/OS-III锁住调度器,
这可以避免其它任务访问临界段代码。 延迟提交方式中, 中断几乎没被关闭。然而,该方式有点复杂。
( 3) ISR中调用"post"函数发送信号量或消息给任务。然而, 它不是直接发送给任务, 而是先发送到中断队列。 然后中断处理函数被就绪。这是uC/OS-III的内部任务且具有最高优先级(优先级为0)。
( 4) ISR的最后, uC/OS-III会切换到中断处理任务,它将中断队列中消息发送给任务。 在此, 我们关闭中断防止在处理中断队列时被另外的中断程序打断。 最后,
该任务使能中断, 锁住调度器, 提交信息。 信息是在任务级被提交的。 这样, 就是在任务级完成临界段的处理了。
( 5)当中断处理任务清空中断队列时,它就会将自己停止,重
新开启调度器,调用调度器选择下一个任务运行。
( 6)如果优先级更高的任务被使能, uC/OS-III会上换到该任务。
8.直接提交VS延迟提交
在直接提交方式中, uC/OS-III访问临界段时关中断。 然而, 在延
迟提交方式中, uC/OS-III访问临界段时锁调度器。
在延迟提交方式中,访问中断队列时uC/OS-III需要关中断。然而,
这段关中断时间是非常短的且是相当固定的。
如果在应用中关中断时间是关键性的,因为应用中有非常频繁的中断源, 且应用不能接受直接提交方式那样较长的关中断时间。 推荐使用延迟提交方式。
如果多个任务具有相同的优先级或者多个任务等待不同的事件,遍历这些等待的事件任务需要很长的处理时间意味着产生长临界段、挂起多个对象,
它需要很长的临界段、使用广播消息(uC/OS-III在处理广播消息时通过关调度器保护临界段),等这些情况可以使用延迟提交方式。
9.系统时基
uC/OS-III需要一个能提供周期性时间的时基源,叫做系统时基。硬件定时器可以被设置为每秒产生10到1000Hz的中断提供系统时基。也可以从交流电中获得50Hz到60Hz的时基源。
事实上,也可以从交流电中获得100Hz到120Hz的过零点作为时基。
时基可以看做是系统的心跳。它的速率决定于时基源。然而,时基速率越快,系统的额外支出就越大。
时基中断程序必须调用OSTimeTick()。 OSTimeTick() 。
7.0-uC/OS-III中断管理的更多相关文章
- uc/os iii移植到STM32F4---IAR开发环境
也许是先入为主的原因,时钟用不惯Keil环境,大多数的教程都是拿keil写的,尝试将官方的uc/os iii 移植到IAR环境. 1.首先尝试从官网上下载的官方移植的代码,编译通过,但是执行会报堆栈溢 ...
- uC/OS - III 移植 IAR平台
关于移植uC/OS-III 网上已经有很多教程了此处只是做个记录 首先下载源码然后解压得到下面的文件: 然后在模版工程里新建各种文件夹: 最后全部都添加进工程: OK了,编译一下,惊呆了,竟然 0错误 ...
- Linux中断管理
CPU和外设之间的交互,或CPU通过轮询机制查询,或外设通过中断机制主动上报. 对大部分外设中断比轮询效率高,但比如网卡驱动采取轮询比中断效率高. 这里重点关注ARM+Linux组合下中断管理,从底层 ...
- uC/OS II原理分析及源码阅读(一)
uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...
- 基于μC/OS—III的CC1120驱动程序设计
基于μC/OS—III的CC1120驱动程序设计 时间:2014-01-21 来源:电子设计工程 作者:张绍游,张贻雄,石江宏 关键字:CC1120 嵌入式操作系统 STM32F103ZE ...
- uC/OS 的任务调度解析 (转)
uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...
- 【原创】uC/OS II 任务切换原理
今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...
- 7.1-uC/OS-III中断管理
在 uC/OS 系统中,中断相当于一个优先级最高的任务.中断一般用于处理比较紧急的事件, 而且只做简单处理,例如标记该事件,带退出中断后再做详细处理.在使用 uC/OS系统时, 一般建议使用信号量. ...
- 【小梅哥SOPC学习笔记】NIOS II处理器运行UC/OS II
SOPC开发流程之NIOS II 处理器运行 UC/OS II 这里以在芯航线FPGA学习套件的核心板上搭建 NIOS II 软核并运行 UCOS II操作系统为例介绍SOPC的开发流程. 第一步:建 ...
- STM32中断管理函数
CM3 内核支持256 个中断,其中包含了16 个内核中断和240 个外部中断,并且具有256 级的可编程中断设置.但STM32 并没有使用CM3 内核的全部东西,而是只用了它的一部分. STM32 ...
随机推荐
- Centos-7.x 下子网掩码的配置
[背景] 今天在自己的虚拟机上安装上了centos-7.6操作系统,应该是安装的过程中大意了:安装完成后虚拟机可以正常访问外网但是 我的笔记本连接不上虚拟机. 笔记本的IP地址:172.16.192. ...
- Java基础(三)面向对象(下)
接口 接口中成员修饰符是固定的: 成员常量:public static final 成员函数:public abstract 通过接口间接实现了多重继承 接口的特点 接口是对外暴露的规则 接口是程序的 ...
- TypeScript和JavaScript的一些小技巧记录
项目里使用到的技巧,记录一下,会持续更新. JS的技巧完全可以使用到TS上哦. JS 向下取整 Math.floor(4.5); 简写: var num = 4.5; ~~num; num <& ...
- Python基础教程 - Tdcqma
1.1 普通字符串 1.21 错误与异常 1.41 XXXXXX 1.61 XXXXXX 1.81 XXXXXX 1.101 XXXXXX 1.2 转义字符串 1.22 装饰器 1 ...
- Logstash安装和使用
Logstash 是开源的服务器端数据处理管道,能够同时 从多个来源采集数据.转换数据,然后将数据发送到您最喜欢的 “存储库” 中.(我们的存储库当然是 Elasticsearch.) 作用:集中.转 ...
- [转] Android开发之如何保证Service不被杀掉(broadcast+system/app)
转发:原文链接http://blog.csdn.net/mad1989/article/details/22492519 序言 最近项目要实现这样一个效果:运行后,要有一个service始终保持在后台 ...
- layui动态数据表格-分页
数据结构 $list = [ [,'], [,] ]; $json[; $json['; $json[; $json['data'] = $list; return json($json); 代码: ...
- thinkphp3.2在nginx下的配置
最近一直没用nginx 昨天将tp3.2的项目部署到Ubuntu下的nginx下,发现忘记怎么配置的了 特将配置方式记录下来,以方便日后查找 服务器nignx 配置文件 server { listen ...
- TeamViewer 版本v13.2.26558 修改ID
TeamViewer 使用频繁后会被判定为商业用途,不可用.此软件的账号和设备mac地址绑定. 修改TeamViewer ID后可以重新开始使用.下述方法可以成功修改TeamViewer ID. Wi ...
- 单行显示三级分销记录(同表自join)
1)首先是一个简单的三级分销(邀请与被邀请),表结构是酱紫的 CREATE TABLE `d_user_invite` ( `invite_id` ) NOT NULL AUTO_INCREMENT, ...