一、问题:
1、在S32DS基于FreeRTOS进行S32K144的开发,SPI通过DMA进行传输
在调用信号量接口时发现会进入下面的断言:
configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
二、问题分析:
1、通过断言处的注释可以看出:
如果某个中断服务函数(ISR)调用了 FreeRTOS 提供的中断安全 API,但该中断的优先级高于 configMAX_SYSCALL_INTERRUPT_PRIORITY,则会触发断言失败
中断安全的FreeRTOS API只能被优先级等于或低于configMAX_SYSCALL_INTERRUPT_PRIORITY 的中断调用
调用 FreeRTOS API 的中断不能保留默认的 优先级 0,因为 0 是最高优先级
2、由此得出结论:
如果没有设置外设中断优先级,系统会将其中断优先级设置为默认优先级0
可以通过 INT_SYS_GetPriority(IRQn_Type irqNumber) 函数查看中断优先级,可以看到默认优先级为0
因为数字越小的优先级越高,而此时系统内核中断优先级设置为0x10,所以外设中断优先级高于系统内核中断优先级,系统内核无法抢占当前外设中断,导致系统出错
三、解决方法:
1、在初始化外设驱动之前,先设置该外设的中断优先级,确保外设中断优先级低于系统内核中断优先级
使用接口:
INT_SYS_SetPriority(IRQn_Type irqNumber, uint8_t priority)
第一个参数为中断号,选择对应外设中断号即可
第二个参数为中断优先级,设置时和 FEATURE_NVIC_PRIO_BITS 有关
示例:
0x02<(8-4) = 0x20,优先级数值大于系统内核中断优先级 0x10,优先级低于系统内核中断优先级
此文借鉴:
S32K在FreeRTOS下的外设中断设置