stm32 移植freertos时的注意事项

1、stm32中断向量表配置

STM32使用中由于中断优先级的设置采用的是库函数,因此要请保证所有的优先级设置为可抢占优先级,具体实现方式是在RTOS启动前调用函数:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4 );​

设置 NVIC 的优先级分组为 4 表示支持 0-15 级抢占优先级(注意, 0-15 级是16 个级别,包含 0 级), 不支持子优先级。 

在这里继续强调下这一点,在 NVIC 分组为 4 的情况下,抢占优先级可配置范围是0-15,那么数值越小,抢占优先级的级别越高,即0 代表最高优先级,15 代表最低优先级。 


2、freertos中与中断有关的配置

#ifdef __NVIC_PRIO_BITS
	#define configPRIO_BITS       		__NVIC_PRIO_BITS
#else
	#define configPRIO_BITS       		4                  
#endif

此宏定义用于配置 STM32 8 位优先级设置寄存器实际使用的位数。保持默认,无需配置。

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			15                      

此宏定义是用来配置 FreeRTOS 用到的 SysTick 中断和PendSV 中断的优先级。在 NVIC 分组设置为4 的情况下,此宏定义的范围就是0-15,即专门配置抢占优先级。这里配置为了0x0f,即 SysTick PendSV 都是配置为了最低优先级,实际项目中也建议大家配置最低优先级即可。保持默认,无需配置。

#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY	5                      

此宏定义比较重要,定义了受 FreeRTOS 管理的最高优先级中断。简单的说就是允许用户在这个中断服务程序里面调用 FreeRTOS 的API 的最高优先级。设置 NVIC 的优先级分组为4 的情况下。配置configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 0x05 表示用户可以在抢占式优先级为5  15 的中断里面调用 FreeRTOS API 函数,抢占式优先级为0 、1、2、3、4的中断里面是不允许调用的。这个根据实际需求,进行修改。


3、为什么要配置不受Freertos控制的中断优先级

不受FreeRTOS 管理的中断有什么深层的含义吗?

讲解不受 FreeRTOS 管理的中断之前要说一个小知识点 ---- 中断延迟。 中断延迟时间是衡量 RTOS 实时操作系统的一项重要指标,那什么又是中断延迟呢?从中断触发到执行中断服务程序的第一条指令这段时间就是中断延迟时间。
FreeRTOS
内核源码中有多处开关全局中断的地方,这些开关全局中断会加大中断延迟时间。 比如在源码的某个地方关闭了全局中断,但是此时有外部中断触发,这个中断的服务程序就需要等到再次开启全局中断后才可以得到执行。开关中断之间的时间越长,中断延迟时间就越大,这样极其影响系统的实时性。

如果这是一个紧急的中断事件,得不到及时执行的话,后果是可想而知的。针对这种情况,FreeRTOS 就专门做了一种新的开关中断实现机制。关闭中断时仅关闭受 FreeRTOS管理的中断,不受 FreeRTOS 管理的中断不关闭,这些不受管理的中断都是高优先级的中断,用户可以在这些中断里面加入需要实时响应的程序。

4、FreeRTOSConfig.h文件中还需要配置什么

#define configCPU_CLOCK_HZ						(SystemCoreClock)       //CPUƵÂÊ
#define configTICK_RATE_HZ						(200)   
这两项是配置系统的时钟和滴答定时器的心跳频率。一旦这两项确定后,那么时间片也就确定下来了。







猜你喜欢

转载自blog.csdn.net/crjmail/article/details/80021792