移植freeRTOS到一个完全不同且现在没有得到官方支持的处理器不是一件容易事,这边文档会介绍关于移植的一些知识。

处理器不同,实现的细节也就不同,因此这个文档没法将移植说的很详细,只是提供一个大致的移植过程及方法介绍。建议在移植的时候,先去看下官方支持的分支,然后找一个尽可能与你的处理器类似的分支作为参考。后面也会在”示例工程”章节中介绍如何去修改一个已经存在的例程。

建立文件目录结构

freeRTOS的内核源代码通常仅包含3个文件(如果使用协程的话,4个),和一个或者两个适配文件。

推荐的步骤:

  1. 下载最新版本的freeRTOS源代码。
  2. 解压文件,注意维护的目录结构。
  3. 熟悉源代码组织及目录结构。
  4. 创建一个包含移植文件的文件夹。应该遵守这样的组织机构:FreeRTOS/Source/portable/[compiler name]/[processor name]
  5. 复制空的port.cportmacro.h文件到你刚才创建的文件夹中。这两个文件包含一系列需要实现的函数,可以参考其他已经存在的文件创建。
  6. 如果处理器的栈生长方式是向下生长(高地址到低地址),那么需要把portSTACK_GROWTH设置为-1,否则设置为1.
  7. 创建文件夹包含示例程序,路径FreeRTOS/Demo/[architecture_compiler].
  8. 复制已经存在的FreeRTOSConfig.hmain.c文件当第7步创建的文件夹中。
  9. FreeRTOSConfig.h中的设置项需要根据你的实际应用修改。
  10. 在刚才创建的目录下创建目录parTest(probably FreeRTOS/Demo/[architecture_compiler]/ParTest)。复制ParTest.c文件到这个目录下。
  11. ParTest.c包含三个简单的函数:

    • 设置GPIO,用来翻转LED
    • 点亮或熄灭LED
    • 翻转LED

    这三个函数需要你自己根据你的开发板去实现。你可以参考已存在的其他处理器的ParTest.c文件。

创建工程

现在创建工程所需的全部文件都已经准备好了,是时候建立工程去编译它们了。显然,很多函数都仅仅只有原型,而没有去实现,现在这个工程还做不了什么事情,具体实现还要依靠你自己。

工程所需要包含的源文件:

  • 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/Common (i.e. ../Common)
  • Demo/[Processor Name]
  • Source/include
  • Source/portable/[Compiler name]/[Processor name]

实现

这是最难的一部分,适配层的文件此时需要开发者自己去实现,建议先实现pxPortInitialiseStack(),为了实现这个函数你需要先了解清楚你的任务堆栈的上下文结构,也就是任务在切换时,堆栈需要保存哪些寄存器或者需要恢复哪些寄存器。