zynq FreeRTOS 是如何触发切换任务的

    1、方式一:portYIELD 触发软中断

    • #define portYIELD() __asm volatile ( "SWI 0" ::: "memory" );
    • 汇编中断指令 SWI ,产生软件中断;
    • FreeRTOS_SWI_Handler 软中断服务函数,进行任务切换;

  

  2、方式二:tick定时器 中断服务函数 ,FreeRTOS_Tick_Handler

    1. FreeRTOS_Tick_Handler 函数中 调用 xTaskIncrementTick 函数;
    2. 如果 xTaskIncrementTick 返回值为 真, 则 将变量 ulPortYieldRequired 设置为 true;
    3. 在 portASM.S 文件中,FreeRTOS_IRQ_Handler 函数 使用了 ulPortYieldRequired 变量;
    4. 中断处理“返回”顺序是,FreeRTOS_Tick_Handler vApplicationIRQHandlerFreeRTOS_IRQ_Handler ,
    5. 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

 

 

posted on 2025-07-15 15:22  所长  阅读(142)  评论(0)    收藏  举报

导航