你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

干货——stm32cubemx 配置freertos中断优先级

[复制链接]
eefishing 发布时间:2019-12-20 23:18
stm32cubeMx 直接集成freertos,可以不需要自己手动移植只需要把freertos的选项勾选就可以。

但是生成的代码工程中,freertos暴露给用户的API接口并不是原生的freertos接口,是经过cmsis-rtos进行一次包装之后的。所以如果使用信号量、消息邮箱、定时器等等接口的时候要查询cmsis-rtos文档,并且cmsis-rtos有不同的版本,现在cubemx中集成的是v1版本,后期有可能会集成v2的。参考链接如下:

勾选了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优先级。分配结果如下图:



收藏 评论0 发布时间:2019-12-20 23:18

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版