Skip to content

Latest commit

 

History

History
49 lines (32 loc) · 1.98 KB

freertos_interrupt.md

File metadata and controls

49 lines (32 loc) · 1.98 KB

freeRTOS的中断

1.中断中可以使用的API

只有以FromISR或者FROM_ISR结束的函数或者宏才可以在中断中使用。

2.延迟中断

二值信号量同步

二值信号量可以在某个特殊中断发生时,让任务接触阻塞(相当于任务和中断同步)。 中断程序只是处理少部分工作,中断处理可以理解为推迟到一个处理任务。 如果中断处理的要求特别紧急,延迟处理任务的优先级可以设为最高。

二值信号量的处理流程

1:中断产生。
2:中断服务例程启动,释放(give)信号量,使延迟处理任务接触阻塞。
3:中断程序退出时,延迟任务得到执行。延迟任务做的第一件事情是获取信号量。
4:延迟处理任务完成中断处理后,将阻塞等待信号量。

3.计数信号量

计数信号量,记录信号量give的次数,在事件比较密集的情况下使用。 二值信号量可能被连续give两次,而延迟处理任务只执行了一次。 有两种典型用法:

1. 事件计数
信号量为事件发生的次数,每次give,信号量加1,每次take,信号量减1

2. 资源管理
信号量的值表示资源数量,当获取资源需要take,释放资源为give

两者的区别在于初始情况,事件计数初始为0,资源管理初始为最大。

4.在中断中使用队列

中断管理中使用的队列函数,末尾都加上FromISR。

5.中断管理API

API名字 功能 描述
xSemaphoreCreateBinary 创建二值信号量 宏定义,创建二值信号量
xSemaphoreTake 获取信号量 宏定义,在信号量有效时获取,相当于信号量中的一次P操作(不能在中中断中使用)
xSemaphoreGiveFromISR 释放信号量 宏定义,释放信号量,被阻塞的程序可以运行
xSemaphoreCreateCounting 创建计数信号量 创建计数信号量。并赋予初值

引用头文件:source/semphr.h