FreeRTOS快速使用指南(3)中断管理

第三章 中断管理

目录

第三章 中断管理

1.哪些 FreeRTOS 的 API 函数可以在中断服务例程中使用

2· 延迟中断方案是处何实现的

3· 如何创建和使用二值信号量以及计数信号量

4· 二值信号量和计数信号量之间的区别

5· 如何利用队列在中断服务例程中把数据传入传出

6· 一些 FreeRTOS 移植中采用的中断嵌套模型

7.参考文献

8.技术交流


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. 从中断中把信号量给出

portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore,
portBASE_TYPE *pxHigherPriorityTaskWoken )

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.技术交流

公众号:橘入式技术交流

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值