欢迎光临散文网 会员登陆 & 注册

FreeRTOS 操作系统移植(MDK)

2023-07-05 17:34 作者:自闭选手的Z23  | 我要投稿

1. 开发环境使用 MDK,用 MDK4.7X 或者 MDK5.XX 均可,保证支持 STM32F103,F407 和 F429 即可。

(不可以使用 MDK4.7X 以下版本,一方面是不支持 F429,另外就是 FreeRTOS V8.2.3 要用到 C 代码中嵌套汇编代码,MDK4.7X 以下版本是不支持的)。

2. 找一个简单的工程,最好是跑马灯之类的,越简单越好,我们就在这个简单的工程上面移植即可。

3. 大家使用的简单工程里面不能有 SysTick,PendSV 和 SVC 三个系统中断的使用,因为 FreeRTOS 系统要使用这三个中断。

 

首先准备好一个简单的裸机工程模板

◆ 第 1 步:从网址 https://sourceforge.net/projects/freertos/files/FreeRTOS/V8.2.3/

下载 V8.2.3 版本

FreeRTOSV8.2.3.zip 和 FreeRTOSV8.2.3.exe 内容是一样的,只是后缀为 exe 的压缩率更高些。下载后 解压出来。 

 

◆ 第 2 步:在工程模板创建 FreeRTOS 文件夹 


 

◆ 第 3 步:添加源码文件到相应文件夹

将 FreeRTOSV8.2.3 软件包中路径:FreeRTOSV8.2.3\FreeRTOS\Source 里面如下所有文复制到刚刚创建的 FreeRTOS 文件夹下。

 

文件夹 User 中还需要添加如下文件:

 

文件 FreeRTOSConfig.h 文件在 FreeRTOSV8.2.3 软件包中的中的路径:

FreeRTOSV8.2.3\FreeRTOS\Demo\CORTEX_STM32F103_Keil,

其实就是官方整理好的配置文件

 

 

将源码文件添加到 MDK 的工程项目中,添加后的效果如下:

 


其中 heap_4.c 文件路径: FreeRTOS\Source\portable\MemMang

 

port.c 和 portmacro.h 文件的路径:FreeRTOS\Source\portable\RVDS\ARM_CM3,由于 STM32F103 是 M3 内核的,所以移植文件也要添加 M3 内核的。

 

◆ 第 4 步:新创建一个 includes.h 文件,将所有的头文件都集中到这个头文件下。

 

这样做的好处是引用头文件的时候,只添加这个头文件就可以了。includes.h 文件放在了 User 文件夹中。然后再将这个文件也添加到 MDK 工程项目中(将.h 文件添加到工程的好处是方便查看和修改)

 

includes.h 文件中的内容如下:

 


◆ 第 5 步:添加相应的头文件路径,在原来工程模板的基础上新添加的两个路径: 

 

 

第 6 步:最后一步,同时也是最重要的一步,修改 FreeRTOSConfig.h 配置文件

(用户根据自己的配置进行修改,不修改也是没问题的,进行修改是为了方便初学者学习),主要两个方面:

1.添加宏定义__NVIC_PRIO_BITS,STM32 系列产品优先级仅使用 4 位。 

2.修改优先级相关的几个宏定义,具体修改了哪个可以对比原始文件查看。 

 

修改后在这个文件的末尾加上 Systick,PendSV 和 SVC 中断函数的宏定义,

目的是将 FreeRTOS 移植文件 port.c 文件里面的中断服务程序映射到 CMSIS 定义的标准名称,这样就不需要用户去修改工程启动代码中这几个中断的名字了,很方便就实现了两个函数的统一。

其中 vPortSVCHandler,xPortPendSVHandler 和 xPortSysTickHandler 是在 port.c 文件里面定义的。

SVC_Handler,PendSV_Handler 和SysTick_Handler startup_stm32f10x_hd.s 文件里面进行了定义。

 

下面是 FreeRTOSConfig.h 配置文件的完整内容: 


FreeRTOS 操作系统应用实例

FreeRTOSConfig.h 配置文件里面几个重要选项说明: 

◆ #define configUSE_PREEMPTION  1

使能抢占式调度器

 

◆ #define configCPU_CLOCK_HZ ( ( unsigned long ) 72000000 )

系统主频 72MHz。

 

◆ #define configTICK_RATE_HZ ( ( TickType_t ) 1000 )

系统时钟节拍 1KHz,即 1ms。


◆ #define configMAX_PRIORITIES ( 5 ) 

    定义可供用户使用的最大优先级数,如果这个定义的是 5,那么用户可以使用的优先级号是 0,1,2,3,4, 不包含 5,对于这一点,初学者要特别的注意。 


◆ #define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) ) 

    定义堆大小,FreeRTOS 内核,用户动态内存申请,任务栈等都需要用这个空间。 


    经过上面的移植和配置之后,在 main.c 文件中添加如下代码,代码中简单地创建了四个用户任务:

vTaskTaskUserIF 任务:接口消息处理,这里用作 LED 闪烁。

AppTaskLED 任务 :LED 闪烁。 

vTaskMsgPro 任务 :消息处理,这里用作 LED 闪烁。 

AppTaskStart 任务 :启动任务,也是最高优先级任务,这里实现 LED 闪烁。



 

 

 

 



FreeRTOS 操作系统移植(MDK)的评论 (共 条)

分享到微博请遵守国家法律