我试图在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的新手。
答案 0 :(得分:1)
很抱歉,我想深入探讨这个旧的话题,但我认为我的观点可以帮助其他人在FreeRTOS中面对缺乏上下文切换的情况。
首先:切勿尝试在中断上下文中在UART上打印出某些内容(例如调试字符串)。这是适用于嵌入式软件开发中任何地方的经验法则。 中断上下文意味着尽可能快。相反,打印某些东西意味着速度慢,有时甚至更糟(睡觉)。
出于在中断上下文中进行调试的目的,您有几种选择:
其次,其他原因也可能导致阻止上下文切换:
中断处理程序代码中缺少保护。您是否考虑过再入境保护?
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
答案 1 :(得分:0)
问题已经解决了。显然,中断内的'Debug'printf()触发了这个问题。