FreeRTOS没有从ISR进行上下文切换 - ARM926EJ-S核心

时间:2016-11-09 07:04:42

标签: kernel embedded freertos context-switch

我试图在freeRTOS之上实现Jpeg编码设置。主要任务初始化捕获单元。

void Video_SNAPThread(void* pvParameters)
{
    while (1)
    {
        capture_startSNAP();         /* SNAPSHOT Capture - Encode API*/
        vTaskSuspend(xHandleSNAP);   /* Task Suspend - within context*/

    }
}

capture_start函数配置传感器参数并启动捕获单元,该捕获单元在每帧结束时触发回调函数(帧结束中断)。

capture_startSNAP定义如下所示

int capture_startSNAP()
{
     TickType_t xMaxBlockTime;
     xMaxBlockTime = pdMS_TO_TICKS( 4000 );
#if defined(__1ST_PORT__) && !defined(__2ND_PORT__)
        sysprintf("Plug in sensor to port 0\n");
#endif
#if !defined(__1ST_PORT__) && defined(__2ND_PORT__)
        sysprintf("Plug in sensor to port 1\n");
#endif
#if defined(__1ST_PORT__) && defined(__2ND_PORT__)
        sysprintf("Plug in sensor to port 1 and port 2\n");
#endif
        sysSetInterruptPriorityLevel(IRQ_VIN, 2);
        sysSetInterruptPriorityLevel(IRQ_VIN1, 1);
        configASSERT( xTask_Notify == NULL );
        xTask_Notify = xTaskGetCurrentTaskHandle();
        Smpl_NT99141_HD_SNAP();

        while((ulTaskNotifyTake(Task_Woken , xMaxBlockTime ) == 0));             
        jpegmain();
        return 0;
}

Smpl_NT99141_HD_SNAP函数设置回调函数并开始捕获.ISR通知帧结束,然后应该执行上下文切换到Video_SNAPThread任务以进行进一步的数据处理。我已经使用任务通知方法从ISR切换回Video_snapthread进行编码,但它不起作用。

void VideoIn_InterruptHandler_SNAP(void)
{
        pVin1->Close();
        printf("Interrupt");   
        Task_Woken = pdFALSE;
        configASSERT( xTask_Notify != NULL );
        vTaskNotifyGiveFromISR( xTask_Notify, &Task_Woken );
        xTask_Notify = NULL;
        portYIELD_FROM_ISR( Task_Woken );     
}

如果我错了,请纠正我。还是freeRTOS的新手。

2 个答案:

答案 0 :(得分:1)

很抱歉,我想深入探讨这个旧的话题,但我认为我的观点可以帮助其他人在FreeRTOS中面对缺乏上下文切换的情况。

首先:切勿尝试在中断上下文中在UART上打印出某些内容(例如调试字符串)。这是适用于嵌入式软件开发中任何地方的经验法则。 中断上下文意味着尽可能快。相反,打印某些东西意味着速度慢,有时甚至更糟(睡觉)。

出于在中断上下文中进行调试的目的,您有几种选择:

  • 使用调试器(gdb ...)
  • 使用MCU的调试寄存器(指令,周期,错误计数器)
  • 切换GPIO引脚(以使用示波器进行探测或接通LED)

其次,其他原因也可能导致阻止上下文切换:

  • 高优先级任务可以使您的任务处于暂停状态一段时间或永​​远。
  • 中断处理程序代码中缺少保护。您是否考虑过再入境保护?

     In the interrupt handler :
     1. disable interrupt (interrupt mask register)
     2. clear interrupt source
     3. Do your job (keep it short and simple)
     4. enable interrupt
    

Good practices : embedded.com

答案 1 :(得分:0)

问题已经解决了。显然,中断内的'Debug'printf()触发了这个问题。