0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

内核使用FreeRTOS的特别注意事项有哪些?

安芯教育科技 来源:极术社区 作者:朱工 2021-02-01 10:21 次阅读

在阅读本文之前,有两个定义在FreeRTOSConfig.h中的宏,你必须先明白它们是什么意思,《FreeRTOS内核配置说明》一文中,讲解了这两个宏:

configKERNEL_INTERRUPT_PRIORITY

configMAX_SYSCALL_INTERRUPT_PRIORITY

FreeRTOS与Cortex-M内核可谓是绝配,以至于让移植和使用FreeRTOS都变得更简单起来。根据FreeRTOS官方反馈,在Cortex-M内核上使用FreeRTOS大多数的问题点是由不正确的优先级设置引起的。这个问题也是在意料之中的,因为尽管Cortex-M内核的中断模式是非常强大的,但对于那些使用传统中断优先级架构的工程师来说,Cortex-M内核中断机制也有点笨拙(或者是说使用比较繁琐),并且违反直觉(这个主要是因为Cortex-M中断优先级数值越大代表的优先级反而越小)。本章打算描述Cortex-M的中断优先级机制,并描述怎样结合RTOS内核使用。

说明:虽然Cortex-M内核的优先级方案看上去比较复杂,但每一个官方发布的FreeRTOS 接口包(在FreeRTOSV7.2.0FreeRTOSSourceportable文件夹中,一般为port.c)内都会有正确配置的演示例程,可以以此为参考。

1.有效优先级

1.1Cortex-M 硬件详述

首先需要清楚有效优先级的总数,这取决于微控制器制造商怎么使用Cortex内核。所以,并不是所有的Cortex-M内核微处理器都具有相同的中断优先级级别。 Cortex-M构架自身最多允许256级可编程优先级(优先级配置寄存器最多8位,所以优先级范围从0x00~0xFF),但是绝大多数微控制器制造商只是使用其中的一部分优先级。比如,TI Stellaris Cortex-M3和Cortex-M4微控制器使用优先级配置寄存器的3个位,能提供8级优先级。再比如,NXP LPC17xx Cortex-M3微控制器使用优先级配置寄存器的5个位,能提供32级优先级。

1.2应用到RTOS

RTOS中断嵌套方案将有效的中断优先级分成两组:一组可以通过RTOS临界区屏蔽,另一组不受RTOS影响,永远都是使能的。宏configMAX_SYSCALL_INTERRUPT_PRIORITY在FreeRTOSConfig.h中配置,定义两组中断优先级的边界。逻辑优先级高于此值的中断不受RTOS影响。最优值取决于微控制器使用的优先级配置寄存器的位数。

2.与数值相反的优先级值和逻辑优先级设置

2.1Cortex-M 硬件详述

有必要先解释一下优先级值和逻辑优先级:在Cortex-M内核中,假如有8级优先级,我们说优先级值是0~7,但数值最大的优先级7却代表着最低的逻辑优先级。很多使用传统传统中断优先级架构的工程师会觉得这样比较绕,违反直觉。以下内容提到的优先级要仔细区分是优先级数值还是逻辑优先级。 接下来需要清楚的是,在Cortex-M内核中,一个中断的优先级数值越低,逻辑优先级却越高。比如,中断优先级为2的中断可以抢占中断优先级为5的中断,但反过来就不行。换句话说,中断优先级2比中断优先级5的优先级更高。 这是Cortex-M内核最容易让人犯错之处,因为大多数的非Cortex-M内核微控制器的中断优先级表述是与之相反的。

2.2应用到 RTOS

以“FromISR”结尾的FreeRTOS函数是具有中断调用保护的(执行这些函数会进入临界区),但是就算是这些函数,也不可以被逻辑优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断服务函数调用。(宏configMAX_SYSCALL_INTERRUPT_PRIORITY定义在头文件FreeRTOSConfig.h中)。因此,任何使用RTOSAPI函数的中断服务例程的中断优先级数值大于等于configMAX_SYSCALL_INTERRUPT_PRIORITY宏的值。这样就能保证中断的逻辑优先级等于或低于configMAX_SYSCALL_INTERRUPT_PRIORITY。 Cortex中断默认情况下有一个数值为0的优先级。大多数情况下0代表最高级优先级。因此,绝对不可以在优先级为0的中断服务例程中调用RTOSAPI函数。

3.Cortex-M 内部优先级概述

3.1Cortex-M 硬件详述

Cortex-M内核的中断优先级寄存器是以最高位(MSB)对齐的。比如,如果使用了3位来表达优先级,则这3个位位于中断优先级寄存器的bit5、bit6、bit7位。剩余的bit0~bit4可以设置成任何值,但为了兼容,最好将他们设置成1. Cortex-M优先级寄存器最多有8位,如果一个微控制器只使用了其中的3位,那么这3位是以最高位对齐的,见下图:

