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

    文章

    1372

    浏览量

    40282
  • RTOS
    +关注

    关注

    22

    文章

    811

    浏览量

    119598
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62149

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    TLC4502实际设计、使用中应该特别注意些什么?

    TLC4502初看就是个性能优越的运放,实际上的内部结构与普通的运放大不相同,实际设计、使用中应该特别注意些什么?
    发表于 09-26 07:43

    绕线电感定制的注意事项

    电子发烧友网站提供《绕线电感定制的注意事项.docx》资料免费下载
    发表于 09-20 11:24 0次下载

    LiFePO4设计注意事项

    电子发烧友网站提供《LiFePO4设计注意事项.pdf》资料免费下载
    发表于 09-03 09:24 0次下载
    LiFePO4设计<b class='flag-5'>注意事项</b>

    故障电容器检查时的注意事项

    在检查故障电容器时,必须特别注意安全和准确的诊断。以下是一些关键注意事项: 1、断电操作 确保电源关闭 :在开始检查前,务必确保相关电路断电,并且电容器已经完全放电。 放电处理 :电容器在断电后仍可
    的头像 发表于 08-22 14:04 421次阅读

    TLV9062在运放选型时有没有什么特别注意事项

    如下图所示的V-I转换电路,在运放选型时有没有什么特别注意事项?如电压反馈型运放还是电流反馈型运放
    发表于 07-31 08:08

    4芯M16公头插座在设备上使用时的注意事项

     德索工程师说道4芯M16公头插座在设备上使用时,为确保其性能稳定、安全可靠,需要特别注意以下几个方面的事项。以下是对这些注意事项的详细分析和归纳:   质量可靠:优先选择知名品牌、经过严格质量检测的4芯M16公头插座,确
    的头像 发表于 06-21 11:56 390次阅读
    4芯M16公头插座在设备上使用时的<b class='flag-5'>注意事项</b>

    FMD LINK 使用注意事项

    电子发烧友网站提供《FMD LINK 使用注意事项.pdf》资料免费下载
    发表于 05-06 10:11 0次下载

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

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

    请问使用MINIPROG3什么注意事项

    请问使用MINIPROG3什么注意事项?我使用miniprog3时烧坏了3个,最近连续烧坏2个, 怎样才能避免miniprog3烧坏?
    发表于 02-21 07:12

    浪涌抑制器的应用及注意事项

    浪涌抑制器的应用及注意事项?|深圳比创达电子
    的头像 发表于 01-19 09:55 730次阅读
    浪涌抑制器的应用及<b class='flag-5'>注意事项</b>?

    测速电机: 常见6大注意事项

    测速电机: 常见6大注意事项!测速电机是一种用于测量物体运动速度的设备,广泛应用于工业生产和科学研究中。测速电机常见的6大注意事项以确保安全和准确性。
    的头像 发表于 01-11 10:53 481次阅读
    测速电机: 常见6大<b class='flag-5'>注意事项</b>

    射频电缆组件的使用方法和注意事项

    射频电缆组件的使用方法和注意事项  射频电缆组件是一类广泛应用于通信系统、无线电设备和其他射频设备中的重要电子组件。它们在传输高频信号时扮演着关键的角色,因此使用和安装时需要特别注意一些事项。本文将
    的头像 发表于 01-05 15:08 654次阅读

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

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

    DC电源模块哪些注意事项和使用技巧?

    DC电源模块哪些注意事项和使用技巧?
    的头像 发表于 12-25 13:59 605次阅读
    DC电源模块<b class='flag-5'>有</b>哪些<b class='flag-5'>注意事项</b>和使用技巧?