freeRTOS中文实用教程3--中断管理之延迟中断处理
1.前言
嵌入式实时操作系统需要对整个系统环境产生的事件作出响应。可以采用中断方式也可以采用轮询方式来进行处理。如果采用中断方式,则希望ISR(中断服务例程)的处理时间越短越好。
注:必须说明的是,只有以”FromISR”或”FROM_ISR”结束的API 函数或宏才可以在中断服务例程中。
2. 延迟中断处理

图 利用二值信号量实现中断与任务同步

- 延迟中断的实现
(1)通过在中断处理中增加二值信号量,中断发生时解除任务的阻塞状态,让任务得以执行,相当于让任务与中断同步;
(2)这样中断处理例程中就可以做少量的事情,大量的工作放到同步任务中完成;
(3)将工作量大的事情交给解除阻塞的同步任务来执行,从这个角度上看,中断处理被延迟了,所以称为延迟中断处理。
注:二值信号量可以理解成一个深度为1的队列。
- 延迟中断同步任务优先级
(1)如果中断处理特别紧急,可以将中断退出后的同步任务优先级设为最高,保证中断延迟处理任务随时可以中断其它任务;
(2)由于中断同步任务紧跟中断处理函数执行,相当于所有的处理都在ISR中完成一样
注:中断延迟是ISR give信号量,任务take信号量,且再也不用give,这种用法很类似于队列的用法,与其它的任务同步方法有所区别
3. 相关处理流程举例

