Error:…\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,441 原因及解决方法
参考原子ucos和官网例程移植STM32+FreeRTOS+Lwip中出现如上问题。
原因:在中断中调用了任务级的freertos函数,应调用中断级(即以ISR结尾的)
主要问题都在sys_arch.c中:
函数err_t sys_mbox_trypost(sys_mbox_t *mbox, void *msg)中要使用:xQueueSendFromISR
函数sys_prot_t sys_arch_protect(void)中改用:taskENTER_CRITICAL_FROM_ISR();
函数void sys_arch_unprotect(sys_prot_t pval)中改用:
taskEXIT_CRITICAL_FROM_ISR(pval);
也可以通过中断控制及状态寄存器ICSR:0xE000_ED04(权威指南131页)来做个判断,看此时程序是否处于中断中,代码如下:
sys_prot_t sys_arch_protect(void)
{
u32 sn0;
sn0=*(vu32*)(0xE000ED04);
if(sn0&0xFF)//在中断里
{
return taskENTER_CRITICAL_FROM_ISR();
}
else //在线程
{
taskENTER_CRITICAL();
return 0;
}
}
当然也可以另建一个任务专门处理数据,不再中断中干这些事。