FreeRTOS移植

一、FreeRTOS系统

RTOS全称是 Real Time Operating System,中文名就是实时操作系统。可以看出 FreeROTS就是一个免费的RTOS类系统。这里要注意,RTOS不是指某一个确定的系统,而是指一类系统。比如UCOS, FreeRTOS,RTX,RT- Thread等这些都是RTOS类操作系统。操作系统允许多个任务同时运行,这个叫做多任务,实际上,一个处理器核心在某一时刻只能运行一个任务。操作系统中任务调度器的责仼就是决定在某一时刻究竟运行哪个任务,任务调度在各个任务之间的切换非常快!这就给人们造成了同一时刻有多个任务同时运行的错觉。操作系统的分类方式可以由任务调度器的工作方式决定,比如有的操作系统给每个任务分配同样的运行时间,时间到了就轮到下一个任务,Unⅸx操作系统就是这样的。RTOS的任务调度器被设计为可预测的,而这正是嵌入式实时操作系统所需要的,实时环境中要求操作系统必须对某一个事件做出实时的响应,因此系统任务调度器的行为必须是可预测的。像 FreeRTOS这种传统的RTOS类操作系统是由用户给每个任务分配一个任务优先级,任务调度器就可以根据此优先级来决定下一刻应该运行哪个任务。FreeRTOS是RTOS系统的一种,FreeRTOS十分的小巧,可以在资源有限的微控制器中运行。当然了, FreeRTOS不仅局限于在微控制器中使用。但从文件数量上来看 FreeRTOS要比UCOSII和UCOSⅢ小的多。
FreeRTOS官方网站(www.freertos.org)。可以在上面下载FreeRTOS源代码,也可以查看是否支持需要移植的MCU,支持的话只需要稍作修改即可。
FreeRTOS移植_第1张图片

二、FreeRTOS源代码文件夹简介

FreeRTOS移植_第2张图片
以上为FreeRTOS的源代码。
其中FreeRTOS文件夹为FreeRTOS的源代码,Puls文件夹为扩展的代码。
这里主要介绍FreeRTOS。
FreeRTOS移植_第3张图片
1、Demo文件夹里面是FreeRTOS的相关例程。
打开为下图(对应相应的MCU)。FreeRTOS移植_第4张图片
其中CORTEX_M4F_STM32F407ZG-SK为STM32F407示例。
2、License文件夹是相关的许可信息。
做产品的时候需要自己查看,这里不做详细的讲解。
3、Source文件夹为FreeRTOS的源代码。
打开为下图。
FreeRTOS移植_第5张图片
include文件夹就是一些头文件,移植的时候需要,下面的.c文件就是FreeRTOS源代码啦!移植的时候必须。protable文件夹就是FreeRTOS系统软件和具体硬件之间连接的桥梁,不同的MCU对应的桥梁是不一样的。其中的RVDS、MemMang、Keil为MDK编译环境下的文件。MemMang与内存管理相关,RVDS文件夹是针对不同的架构的MCU做了分类,STM323F407参考ARM_CM4F。Keil为使用Keil软件需要。

三、移植

1、在工程中新建一个名为FreeRTOS的文件夹,并将FreeRTOS的源代码添加到这个文件夹。将portable里的Keil、MemMang、RVDS文件加入到这个文件夹。
FreeRTOS移植_第6张图片
2、向工程分组添加文件
打开工程,在Keil软件中新建 FreeRTOS_CORE和FreeRTOS_PORTABLE,然后在这两个分组添加文件。
FreeRTOS移植_第7张图片
其中port.c为RVDS文件夹中的ARM_CM4F(F表示带有FPU浮点运算),heap4.c为MemMang文件夹里面的。共有5种不同的管理方法,目前不做详细的讲解。
3、添加相应的头文件。
FreeRTOS移植_第8张图片
编译一下,发现FreeRTOSConfig.h文件打不开,是因为缺少这个文件,可以去STM32F407的移植工程文件中找,及刚刚讲的Demo中。FreeRTOS移植_第9张图片
FreeRTOSConfig.h这个文件是FreeRTOS的配置文件,一般的操作系统裁剪、配置都是通过这个文件的宏定义完成。再编译一次会看见有SystemCoreClock未定义,FreeRTOSConfig.h用来标记MCU的频率。
FreeRTOS移植_第10张图片
需要将FreeRTOSConfig.h的条件编译改成

#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
    #include 
    extern uint32_t SystemCoreClock;
#endif

再编译一次,还是会有错误,再将stm32f4xx_it.c中的PendSV_Handler()和SVC_Handler()以及Systick_Handler()三个函数屏蔽掉,这里和port.c定义重复。
再编译一次,发现在FreeRTOSConfig.h文件中Hook结尾的函数未定义,这些函数用户需要用的话需要自己去编写,就是回调函数。这里只需要将这些钩子函数屏蔽掉即可。configUSE_IDLE_HOOK、configUSE_TICK_HOOK、configUSE_MALLOC_FAILED_HOOK、configCHECK_FOR_STACK_OVERFLOW定义为0即可。
在编译一次,应该就没有错误了。

这样就完成了FreeRTOS的移植。

你可能感兴趣的:(FreeRTOS操作系统,stm32,freertos,RTOS移植)