- 处理流程介绍
(1)handler任务具有比periodic任务高的优先级,handler任务中等待信号量,在periodic任务中触发中断;
(2)中断处理函数中执行give操作后,并通过一次显示的任务调度保证切换到handler任务处理;
(3)handler任务获取信号量后继续执行,之后将执行periodic任务
- 上例中二值信号量的流程
1. 中断产生。
2. 中断服务例程启动,给出信号量以使延迟处理任务解除阻塞。
3. 当中断服务例程退出时,延迟处理任务得到执行。延迟处理任务做的第一件事便是
获取信号量。
4. 延迟处理任务完成中断事件处理后,试图再次获取信号量——如果此时信号量无效,
任务将切入阻塞待等待事件发生。
4.相关的API处理
| API | 说明 | 参数及返回值 |
| vSemaphoreCreateBinary | 创建二值信号量 |
xSemaphore 创建的信号量 |
| xSemaphoreTake |
获取(Obtain)”或”接收(Receive)”信号量。只有当信 |
xSemaphore 获取得到的信号量 xTicksToWait 阻塞超时时间。如果把xTicksToWait 设置为portMAX_DELAY , 并且在 FreeRTOSConig.h 中设定INCLUDE_vTaskSuspend 为1,那么阻塞等待将没有超时限制。 |
| xSemaphoreGiveFromISR |
是xSemaphoreGive()的特殊形式,专门用于中断服务例程中 |
xSemaphore 给出的信号量 pxHigherPriorityTaskWoken 对某个信号量而言,可能有不止一个任务处于阻塞态在等待其有效。调用xSemaphoreGiveFromISR()会让信 |
freeRTOS中文实用教程3--中断管理之延迟中断处理的更多相关文章
- freeRTOS中文实用教程3--中断管理之中断嵌套
1.前言 最新的 FreeRTOS 移植中允许中断嵌套.中断嵌套需要在 FreeRTOSConfig.h 中设置configKERNEL_INTERRUPT_PRIORITY 和configMAX_S ...
- freeRTOS中文实用教程4--资源管理互斥
1.前言 访问一个被多任务共享,或是被任务与中断共享的资源时,需要采用”互斥”技术以保证数据在任何时候都保持一致性.这样做的目的是要确保任务从开始访问资源就具有排它性,直至这个资源又恢复到完整状态 F ...
- freeRTOS中文实用教程5--内存管理
1.前言 不同的嵌入式系统具有不同的内存配置和时间要求.所以单一的内存分配算法只可能适合部分应用程序. FreeRTOS 将内存分配作为可移植层面(相对于基本的内核代码部分而言).这使得不同的应用程序 ...
- freeRTOS中文实用教程4--资源管理概述
1.前言 多任务系统中存在一种潜在的风险.当一个任务在使用某个资源的过程中,即还没有完全结束对资源的访问时,便被切出运行态,使得资源处于非一致,不完整的状态 2.并发抢占导致错误的场景 (1)访问外设 ...
- freeRTOS中文实用教程3--中断管理之中断服务例程中使用队列
1.前言 消息队列不仅可以用于事件通信,还可以用来传递数据 2.实例说明消息队列的执行过程 3.主要API API名称 说明 参数 返回值 xQueueSendFromISR()完全等同于 xQueu ...
- freeRTOS中文实用教程3--中断管理之计数信号量
1.前言 在中断不频繁的系统中,使用二值信号量没有问题,但是中断频繁发生时,则会有中断丢失的问题. 因为中断发生时延迟任务执行,延迟任务执行的过程中,如果又来了两次中断,则只会处理第一次,第二次将会丢 ...
- freeRTOS中文实用教程6--错误排查
1.前言 本章主要是为刚接触FreeRTOS 的用户指出那些新手通常容易遇到的问题.这里把最主要的篇幅放在栈溢出以及栈溢出侦测上 2.printf-stdarg.c 当调用标准C 库函数时,栈空间使用 ...
- freeRTOS中文实用教程1--任务
1.前言 FreeRTOS是小型多任务嵌入式操作系统,硬实时性.本章主要讲述任务相关特性及调度相关的知识. 2. 任务的总体特点 任务的状态 (1)任务有两个状态,运行态和非运行态 (2)任务由非运行 ...
- freeRTOS中文实用教程2--队列
1.前言 freeRTOS中所有任务的通信和同步机制都是基于队列来实现. 2.队列的特点 图 队列的读写操作 队列的数据存储 (1)队列可以保存有限个具有确定长度的数据单元,队列可以保存的最大单元数目 ...
随机推荐
- Leetcode 242.有效的字母异位词 By Python
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = "anagram", t = "nagaram" ...
- 自学Aruba5.1.1-基于时间的Role定义
点击返回:自学Aruba之路 自学Aruba5.1.1-基于时间的Role定义 可以配置一条rule是基于时间来做限制 具体配置时间(Time ranges)步骤如下: 1 建立一个绝对时间范围,命令 ...
- List does not exist. The page you selected contains a list that does not exist. It may have been deleted by another user
当我在subsite里点击"Add a document",报这个错,后来一看event log: 在AAM里加上一条: 问题搞定:
- Change upload file limit in specified Webapllication in SharePoint (PowerShell)
http://gallery.technet.microsoft.com/office/Change-upload-file-limit-89502ff2 http://sharepointrela ...
- GO调度模型的缺点
记一次latency问题排查:谈Go的公平调度的缺陷 http://baijiahao.baidu.com/s?id=1587897390639953806&wfr=spider&fo ...
- codeforces 793B - Igor and his way to work(dfs、bfs)
题目链接:http://codeforces.com/problemset/problem/793/B 题目大意:告诉你起点和终点,要求你在只能转弯两次的情况下能不能到达终点.能就输出“YES”,不能 ...
- xargs与exec详解
一.场景 这个命令是错误的 1 find ./ -perm +700 |ls -l 这样才是正确的 1 find ./ -perm +700 |xargs ls -l 二.用法 1 2 3 4 5 ...
- Exception in thread "main" java.util.InputMismatchException
今天写代码来了一个异常 /** * 需求分析:根据输入的天数是否是周六或是周日, * 并且天气的温度大于28摄氏度,则外出游泳,否则钓鱼 * @author chenyanlong * 日期:2017 ...
- Post和get请求时中文乱码
在web.xml中加入: <filter> <filter-name>CharacterEncodingFilter</filter-name> <filte ...
- Swift学习笔记6
1.用类型检查操作符(is)来检查一个实例是否属于特定子类型.若实例属于那个子类型,类型检查操作符返回 true,否则返回 false. 2.某类型的一个常量或变量可能在幕后实际上属于一个子类.当确定 ...