e848f658-6258-11eb-8b86-12bb97331649.png

某微控制器只使用了优先级寄存器中的3位,下图展示了优先级数值5(二进制101B)是怎样在优先级寄存器中存储的。如果优先级寄存器中未使用的位置1,下图也展示了为什么数值5(二进制0000 0101B)可以看成数值191(二进制1011 1111)的。

e8830032-6258-11eb-8b86-12bb97331649.png

某微控制器只使用了优先级寄存器中的4位,下图展示了优先级数值5(二进制101B)是怎样在优先级寄存器中存储的。如果优先级寄存器中未使用的位置1,下图也展示了为什么数值5(二进制0000 0101B)可以看成数值95(二进制0101 1111)的。

e8beedc2-6258-11eb-8b86-12bb97331649.png

3.2应用到 RTOS

上文中已经描述,那些在中断服务例程中调用RTOS API函数的中断逻辑优先级必须低于或等于configMAX_SYSCALL_INTERRUPT_PRIORITY(低逻辑优先级意味着高优先级数值)。 CMSIS以及不同的微控制器供应商提供了可以设置某个中断优先级的库函数。一些库函数的参数使用最低位对齐,另一些库函数的参数可能使用最高位对齐,所以,使用时应该查阅库函数的应用手册进行正确设置。 可以在FreeRTOSConfig.h中设置宏configMAX_SYSCALL_INTERRUPT_PRIORITY和configKERNEL_INTERRUPT_PRIORITY的值。这两个宏需要根据Cortex-M内核自身的情况进行设置,要以最高有效位对齐。比如某微控制器使用中断优先级寄存器中的3位,设置configKERNEL_INTERRUPT_PRIORITY的值为5,则代码为:

#defineconfigKERNEL_INTERRUPT_PRIORITY(5<<(8-3))  宏configKERNEL_INTERRUPT_PRIORITY指定RTOS内核使用的中断优先级,因为RTOS内核不可以抢占用户任务,因此这个宏一般设置为硬件支持的最小优先级。对于Cortex-M硬件,RTOS使用到硬件的PendSV和SysTick硬件中断,在函数xPortStartScheduler()中(该函数在port.c中,由启动调度器函数vTaskStartScheduler()调用),将PendSV和SysTick硬件中断优先级寄存器设置为宏configKERNEL_INTERRUPT_PRIORITY指定的值。   有关代码如下(位于port.c): /*PendSV优先级设置寄存器地址为0xe000ed22  SysTick优先级设置寄存器地址为0xe000ed23*/ #define portNVIC_SYSPRI2_REG     ( * ( ( volatile uint32_t * ) 0xe000ed20 ))   #define portNVIC_PENDSV_PRI ( ( (uint32_t)configKERNEL_INTERRUPT_PRIORITY ) << 16UL ) #define portNVIC_SYSTICK_PRI ( ( (uint32_t)configKERNEL_INTERRUPT_PRIORITY ) << 24UL ) /* …. */ /*确保PendSV 和SysTick为最低优先级中断 */ portNVIC_SYSPRI2_REG |= portNVIC_PENDSV_PRI; portNVIC_SYSPRI2_REG |=portNVIC_SYSTICK_PRI; 

4.临界区

4.1Cortex-M 硬件详述

RTOS内核使用Cortex-M内核的BASEPRI寄存器来实现临界区(注:BASEPRI为优先级屏蔽寄存器,优先级数值大于或等于该寄存器的中断都会被屏蔽,优先级数值越大,逻辑优先级越低,但是为零时不屏蔽任何中断)。这允许RTOS内核可以只屏蔽一部分中断,因此可以提供一个灵活的中断嵌套模式。 那些需要在中断调用时保护的API函数,FreeRTOS使用寄存器BASEPRI实现中断保护临界区。当进入临界区时,将寄存器BASEPRI的值设置成configMAX_SYSCALL_INTERRUPT_PRIORITY,当退出临界区时,将寄存器BASEPRI的值设置成0。很多Bug反馈都提到,当退出临界区时不应该将寄存器设置成0,应该恢复它之前的状态(之前的状态不一定是0)。但是Cortex-M NVIC决不会允许一个低优先级中断抢占当前正在执行的高优先级中断,不管BASEPRI寄存器中是什么值。与进入临界区前先保存BASEPRI的值,退出临界区再恢复的方法相比,退出临界区时将BASEPRI寄存器设置成0的方法可以获得更快的执行速度。

4.2应用到RTOS kernel

RTOS内核通过写configMAX_SYSCALL_INTERRUPT_PRIORITY的值到BASEPRI寄存器的方法创建临界区。中断优先级0(具有最高的逻辑优先级)不能被BASEPRI寄存器屏蔽,因此,configMAX_SYSCALL_INTERRUPT_PRIORITY绝不可以设置成0。

原文标题:Cortex-M内核使用FreeRTOS特别注意事项

