码迷,mamicode.com
首页 > 其他好文 > 详细

freeRTOS学习3--中断管理

时间:2017-06-26 21:14:19      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:返回值   sem   理解   队列   color   中断   不能   深度   binary   

1.前言

嵌入式实时操作系统需要对整个系统环境产生的事件作出响应。可以采用中断方式也可以采用轮询方式来进行处理。如果采用中断方式,则希望ISR(中断服务例程)的处理时间越短越好。

注:必须说明的是,只有以”FromISR”或”FROM_ISR”结束的API 函数或宏才可以在中断服务例程中。

2. 延迟中断处理

技术分享

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

通过在中断处理中增加二值信号量从而解除任务的阻塞状态,让任务得以执行,这样中断处理例程中就可以做少量的事情,将工作量大的事情交给解除阻塞的任务来执行,从这个角度上看,中断处理被延迟了,所以称为延迟中断处理。

二值信号量可以理解成一个深度为1的队列。

3. 相关处理流程

handler具有比periodic高的优先级,periodic中触发中断,进行P操作后,切换handler处理,之后在执行periodic任务:

技术分享

 

相关的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--中断管理

标签:返回值   sem   理解   队列   color   中断   不能   深度   binary   

原文地址:http://www.cnblogs.com/smartjourneys/p/7082163.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!