第三章 中断管理
目录
1.哪些 FreeRTOS 的 API 函数可以在中断服务例程中使用
1.哪些 FreeRTOS 的 API 函数可以在中断服务例程中使用
函数名字带FromISR的FreeRTOS的API函数。
例:
1.中断中信号量获取
portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore, portBASE_TYPE *pxHigherPriorityTaskWoken );
xSemaphore | 给出的信号量(二值信号量的句柄) |
pxHigherPriorityTaskWoken | 高优先级任务唤醒 |
返回值 | 1. pdPASS :调用成功 2. pdFAIL :如果信号量已经有效 |
2· 延迟中断方案是处何实现的
由于中断函数一般只执行代码量小的函数,通过信号量使指定任务进入就绪态快速衔接中断函数,以达到一种,触发中断就执行任务的效果
3· 如何创建和使用二值信号量以及计数信号量
1.创建二值信号量(使用二值信号量之前必须先创建二值信号量)
void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore );
xSemaphore | 创建的信号量(二值信号量的句柄) |
2.创建计数信号量
xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount );
uxMaxCount | 最大计数值 |
uxInitialCount | 信号量的初始计数值。 |
返回值 | NULL :对上内存不够 信号量句柄:表示信号量创建成功 |
3. 从中断中把信号量给出
xQueue | 创建队列的句柄 |
pvItemToQueue | 发送数据的指针 |
pxHigherPriorityTaskWoken | 高优先级任务唤醒 |
返回值 | pdPASS:信号量给出成功 pdFAIL:信号量已经给出, |
4.获取信号量
portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, portTickType xTicksToWait );
xSemaphore | 获取得到的信号量 | 信号量由定义为 xSemaphoreHandle 类型的变量引用。信号量在使 用前必须先创建。 |
xTicksToWait | 阻塞超时时间。任务进入阻塞态以等待信号量有效的最长时间。 | 如果 xTicksToWait 为 0,则 xSemaphoreTake()在信号量无效时会 立即返回。 |
返回值 | 1. pdPASS :成功获得信号量 2. pdFALSE :未能获得信号量 |
|
4· 二值信号量和计数信号量之间的区别
二值信号量只能保存一个信号量
计数信号量可以保存多个信号量
5· 如何利用队列在中断服务例程中把数据传入传出
传入:
1.从中断发送数据到队首
portBASE_TYPE xQueueSendToFrontFromISR( xQueueHandle xQueue,
void *pvItemToQueue portBASE_TYPE *pxHigherPriorityTaskWoken );
2.从中断发送数据到队尾
portBASE_TYPE xQueueSendToBackFromISR( xQueueHandle xQueue,
void *pvItemToQueue portBASE_TYPE *pxHigherPriorityTaskWoken );
xQueue | 创建队列的句柄 |
pvItemToQueue | 发送数据的指针 |
pxHigherPriorityTaskWoken | 高优先级任务唤醒 |
返回值 | pdPASS:成功发送数据 errQUEUE_FULL:队列满无法写入数据到队列 |
传出:
从中断接收队列数据
xQueueReceiveFromISR( QueueHandle_t xQueue, void * const pvBuffer,
BaseType_t * const pxHigherPriorityTaskWoken );
xQueue | 创建队列的句柄 |
* const pvBuffer | 接收缓存指针 |
pxHigherPriorityTaskWoken | 高优先级任务唤醒 |
返回值 | 1. pdPASS :成功获得信号量 2. pdFALSE :未能获得信号量 |
6· 一些 FreeRTOS 移植中采用的中断嵌套模型
1.建立一个中断模型(纯硬件模型)
优先级:configMAX_SYSCALL_INTERRUPT_PRIRITY > configKERNEL_INTERRUPT_PRIORITY
configKERNEL_INTERRUPT_PRIORITY | 设置系统心跳时钟的中断优先级。 |
configMAX_SYSCALL_INTERRUPT_PRIORITY | 设置中断安全版本 FreeRTOS API 可以运行的最高中断优先级 |
(如果没有设置configMAX_SYSCALL_INTERRUPT_PRIORITY 这个常量,就需要把API的优先级设置在configKERNEL_INTERRUPT_PRIORITY 常量优先级之上)
7.参考文献
FreeRTOS实时内核使用指南-中文
8.技术交流
公众号:橘入式技术交流