1、前言
本文记录了本人使用Keil V5.28向Cortex M33处理器下的一款MCU进行FreeRTOS V10.2.0的移植操作,过程中描述如存在不当或错误之处欢迎指正。
2、FreeRTOS V10.2.0简介
2.1、关于FreeRTOS 的详细介绍建议直接去官网查看,在这里就不再翻译。官网链接如下:
2.2、本文简单描述一下,我对FreeRTOS 系统文件结构的理解,详细如下:
1.1、基础的目录结构(Basic Directory Structure)
+---FreeRTOS-Plus //包含FreeRTOS+的组件及demo例程
|
+---FreeRTOS //包含FreeRTOS的实时内核代码的源文件及demo例程
|
+---Demo //包含demo应用例程
|
+---Common //The demo application files that are used by all the demos
|
+---Dir x //The demo application build files for port x
|
+---Dir y //The demo application build files for port y
|
+---Source //包含实时内核源代码
|
+---include //FreeRTOS内核代码所需头文件
|
+---Portable //Processor specific code
|
+---Compiler x //All the ports supported for compiler x
|
+---Compiler y //All the ports supported for compiler y
|
+---MemMang //The sample heap implementations
1.2、FreeRTOS内核代码的核心由三个文件包含
+---Source
|
+---tasks.c //
|
+---queue.c //
|
+---list.c //
+---Source
|
+---timer.c //software timer
|
+---croutine.c //co-rountine 功能
1.3、FreeRTOS针对每一个处理器架构分别需要一些特定的依赖于架构的代码,这些代码就是RTOS的portable层,
这部分代码位于 FreeRTOS/Source/Portable/[compiler]/[architecture] 。
|
+---[compiler] //编译器用于创建port
|
+---[architecture] //架构就是port代码最终要运行的平台
1.4、为了有效管理内存,FreeRTOS也提供了堆(heap)操作相关的代码,此部分代码位于:
|
+---FreeRTOS/Source/portable/MemMang
2.3 FreeRTOS V10.2.0 pack包的下载
2.3.1、可以使用keil自带的Pack Installer,具体界面如下:
2.3.2、可以再通过如下链接下载:
https://keilpack.azureedge.net/pack/ARM.CMSIS-FreeRTOS.10.2.0.pack
2.3.3、FreeRTOS V10.2.0的安装
直接双击pack文件包即可。
3、FreeRTOS的移植操作
3.1借助KEIL的RTE(Run-Time Enviroment)安装
(1)创建新的项目;
(2)配置运行时环境(RTE)时加入如下选项;
(3)然后单击确定即可;
(4)
注:上述操作简单,但代码编译时可能会出现一些error或warning需要针对性的处理一下。通常主要是修改FreeRTOSConfig.h文件中的一些宏定义。
(A)如果实际项目中需要使用Timers,即在配置运行环境时加入了Timers选项,那么需要对FreeRTOSConfig.h中的configUSE_TIMERS宏做如下修改:
//[Demon]0-->1 configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available.
#define configUSE_TIMERS 1
如果实际项目中不需要使用Timers,那么此宏不需要调整。
(B)另外,针对不同Port再操作是如果使用非安全模式,那么需要对FreeRTOSConfig.h中的configENABLE_TRUSTZONE做如下修改:
#define configENABLE_TRUSTZONE 0//[Demon]1-->0
如果configENABLE_TRUSTZONE定义为1,那么则默认为打开TRUSTZONE功能(关于此功能的详细介绍,可以单独搜索确认)
3.2手动方式移植FreeRTOS V10.2.0
(1)新建项目
(2)配置项目运行时环境时不加入于RTOS相关的选项;
(3)将FreeRTOS V10.2.0下的文件(源文件、头文件)加入到项目中,具体操作如下
(A)加入系统内核源文件(主要是list.c/task.c/queue.c),这些文件在
FreeRTOS 10.2.0\Source目录下
(B)加入内存管理(heap相关)文件,heap1.c ~heap5.c
\FreeRTOS 10.2.0\Source\portable\MemMang 目录下
(C) 加入接口(Port)平台相关文件
\FreeRTOS 10.2.0\Source\portable\GCC\ARM_CM33_NTZ\non_secure
其中ARM_CM33_NTZ中的NTZ表示:No Trust Zone
(D)通常需要加入的源文件主要有:
(E)需要加入的头文件如下
- FreeRTOS 10.2.0\Source\portable\GCC\ARM_CM33_NTZ\non_secure
==》portasm.h and portmacro.h
2.\FreeRTOS 10.2.0\Config\ARMCM
==》FreeRTOSConfig.h文件
3.FreeRTOS 10.2.0\Source\include
==》文件较多,不再列举
4.\FreeRTOS 10.2.0\CMSIS\RTOS2\FreeRTOS\Include
==》freertos_evr.h文件
(F)挂接中断
在Cortex-M3硬件下,FreeRTOS使用SysTick作为系统节拍时钟,使用SVC和PendSVC进行上下文切换。异常中断服务代码位于port.c文件中,FreeRTOS的作者已经为各种架构的CPU写好了这些代码,可以直接拿来用,需要用户做的,仅仅是将这些异常中断入口地址挂接到启动代码中。
在startup_ADuCMxxx.s中,使用IMPORT关键字声明要挂接的异常中断服务函数名,然后将:
DCD SVC_Handler 换成: DCD vPortSVCHandler
DCD PendSV_Handler 换成: DCD xPortPendSVHandler
DCD SysTick_Handler 换成: DCD xPortSysTickHandler
(G)设置节拍时钟
这里我们使用SysTick定时器作为系统的节拍时钟,设定每隔10ms产生一次节拍中断。由于FreeRTOS对移植做了非常多的工作,以至于我们只需要在FreeRTOSConfig.h中配置好以下两个宏定义即可:
configCPU_CLOCK_HZ (/*你的硬件平台CPU系统时钟,Fcclk*/)
configTICK_RATE_HZ ((portTickType)100)
第一个宏定义CPU系统时钟,也就是CPU执行时的频率。第二个宏定义FreeRTOS的时间片频率,这里定义为100,表明RTOS一秒钟可以切换100次任务,也就是每个时间片为10ms。
在prot.c中,函数vPortSetupTimerInterrupt()设置节拍时钟。该函数根据上面的两个宏定义的参数,计算SysTick定时器的重装载数值寄存器,然后设置SysTick定时器的控制及状态寄存器,设置如下:使用内核时钟源、使能中断、使能SysTick定时器。另外,函数vPortSetupTimerInterrupt()由函数vTaskStartScheduler()调用,这个函数用于启动调度器。
4、以上就是FreeRTOS V10.2.0的整个移植过程的简述,后续实际应用中如有此方面的应用,则会对此文章进行更新。
参考链接:https://blog.csdn.net/zhzht19861011/article/details/50072033