zynq FreeRTOS 是如何触发切换任务的
1、方式一:portYIELD 触发软中断
- #define portYIELD() __asm volatile ( "SWI 0" ::: "memory" );
- 汇编中断指令 SWI ,产生软件中断;
- FreeRTOS_SWI_Handler 软中断服务函数,进行任务切换;
2、方式二:tick定时器 中断服务函数 ,FreeRTOS_Tick_Handler
- FreeRTOS_Tick_Handler 函数中 调用 xTaskIncrementTick 函数;
- 如果 xTaskIncrementTick 返回值为 真, 则 将变量 ulPortYieldRequired 设置为 true;
- 在 portASM.S 文件中,FreeRTOS_IRQ_Handler 函数 使用了 ulPortYieldRequired 变量;
- 中断处理“返回”顺序是,FreeRTOS_Tick_Handler →vApplicationIRQHandler→FreeRTOS_IRQ_Handler ,
- FreeRTOS_IRQ_Handler 中会因为 ulPortYieldRequired 变量为 true, 进行任务切换;
注:ZYNQ 异常中断处理“调用”顺序
1、以定时器产生中断为例,跳转到异常向量表对应位置,调用对应服务函数执行,异常向量表在 port_asm_vectors.s 文件中定义,_freertos_vector_table;
2、因为定时器是 IRQ 类型, 因此 跳转到 FreeRTOS_FIQHandler 函数执行,该函数位于 portASM.S 文件中;
3、调用顺序:FreeRTOS_FIQHandler → vApplicationIRQHandler →根据中断号查 XScuGic_ConfigTable 表调用 FreeRTOS_Tick_Handler

浙公网安备 33010602011771号