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)”信号量。只有当信
号量有效的时候才可以被获取。在经典信号量术中,SemaphoreTake()等同于一次P()操作。不能在中断服务例程中调用

xSemaphore

获取得到的信号量

xTicksToWait

阻塞超时时间。如果把xTicksToWait 设置为portMAX_DELAY , 并且在

FreeRTOSConig.h 中设定INCLUDE_vTaskSuspend 为1,那么阻塞等待将没有超时限制。

 xSemaphoreGiveFromISR

是xSemaphoreGive()的特殊形式,专门用于中断服务例程中

xSemaphore

给出的信号量

pxHigherPriorityTaskWoken

对某个信号量而言,可能有不止一个任务处于阻塞态在等待其有效。调用xSemaphoreGiveFromISR()会让信
号量变为有效,所以会让其中一个等待任务切出阻塞态。如果调用SemaphoreGiveFromISR()使得一个任务解除阻塞,并且这个任务的优先级高于当前任务(也就是被中断的任务),那么SemaphoreGiveFromISR()会在函数内部将*pxHigherPriorityTaskWoken 设为
pdTRUE。如果xSemaphoreGiveFromISR() 将此值设为pdTRUE,则在中断退出前应当进行一次上下文切换。
这样才能保证中断直接返回到就绪态任务中优先级最高的任务中(否则会切换到被中断的任务)。

freeRTOS中文实用教程3--中断管理之延迟中断处理的更多相关文章

  1. freeRTOS中文实用教程3--中断管理之中断嵌套

    1.前言 最新的 FreeRTOS 移植中允许中断嵌套.中断嵌套需要在 FreeRTOSConfig.h 中设置configKERNEL_INTERRUPT_PRIORITY 和configMAX_S ...

  2. freeRTOS中文实用教程4--资源管理互斥

    1.前言 访问一个被多任务共享,或是被任务与中断共享的资源时,需要采用”互斥”技术以保证数据在任何时候都保持一致性.这样做的目的是要确保任务从开始访问资源就具有排它性,直至这个资源又恢复到完整状态 F ...

  3. freeRTOS中文实用教程5--内存管理

    1.前言 不同的嵌入式系统具有不同的内存配置和时间要求.所以单一的内存分配算法只可能适合部分应用程序. FreeRTOS 将内存分配作为可移植层面(相对于基本的内核代码部分而言).这使得不同的应用程序 ...

  4. freeRTOS中文实用教程4--资源管理概述

    1.前言 多任务系统中存在一种潜在的风险.当一个任务在使用某个资源的过程中,即还没有完全结束对资源的访问时,便被切出运行态,使得资源处于非一致,不完整的状态 2.并发抢占导致错误的场景 (1)访问外设 ...

  5. freeRTOS中文实用教程3--中断管理之中断服务例程中使用队列

    1.前言 消息队列不仅可以用于事件通信,还可以用来传递数据 2.实例说明消息队列的执行过程 3.主要API API名称 说明 参数 返回值 xQueueSendFromISR()完全等同于 xQueu ...

  6. freeRTOS中文实用教程3--中断管理之计数信号量

    1.前言 在中断不频繁的系统中,使用二值信号量没有问题,但是中断频繁发生时,则会有中断丢失的问题. 因为中断发生时延迟任务执行,延迟任务执行的过程中,如果又来了两次中断,则只会处理第一次,第二次将会丢 ...

  7. freeRTOS中文实用教程6--错误排查

    1.前言 本章主要是为刚接触FreeRTOS 的用户指出那些新手通常容易遇到的问题.这里把最主要的篇幅放在栈溢出以及栈溢出侦测上 2.printf-stdarg.c 当调用标准C 库函数时,栈空间使用 ...

  8. freeRTOS中文实用教程1--任务

    1.前言 FreeRTOS是小型多任务嵌入式操作系统,硬实时性.本章主要讲述任务相关特性及调度相关的知识. 2. 任务的总体特点 任务的状态 (1)任务有两个状态,运行态和非运行态 (2)任务由非运行 ...

  9. freeRTOS中文实用教程2--队列

    1.前言 freeRTOS中所有任务的通信和同步机制都是基于队列来实现. 2.队列的特点 图 队列的读写操作 队列的数据存储 (1)队列可以保存有限个具有确定长度的数据单元,队列可以保存的最大单元数目 ...

随机推荐

  1. 丢手帕问题 (约瑟夫问题)Java实现

    问题: 丢手帕游戏是约瑟夫问题的一个变种,游戏很简单,N个小孩围成一个圈,标号为1到N,从编号为m的小孩开始报数,报到第L个小孩退出游戏,然后下一个小孩继续从1开始报数,数到第L个小孩退出游戏,如此循 ...

  2. 找到第一个只出现一次的字符并返回它的位置(Python)

    s = 'hellobaby' def findchar(s): for i in s: if s.count(i)==1: return i, s.index(i) m,n=findchar(s) ...

  3. tesseract-ocr 识别中文扫描图片

    原文链接:http://www.cnblogs.com/alex-blog/articles/2714984.html   项目主页地址:http://code.google.com/p/tesser ...

  4. Android教程:在百度地图上画出轨迹

    [日期:2013-04-14] 来源:Linux社区  作者:crazyxin1988 [字体:大 中 小]     接着上面的项目<Android访问webservice.客户端登录注册> ...

  5. AtCoder Regular Contest 076 F - Exhausted?

    题意: n个人抢m个凳子,第i个人做的位置必须小于li或大于ri,问最少几个人坐不上. 这是一个二分图最大匹配的问题,hall定理可以用来求二分图最大匹配. 关于hall定理及证明,栋爷博客里有:ht ...

  6. java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers及解决方案

    1. 问题 最近在项目中修bug的时候,碰到这样一个错误: Caused by: java.sql.SQLException:Prepared or callable statement has mo ...

  7. WCF开发实战系列二:使用IIS发布WCF服务

    WCF开发实战系列二:使用IIS发布WCF服务 (原创:灰灰虫的家http://hi.baidu.com/grayworm) 上一篇中,我们创建了一个简单的WCF服务,在测试的时候,我们使用VS200 ...

  8. python字典遍历的几种方法

    (1)遍历key值 >>> a {'} >>> for key in a: print(key+':'+a[key])   a:1 b:2 c:3 >> ...

  9. Linux就该这么学--第五期 学习笔记

    第一节:基础 <Linux就该这么学>第二期视频 Linux就该这么学第5期第二节: ------------你的价值:你对公司做出的共享和你的不可替代性------------瑞尔系统R ...

  10. Calendar 日历类的时间操作

    我们经常会涉及到对时间的处理,例如登陆网站,我们会看到网站首页显示XXX,欢迎您!今天是XXXX年....某些网站会记录下用户登陆的时间,比如银行的一些网站,对于这些经常需要处理的问题,Java中提供 ...