GD32F407使用freeRTOS死机
在GD32F407跑了freeRTOS,串口接收使用了DMA+IDLE中断来实现不定长接收,串口的IDLE中断中接收完数据后,通过事件通知线程执行解析,但是中断中调用xEventGroupSetBitsFromISR函数后就会死机 本帖最后由 键盘手没手 于 2024-6-1 09:00 编辑xEventGroupSetBitsFromISR函数应该是可以在中断服务例程中使用的,但要确保你没有在中断服务例程中调用任何可能导致冲突的其他函数。 本帖最后由 键盘手没手 于 2024-6-1 09:00 编辑
如果你的中断服务例程可能会与其他任务发生竞争,确保优先级正确设置可以避免优先级反转等问题。
freeRTOS是一个多任务操作系统,如果多个任务同时访问共享资源(如内存、外设等),而没有适当的同步机制(如互斥锁、信号量等),可能导致资源竞争和死锁。 死机是因为你还没有把系统原理了解清楚。 大概率还是你的应用有问题,逻辑没有处理好。 避免在中断服务例程中直接访问可能被任务修改的共享资源。 FreeRTOS中每个任务都需要分配一定的堆栈空间,如果堆栈大小设置不足,任务执行过程中可能会发生堆栈溢出,导致系统死机。 堆(Heap)管理是否正确配置,是否有足够的内存用于动态内存分配。 在FreeRTOS中,异常处理是非常重要的。 FreeRTOS中使用的内存管理策略可能存在缺陷,或者系统中可用的堆内存不足,导致动态内存分配失败,进而引发死机。 死锁是指两个或多个任务在等待对方释放资源,从而导致系统无法继续执行。 检查你的内存分配情况,确保为FreeRTOS分配了足够的内存。 避免中断服务例程与任务之间的优先级反转问题。 增大任务栈大小或优化代码 检查代码中是否有无限循环、未处理的全局变量、内存越界等常见错误。 检查MCU的供电是否稳定,电压是否正确。 栈溢出是导致系统死机的常见原因 不正确的中断优先级可能导致任务调度出现问题。 不兼容的版本可能导致不可预见的问题。