只有以FromISR或者FROM_ISR结束的函数或者宏才可以在中断中使用。
二值信号量同步
二值信号量可以在某个特殊中断发生时,让任务接触阻塞(相当于任务和中断同步)。 中断程序只是处理少部分工作,中断处理可以理解为推迟到一个处理任务。 如果中断处理的要求特别紧急,延迟处理任务的优先级可以设为最高。
二值信号量的处理流程
1:中断产生。
2:中断服务例程启动,释放(give)信号量,使延迟处理任务接触阻塞。
3:中断程序退出时,延迟任务得到执行。延迟任务做的第一件事情是获取信号量。
4:延迟处理任务完成中断处理后,将阻塞等待信号量。
计数信号量,记录信号量give的次数,在事件比较密集的情况下使用。 二值信号量可能被连续give两次,而延迟处理任务只执行了一次。 有两种典型用法:
1. 事件计数
信号量为事件发生的次数,每次give,信号量加1,每次take,信号量减1
2. 资源管理
信号量的值表示资源数量,当获取资源需要take,释放资源为give
两者的区别在于初始情况,事件计数初始为0,资源管理初始为最大。
中断管理中使用的队列函数,末尾都加上FromISR。
API名字 | 功能 | 描述 |
---|---|---|
xSemaphoreCreateBinary | 创建二值信号量 | 宏定义,创建二值信号量 |
xSemaphoreTake | 获取信号量 | 宏定义,在信号量有效时获取,相当于信号量中的一次P操作(不能在中中断中使用) |
xSemaphoreGiveFromISR | 释放信号量 | 宏定义,释放信号量,被阻塞的程序可以运行 |
xSemaphoreCreateCounting | 创建计数信号量 | 创建计数信号量。并赋予初值 |
引用头文件:source/semphr.h