Tanxiaoli 发表于 2023-10-24 09:05:08

FreeRTOS优先级配置问题

最近在使用STM32F407芯片,使用ST官方的LL库,移植了FreeRTOS,配置一个串口可以正常通信后,加入对应的DMA配置。

刚刚开始配置时DMA的优先级设置的最高,调试测试了很久DMA移植接收不到数据,但是可以发送数据,为了验证是不是
操作系统导致的,裸机状态下跑同意的配置是可以的,但是增加了操作系统导致,经过资料的查找找到官方资料说明(http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html)。
我是用的最新FreeRTOS版本,在提供的demo下FreeRTOSConfig.h的配置中关于优先级的内容如下:

/* Cortex-M specific definitions. */
#ifdef __NVIC_PRIO_BITS
        /* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */
        #define configPRIO_BITS                       __NVIC_PRIO_BITS
#else
        #define configPRIO_BITS                       4      /* 15 priority levels */
#endif

/* The lowest interrupt priority that can be used in a call to a "set priority"
function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY                        0xf

/* The highest interrupt priority that can be used by any interrupt service
routine that makes calls to interrupt safe FreeRTOS API functions.DO NOT CALL
INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
PRIORITY THAN THIS! (higher priorities are lower numeric values. */
#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY        1

/* Interrupt priorities used by the kernel port layer itself.These are generic
to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY                 ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) //240
/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY         ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )//80

/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); printf("ERROR File:%s Line:%d\r\n",__FILE__,__LINE__); taskENABLE_INTERRUPTS();}


配置文件中FreeRTOS的软件优先级的问题主要是configMAX_SYSCALL_INTERRUPT_PRIORITY和configKERNEL_INTERRUPT_PRIORITY这两个参数,
我按照官方的说明进行修改后调试,发现还是不行,DMA接收还是没有得到数据,并且观察寄存器发现DMA传输的错误标志被置位了,
然后添加了对应的DMA中断清除错误标志位,还是没办法接收到,刚刚开始还以为是不是通信线路受到干扰,拿出示波器测试并没有
发现有什么不对劲的地方,同样的硬件裸机状态下配置是没有任何问题的。这时我肯定是操作系统优先级问题导致的,但是呢自己又是
按照官方的参考资料配置,折磨了我两三天,反复调试测试最终,通过修改DMA配置把优先级改成最低就能接收到数据了。

问题确定是操作系统的优先级问题没有配置好,目前自己对操作系统软件中断优先级的问题还是很理解,哪位大神指点一下,谢谢!!!

missfox 发表于 2023-10-24 09:48:57

如果已经确定是优先级问题,这个帖子有介绍,一看即懂
https://www.armbbs.cn/forum.php?mod=viewthread&tid=21094

Tanxiaoli 发表于 2023-10-24 09:58:23

missfox 发表于 2023-10-24 09:48
如果已经确定是优先级问题,这个帖子有介绍,一看即懂
https://www.armbbs.cn/forum.php?mod=viewthread&t ...

非常感谢,我去看一下。
页: [1]
查看完整版本: FreeRTOS优先级配置问题