文章出处:【微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1305

    浏览量

    39819
  • RTOS
    +关注

    关注

    20

    文章

    764

    浏览量

    118678
  • FreeRTOS
    +关注

    关注

    11

    文章

    472

    浏览量

    61301

原文标题:Cortex-M内核使用FreeRTOS特别注意事项

文章出处:【微信号:Ithingedu,微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    使用ST-LINK对STM32G030K8T6TR进行烧录,什么特别注意事项吗?

    烧录时有什么特别注意事项吗? 3)另外STM32G030K8T6TR的GPIO口内部是否带上拉到VDD的保护二极管?GPIO口可承受的最大电压是多少?
    发表于 03-12 06:32

    芯片金线包封胶的使用注意事项是什么?

    芯片金线包封胶的使用注意事项是什么?金线包封胶是一种高性能、高粘度的密封胶,广泛应用于电子、电器、汽车等领域。它具有良好的防水、防潮、防震等性能,能够保护产品内部零件不受环境影响,提高产品的使用寿命
    的头像 发表于 01-05 11:29 395次阅读
    芯片金线包封胶的使用<b class='flag-5'>注意事项</b>是什么?

    高压衰减棒即高压探头在使用中的注意事项

    高压衰减棒是在高压测试中不可或缺的一项工具。然而,如果不正确使用,高压衰减棒可能会引起损坏,影响工作效果。因此,在使用高压衰减棒时,有一些重要事项需要特别注意。接下来PRBTEK就来为您分享一下高压
    的头像 发表于 12-29 10:33 137次阅读
    高压衰减棒即高压探头在使用中的<b class='flag-5'>注意事项</b>

    使用AD9230什么要特别注意的地方吗?

    各位好, 最近要做的一个接收机中频采样要用到AD9230这款芯片, 之前一直用AD6645,不知道AD9230在使用上有什么要特别注意的地方吗? 如果有设计过ad9230电路的朋友能否给提供以下建议,多谢!
    发表于 12-21 08:28

    如何进行太阳能离网逆变电源的安装?安装时需要特别注意事项

    如何进行太阳能离网逆变电源的安装?安装时需要特别注意事项  太阳能离网逆变电源是一种将太阳能转化为交流电的装置,适用于一些偏远地区无法接入传统电网的情况。其安装过程需要特别注意以下事项
    的头像 发表于 11-16 11:22 419次阅读

    中8位MCU EEPROM使用注意事项

    中颖8位MCU EEPROM使用注意事项
    的头像 发表于 09-27 15:34 450次阅读
    中8位MCU EEPROM使用<b class='flag-5'>注意事项</b>

    FreeRTOS移植到STM32F103步骤与注意事项

    FreeRTOS为例一步一步移植到STM32F103 上,并提醒大家某些需要注意事项。本文档为非正式技术文档,故排版会有些凌乱,希望大家能提供宝贵意见以供小灯参考改进。u3000u3000下面先以IAR
    发表于 09-26 08:03

    Cortex-M内核使用FreeRTOS特别注意事项

    本文来自CSDN博客FreeRTOS基础篇,本篇主要分享Cortex-M内核使用FreeRTOS特别注意事项
    发表于 09-19 15:01 359次阅读
    Cortex-M<b class='flag-5'>内核</b>使用<b class='flag-5'>FreeRTOS</b><b class='flag-5'>特别注意事项</b>

    华大单片机设计特别注意事项(上)

    华大单片机设计特别注意事项(上)
    的头像 发表于 09-18 10:59 624次阅读

    编码器传感器安装时需知道的3大注意事项

    机械设备组装中,编码器传感器安装时需知道的3大注意事项。一、机械注意事项1、编码器传感器与用户端输出轴不可以刚性连接应采用弹性软连接,以避免因用户轴的窜动、跳动、抖动、偏心等导致编码器轴系
    的头像 发表于 08-27 08:08 699次阅读
    编码器传感器安装时需知道的3大<b class='flag-5'>注意事项</b>

    使用注意事项

    使用注意事项
    发表于 07-07 19:04 0次下载
    使用<b class='flag-5'>注意事项</b>

    请问GPIO使用注意事项哪些?

    GPIO使用注意事项
    发表于 06-21 06:03

    ICT的注意事项哪些?

    请告诉我有关ICT的注意事项。 测量MC33FS4502NAE/R2、i.MX6(MCIMX6Y2CVM08AB)等IC周围的电阻值和电容容量。 可以想象,没有电源输入到IC,而是施加电压来测量电容
    发表于 05-29 06:11

    BK9527 替换BK9521 的注意事项

    BK9527 替换BK9521 的注意事项 BK9527的封装和脚位与9521 是一样,可以直接替换; BK9527的软件需要更新,详情请参见BK9527 的demo 程序; 请特别注意BK9527
    发表于 05-10 11:27

    展频IC布板注意事项

    展频IC布板注意事项
    发表于 04-14 10:12 4次下载