新建 FreeRTOS 移植
如果使用众多现有的移植和演示应用程序,则无需阅读或理解此页面!
将 FreeRTOS 移植到完全不同且尚未支持的微控制器并非易事。 本页的目的是描述启动新移植
所需的内部管理准备工作。
每个移植都具有一定的独特性,并且非常依赖于所使用的处理器和工具,因此本页无法提供移植细节的详细信息。 然而,还有
许多其他 FreeRTOS 移植已经存在,建议将这些移植用作参考。
在同一个处理器系列中移植则直接得多,例如,从一个基于 ARM7 的设备移植到另一个。 本文档页面详细信息介绍了
如何修改现有的演示应用程序,如果想要执行此操作,就从本页开始阅读吧。
设置目录结构
FreeRTOS 内核源代码通常包含在对所有移植通用的 3 个源文件(如果使用协程,则为 4 个),和一个或两个将
RTOS 内核定制到特定架构的“移植”文件中。
建议采取的步骤:
- 下载最新版 FreeRTOS 源代码。
- 将文件解压到方便的位置,注意保持目录结构。
- 熟悉源代码组织和目录结构。
- 创建一个目录,用于包含 [architecture] 移植的“port”文件。 按照链接中概述的惯例,
目录的形式应为: FreeRTOS/Source/portable/[compiler name]/[processor name]。 例如,如果使用的是 GCC 编译器,则可以在
现有 FreeRTOS/Source/portable/GCC 目录 下创建 [architecture] 目录。
- 将空 port.c 和 portmacro.h 文件复制到刚创建的目录中。 这些文件应只包含需要实现的
函数和宏的存根。 有关此类函数和宏的列表,请参阅现有的 port.c 和 portmacro.h 文件。 只需删除函数和宏正文,
就可以从这些现有文件创建存根文件。
- 如果要移植到的微控制器上的堆栈从高内存向下增长到低内存,则将 portmacro.h 中的 portSTACK_GROWTH 设置为 -1 ,否则将 portSTACK_GROWTH 设置为 1。
- 创建一个目录,用于包含 [architecture] 移植的演示应用程序文件。
按照惯例,该格式应为 FreeRTOS/Demo/[architecture_compiler] 或类似格式。
- 将现有 FreeRTOSConfig.h 和 main.c 文件复制到刚创建的目录中。 同样,应将这些文件编辑为仅存根文件。
- 不妨看看 FreeRTOSConfig.h 文件: 该文件包含一些适合您选择的硬件设置的宏。
- 从刚创建的目录中创建一个目录,并将其命名为 ParTest(可能是 FreeRTOS/Demo/[architecture_compiler]/ParTest)。
将 ParTest.c 存根文件复制到此目录中。
- ParTest.c 包含三个简单函数来执行如下操作:
- 设置一些可以使 LED 闪烁的 GPIO,
- 设置或清除特定的 LED ,以及
- 切换 LED 的状态。
您的开发板需要实现这 3 种函数。 LED 输出正常工作将有助于完成其余所需的工作。
请查看其他演示项目中包含的许多现有 ParTest.c 文件示例(名称 ParTest 是 PARallel port TEST 的曾用名) ,
以及描述如何修改现有演示应用程序的页面,获取
有关编入和测试 ParTest.c 函数的信息。
创建项目
现在,所有必需的文件都已就绪,您需要创建一个项目(或 makefile)来成功构建这些文件。
很显然,这些文件只包含存根,所以还不会完成任何操作,但是一旦开始构建,就可以用工作函数逐渐替换存根。
该项目需要包含以下文件:
- Source/tasks.c
- Source/Queue.c
- Source/List.c
- Source/portable/[compiler name]/[processor name]/port.c
- Source/portable/MemMang/heap_1.c (or heap_2.c or heap_3.c or heap_4.c)
- Demo/[processor name]/main.c
- Demo/[Processor name]/ParTest/ParTest.c
下列目录需要在包含路径中,请使用 Demo/[Process name] 目录中的相对路径-而不是绝对路径:
- Demo/Common (i.e. ../Common)
- Demo/[Processor Name]
- Source/include
- Source/portable/[Compiler name]/[Processor name]
实现存根
现在来完成最困难的部分。 编译项目后,就需要实现可移植层存根。 建议首先实现 pxPortInitialiseStack() 函数
。 若要实现 pxPortInitialiseStack(),必须首先确定任务上下文堆栈帧结构体,该结构体对架构的依赖性非常高。
获取帮助
一点要记得, WITTENSTEINhigh integrity systems 提供完整的移植和测试服务!
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.