FreeRTOS移植到Cortex-M3-M4

翻译自FreeRTOS官网文档,原文网址:http://www.freertos.org/RTOS-Cortex-M3-M4.html

转载:原文出处:http://bbs.ednchina.com/BLOG_ARTICLE_3009240.HTM

  数以千计的FreeRTOS应用运行在ARM Cortex-M内核上。令人惊奇的是,RTOS与Cortex-M内核组合使用,使得技术支持请求变得如此的少。大多数的问题点是由不正确的优先级设置引起的。这个问题也是在意料之中的,因为尽管Cortex-M内核的中断模式是非常强大的,但对于那些使用传统中断优先级架构的工程师来说,Cortex-M内核中断机制也有点笨拙(或者是说使用比较繁琐),并且违反直觉(这个主要是因为Cortex-M优先级数越大代表的优先级反而越小)。本章打算描述Cortex-M的中断优先级机制,并描述怎样结合RTOS内核使用。

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

有效优先级

Cortex-M 硬件详述

首先需要清楚有效优先级的总数,这取决于微控制器制造商怎么使用Cortex内核。所以,并不是所有的Cortex-M内核微处理器都具有相同的中断优先级级别。

Cortex-M构架自身最多允许256级可编程优先级(优先级配置寄存器最多8位,所以优先级范围从0x00~0xFF),但是绝大多数微控制器制造商只是使用其中的一部分优先级。比如,TI Stellaris Cortex-M3和Cortex-M4微控制器使用优先级配置寄存器的3个位,能提供8级优先级。再比如,NXP LPC17xx Cortex-M3微控制器使用优先级配置寄存器的5个位,能提供32级优先级。

如果你的工程包含CMSIS库头文件(这里是指Cortex M3的CMSIS库头文件,也就是core_cm3.h,可以在ARM官网下载),则头文件中的宏__NVIC_PRIO_BITS定义使用多少优先级寄存器的位(默认是4位)。

应用到RTOS

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

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

Cortex-M 硬件详述

有必要先解释一下优先级值和逻辑优先级:在Cortex-M内核中,假如有8级优先级,我们说优先级值是0~7,但数值最大的优先级7却代表着最低的逻辑优先级。很多使用传统传统中断优先级架构的工程师会觉得这样比较绕,违反直觉。以下内容提到的优先级要仔细区分是优先级数值还是逻辑优先级。

接下来需要清楚的是,在Cortex-M内核中,一个中断的优先级数值越低,逻辑优先级却越高。比如,中断优先级为2的中断可以抢占中断优先级为5的中断,但反过来就不行。换句话说,中断优先级2比中断优先级5的优先级更高。

这是Cortex-M内核最容易让人犯错之处,因为大多数的非Cortex-M内核微控制器的中断优先级表述是与之相反的。

应用到 RTOS

以“FromISR”结尾的FreeRTOS函数是具有中断调用保护的(执行这些函数会进入临界区),但是就算是这些函数,也不可以被逻辑优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断服务函数调用。(宏configMAX_SYSCALL_INTERRUPT_PRIORITY定义在头文件FreeRTOSConfig.h中)。因此,任何使用RTOS API函数的中断服务例程的中断优先级数值大于等于configMAX_SYSCALL_INTERRUPT_PRIORITY宏的值。这样就能保证中断的逻辑优先级等于或低于configMAX_SYSCALL_INTERRUPT_PRIORITY。

Cortex中断默认情况下有一个数值为0的优先级。大多数情况下0代表最高级优先级。因此,绝对不可以在优先级为0的中断服务例程中调用RTOS API函数。

Cortex-M 内部优先级概述

Cortex-M 硬件详述

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

Cortex-M优先级寄存器最多有8位,如果一个微控制器只使用了其中的3位,那么这3位是以最高位对齐的,见下图:

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

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

(原出处,本图有误,查找英文出处修订改过)

应用到 RTOS

上文中已经描述,那些在中断服务例程中调用RTOS API函数的中断逻辑优先级必须低于或等于configMAX_SYSCALL_INTERRUPT_PRIORITY(低逻辑优先级意味着高优先级数值)。

CMSIS以及不同的微控制器供应商提供了可以设置某个中断优先级的库函数。一些库函数的参数使用最低位对齐,另一些库函数的参数可能使用最高位对齐,所以,使用时应该查阅库函数的应用手册进行正确设置。

