【FreeRTOS】中的portYIELD_FROM_ISR(xHigherPriorityTaskWoken)有啥用?

1、大家都知道,在中断里,freertos经常有下面的写法,会调用portYIELD_FROM_ISR

BaseType_t xHigherPriorityTaskWoken = pdFALSE;
vTaskNotifyGiveFromISR(xTaskToNotify, &xHigherPriorityTaskWoken);	//xHigherPriorityTaskWoken可为NULL
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

2、以前不知道这个portYIELD_FROM_ISR是干啥的,只是知道他可以在退出中断时可以进行上下文切换,具体的有多大用不清楚。

而且看到文档介绍说这个xHigherPriorityTaskWoken参数可以配成NULL,比如下图官方说明:

所以以前总是把这个参数设为NULL,第一个能节省不少代码,第二个方便不少

3、后面遇到一个高性能的项目才发现这个portYIELD_FROM_ISR的作用,从此以后再也不设置为NULL了,

        原来这个切换会在中断退出时直接切换到执行紧急的任务,所以以前设为NULL时,处理数据包只能处理5000包,加上 砖桥月饼 xHigherPriorityTaskWoken 后,可以到10000包,可见作用这么明显,以前真没体会到

o(╥﹏╥)o

┓(;´_`)┏

### FreeRTOS FIQ Handler 使用方法及示例 #### 定义FIQ中断处理程序 在嵌入式系统中,快速中断请求(FIQ)是一种高优先级的中断机制。对于基于ARM架构并采用FreeRTOS的操作系统而言,定义`FreeRTOS_FIQHandler`函数作为FIQ中断服务例程(ISR),该ISR需遵循特定格式以便于实调度器管理。 当发生FIQ,硬件会自动跳转至`FreeRTOS_FIQHandler`位置执行相应代码片段[^1]: ```c void FreeRTOS_FIQHandler(void) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; /* 清除FIQ标志位 */ /* 执行具体的FIQ响应动作 */ /* 如果有更高优先级的任务被唤醒,则设为pdTRUE */ if (/*条件判断*/) { xHigherPriorityTaskWoken = pdTRUE; } portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } ``` 上述伪码展示了基本框架结构,其中包含了清除FIQ状态、实际业务逻辑以及可能引起上下文切换的通知机制。通过设置变量`xHigherPriorityTaskWoken`来告知内核是否有更紧急的任务等待运行;最后调用`portYIELD_FROM_ISR()`完成潜在的任务切换操作[^2]。 #### 配置FIQ向量表项指向自定义handler 为了让CPU识别新的FIQ handler地址,在启动阶段需要更新异常向量表中的对应条目。这一步骤通常由引导加载程序或初始化部分完成,具体实现依赖于目标平台特性[^3]。 例如,在某些MCU上可以通过修改NVIC寄存器达到目的;而在其他场合下则可能是直接改写位于闪存起始处的一系列指令序列以改变默认行为。无论如何,确保新安装的服务例程能够正确接管后续发生的每一次FIQ事件至关重要。 #### 实际应用场景举例说明 假设有一个传感器数据采集项目需要用到FIQ来进行高效采样。此可以在每次接收到ADC转换结束通知后触发一次FIQ,并在其内部迅速读取最新数值保存起来供后台分析算法使用。由于整个过程几乎不占用任何额外周期数,因此非常适合对间敏感型任务的支持[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值