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

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

    关注

    4

    文章

    1436

    浏览量

    42491
  • RTOS
    +关注

    关注

    25

    文章

    862

    浏览量

    122611
  • FreeRTOS
    +关注

    关注

    14

    文章

    497

    浏览量

    66355

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    驱动板PCB布线的注意事项

    PCB Layout 注意事项 1)布局注意事项: ●● 整体布局遵循功率回路与小信号控制回路分开布局原则,功率部分和控制部分的 GND 分开回流到输入 GND。 ●● 芯片的放置方向优先考虑驱动
    发表于 12-02 07:40

    CW32R031射频板LAYOUT注意事项哪些?

    CW32R031射频板LAYOUT注意事项哪些?目前433MHz发射时单片机偶尔死机,天线距离MCU只有2cm,需要做特别隔离吗?
    发表于 11-19 08:09

    CW32F030在使用中的注意事项哪些?

    CW32F030在使用中的注意事项哪些?
    发表于 11-18 06:20

    有没有使用芯源的EEPROM的案例指南?哪些需要特别注意事项

    有没有使用芯源的EEPROM的案例指南?哪些需要特别注意事项
    发表于 11-14 07:54

    L083最低功耗是多少,应该如何进行低功耗设计?哪些注意事项

    L083最低功耗是多少,应该如何进行低功耗设计?哪些注意事项
    发表于 11-12 07:29

    emWin AppWizard 开发注意事项哪些?

    emWin AppWizard 开发注意事项
    发表于 09-04 06:18

    锥齿轮减速机的使用安装和维护维修注意事项

    锥齿轮减速机的使用、安装和维护维修注意事项涵盖了多个方面,以下是对这些注意事项的详细归纳: 一、使用注意事项 1. 确认规格与设计相符:在使用减速机前,请先行确认购买的规格与设计规格是否相符。 2.
    的头像 发表于 04-21 18:13 949次阅读
    锥齿轮减速机的使用安装和维护维修<b class='flag-5'>注意事项</b>

    记忆示波器校准过程中需要特别注意什么?

    在记忆示波器校准过程中,需特别注意以下关键点,以确保校准结果的准确性和可靠性:一、环境控制 [td]因素影响措施 温度元件特性变化,导致测量误差保持(23±5)℃,变化率≤1℃/h 湿度漏电流增加
    发表于 04-15 14:15

    扫描电镜的日常维护哪些注意事项

    扫描电镜日常维护的注意事项
    的头像 发表于 03-24 11:38 921次阅读
    扫描电镜的日常维护<b class='flag-5'>有</b>哪些<b class='flag-5'>注意事项</b>?

    GD32单片机GPIO结构及注意事项

    电子发烧友网站提供《GD32单片机GPIO结构及注意事项.pdf》资料免费下载
    发表于 02-07 17:27 3次下载
    GD32单片机GPIO结构及<b class='flag-5'>注意事项</b>

    智多晶DDR Controller使用注意事项

    最后一期我们主要介绍智多晶DDR Controller使用时的注意事项
    的头像 发表于 01-24 11:14 1352次阅读
    智多晶DDR Controller使用<b class='flag-5'>注意事项</b>

    AN20-仪表低通滤波器的应用注意事项

    电子发烧友网站提供《AN20-仪表低通滤波器的应用注意事项.pdf》资料免费下载
    发表于 01-12 11:25 0次下载
    AN20-仪表低通滤波器的应用<b class='flag-5'>注意事项</b>

    在应用霍尔开关时,什么需要特别注意的地方?

    应用霍尔开关时,以下几项注意事项,以确保其正常工作和高效应用: 1. 选择合适的霍尔开关类型 工作电压和电流:根据应用环境选择合适的霍尔开关类型。不同的霍尔开关适用于不同的电压和电流条件,应确保
    的头像 发表于 12-20 16:51 1188次阅读
    在应用霍尔开关时,<b class='flag-5'>有</b>什么需要<b class='flag-5'>特别注意</b>的地方?

    多层板埋孔设计注意事项

    多层板埋孔设计注意事项
    的头像 发表于 12-20 16:06 1239次阅读

    霍尔元件使用注意事项哪些?

    延长使用寿命。以下是一些关键的注意事项: 静电防护 : 霍尔元件是静电敏感器件,在接触、搬运、存储和焊接过程中,必须采取适当的静电防护措施,如佩戴防静电手环或手套。 电源电压和负载 : 确保霍尔元件的电源电压在规定
    的头像 发表于 12-11 14:57 928次阅读