可以在FreeRTOSConfig.h中设置宏configMAX_SYSCALL_INTERRUPT_PRIORITY和configKERNEL_INTERRUPT_PRIORITY的值。(关于这两个宏可以参考参数设置一章,网址:http://openmcu.net/post/kernel-config.html)。这两个宏需要根据Cortex-M内核自身的情况进行设置,要以最高有效位对齐。比如某微控制器使用中断优先级寄存器中的3位,设置configKERNEL_INTERRUPT_PRIORITY的值为5,则代码为:

#define  configKERNEL_INTERRUPT_PRIORITY     (5<<(8-3))

对于每一个官方FreeRTOS演示例程,这也是在FreeRTOSConfig.h中要设置宏configKERNEL_INTERRUPT_PRIORITY为最低优先级时,为什么要将它设置为255(1111 1111B)的原因。使用这种方式指定这个值的原因是:FreeRTOS内核是直接在Cortex-M内核硬件上运行的(没有使用第三方接口库函数),要比大多数库函数先运行。现在也有开发第一个Cortex-M库函数计划。

临界区

Cortex-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的方法可以获得更快的执行速度。

应用到RTOS kernel

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

时间: 2024-11-05 13:16:15

FreeRTOS移植到Cortex-M3-M4的相关文章

Cortex M3 NVIC与中断控制

Cortex M3 NVIC与中断控制 宗旨:技术的学习是有限的,分享的精神的无限的. 一.NVIC概览 --嵌套中断向量表控制器 NVIC 的寄存器以存储器映射的方式来访问,除了包含控制寄存器和中断处理的控制逻辑之外, NVIC 还包含了 MPU. SysTick 定时器以及调试控制相关的寄存器. NVIC 共支持 1 至 240 个外部中断输入(通常外部中断写作 IRQs).具体的数值由芯片厂商在设计芯片时决定.此外, NVIC 还支持一个"永垂不朽"的不可屏蔽中断( NMI)输入

InterviewQuestion_SQLServer_Probl_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式

题目:有个年度统计表,结构如下: 怎么样把这个表,查询成这样一个结果: 这是在面试过程中遇到的一个关于数据库的题,没有一点思路,不知它考查到的知识点是什么,如何下手? 网上搜了一下,有哥们儿说这是典型的"行转列问题",好像用到"交叉表查询",下面看看具体的代码! 文件:SQLQuery1.sql /* 环境:Microsoft SQL Server 2012 工具: Microsoft SQL Server Management Studio 数据库: Interv

ARM cortex M3寄存器及指令集

1.cortex M3拥有通用寄存器R0-R15及一些特殊寄存器: R0‐R7 也被称为低组寄存器.所有指令都能访问它们.它们的字长全是 32 位,复位后的初始值是不可预料的. R8‐R12 也被称为高组寄存器.这是因为只有很少的 16 位 Thumb 指令能访问它们, 32位的指令则不受限制.它们也是 32 位字长,且复位后的初始值是不可预料的 . R13 是堆栈指针.在 CM3 处理器内核中共有两个堆栈指针,于是也就支持两个堆栈.当引用 R13(或写作 SP)时,你引用到的是当前正在使用的那

FreeRTOS移植

1.FreeRTOS目录结构 FreeRTOS |___Demo        对应各个芯片的示例程序 |___License     相关许可信息 |___Source      系统源代码 |___include       源码头文件 |___portable     这个文件夹中的文件决定FreeRTOS的可移植性,移植时根据不同平台选择不同的文件 2.移植 建立工程后,添加相应的文件,然后编译,出现如下错误: .\Objects\freeRTOS_sCreate_task.axf: E

1、FreeRTOS移植

目录 1.FreeRTOS目录结构 2.移植 3.FreeRTOSConfig.h 文件分析 正文 1.FreeRTOS目录结构 FreeRTOS FreeRTOS简略目录如下: ├─FreeRTOS │ ├─Demo // 各种开发工具的完整Demo,开发者可以方便的以此搭建出自己的项目,甚至直接使用 │ │ ├─Common // 所有例程都可以使用的演示例程文件 │ │ └─其他 // 对应平台和开发工具的项目例程(命名:平台_开发工具,例如:CORTEX_M4F_M0_LPC43xx_K

stm32和cortex M3学习内核简单总结

1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来把我学到的东西做一个系统的概述: 上图是stm32的系统结构. 使用哈弗体系结构,取指和取数据分离, ICODE指令总线连接到flash闪存指令存储区,这个存储区的地址在0x00000000-0x1FFFFFFF之间,负责取指操作. DCODE数据总线负责在0x00000000-0x1FFFFFFF

ARM7 与Cortex M3的区别

Cortex-M3和ARM7的比较 2005年3月,ARM公司公布了最新的ARMv7架构,并定义了三大系列: ”A“系列面向尖端的基于虚拟内存的操作系统和用户应用.主要针对日益增长的运行包括Linux.Windows CE和Symbian在内的消费电子和无线产品: ”R“系列针对实时系统.主要针对需要运行实时操作系统来进行控制应用的系统,包括骑车电子.网络和影像系统. ”M“系列针对微控制器和低成本应用提供优化.针对开发费用非常敏感,同时对性能要求不断增加的嵌入式应用,如微控制器.骑车车身控制系

FREERTOS移植(MDK 、STM32F103)

需要添加: 内核源码源文件.portable源文件.内存管理heap源文件.FreeRTOSConfig.h .在图示路径,FreeRTOSConfig.h如果官方Demo里面的比较旧可以找一些开发板的来用,要同系列. 项目中新增FREERTOS文件夹添加:内核源码源文件(crotine.c   \  event_group.c   \    list.c    \   queue.c task.c   \   tasks.c   \   timers.c) 新增PORT文件夹添加:portab

[FreeRTOS].FreeRTOS CortexM3 M4中断优先级设置总结

转自:https://blog.csdn.net/xukai871105/article/details/53516857 前言本文将说明在FreeRTOS嵌入式操作系统中,如何设置STM32 Cortex M3和M4系列MCU的中断优先级.总结 [1]STM32L1系列,STM32F1系列,STM32F4系列,设置NVIC时需要使用NVIC_PriorityGroup_4. [2]抢占优先级的要比“MAX”更大,而比“LOWEST”更小.例如 configLIBRARY_MAX_SYSCALL