stm32cubemx 配置freertos中断优先级
stm32cubeMx 直接集成freertos,可以不需要自己手动移植只需要把freertos的选项勾选就可以。
但是生成的代码工程中,freertos暴露给用户的API接口并不是原生的freertos接口,是经过cmsis-rtos进行一次包装之后的。所以如果使用信号量、消息邮箱、定时器等等接口的时候要查询cmsis-rtos文档,并且cmsis-rtos有不同的版本,现在cubemx中集成的是v1版本,后期有可能会集成v2的。参考链接如下:
http://www.keil.com/pack/doc/CMSIS/RTOS/html/index.html
勾选了freertos然后生成工程代码的时候stm32cubemx会有个提示框弹出来:
它会强烈建议你把timebase源切换到非systick。这一步可能会有很多人搞不清楚,为什么不使用systick而要另外用个定时器。这里首先要弄明白的是这里的HAL timebase并不是freertos的任务调度器时钟。freertos的调度时钟是强制性使用systick的并且systick的中断优先级被设置为最低(这个原因后面叙述)。
这个hal timebase实际上是hal 库需要使用到的tick计数源,如果深入去看hal库会发现有很多有超时功能的函数接口就需要用到这个hal timebase。所以生成代码时候就强烈建议hal timebase和freertos 使用的systick不要共用。systick已经被强制为最低优先级,hal timebase用的话就可能产生计数不准的情况。
那么systick为什么被设置为最低优先级也是有原因的,因为freertos是一个嵌入式实时操作系统,既然能做到实时就要确保中断能够立马得到响应,所以把调度器的时钟优先级设置为最低就不会影响其他外设中断的及时响应。否则就称不上实时。所以一旦在stm32cubemx中勾选了freertos后,systick的优先级自动被设置为最低,不需要用户再去手动调整。
freertos还有个配置优先级的关键选项: configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
- 高于该配置的优先级中断中都不能调用freertos的任何API,但是同时他也不会受freertos的内核影响而可以得到最实时的响应。
- 如果在中断服务函数中需要使用freertos的API接口函数的话就要把该中断的优先级配置为小于或等于
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY
在stm32L0系列单片机的优先级一共有四个等级:0-3,0为最高优先级3为最低。使用freertos以后sytick就在该等级。
把 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 配置为2,这样特别实时的中断优先级就可以配置为0或者1,而正常需要调用freertos API的中断就可以配置为2或者3优先级。分配结果如下图: