全部学习汇总: GitHub - GreyZhang/g_FreeRTOS: learning notes about FreeRTOS.
其实,这个话题基本上是关于FreeRTOS的移植了。简单的移植可能只是换换硬件板子,涉及到的OS本身修改几乎没有。也有可能是换个同架构但是配置略微不同的MCU,这样可能只需要少许修改即可。也可能是换一个新的编译器,这个可能复杂度就稍微大一点。最难的是从工具到MCU的架构都是全新的,这样的移植可能并不是很简单。这一部分的内容所涉及到的其实不仅仅是让FreeRTOS在不同的环境下能够运行起来,还得能够针对不同的示范功能展示出与以前相同的效果。
如果只是换个硬件的板子,MCU以及编译器全都不修改。那么相关的工作可能更加类似于基于FreeRTOS的功能本身的开发。在开发的时候需要注意:1,修改之前先保证工程编译是没有问题的; 2,修改prvSetupHardware接口来保证LED资源的准确性。
一般来说,LED工程算是嵌入式领域的hello world了,实现起来可能是最容易的。
尝试进行FreeRTOS的功能调试之前,可以先按照上面的例子来进行测试。这个测试的目的是先看看现在基础工程是否有问题,同时确认LED的驱动本身是没问题的。有了这样的保障之后,在进行FreeRTOS的调试就会更加可信。
看起来,大家对于LED本身的设计是有很好的认同感的。前面我刚刚说了嵌入式的“hello world”,这里则将其定义为FreeRTOS应用的“hello world”。不同于前面我们测试LED驱动用的裸程序,这里的LED的例子使用的其实是OS的Task来管理的。
一旦点灯的测试没有问题了,接下来就可以尝试进行全功能的例程运行了。进行全功能的例程移植的时候,需要把前面的LED的演示程序去掉,因为两部分功能可能会有干涉。从另一个角度讲,去掉之后至少是可以节省一部分资源的。在全功能的演示功能中,包含了一个串口的功能,不同的硬件可能会有不同,因此需要确认正确性。此外,LCD这样的复杂的功能可能并不是简单改一点配置就可以实现的,这样的功能可能不定能够快速跑起来。
修改演示例程到其他的配置或者MCU,可以采用的2个方法:1, 选择正确的编译器工程,之后重新选择MCU; 2,利用接下来要用的工具创建工程,然后参考Demo需要使用FreeRTOS的什么文件,进而移植。
如果参考的工程跟我们接下来要用的工具以及MCU有相似之处,所需的FreeRTOS的文件的寻找可以参考上面的目录格式来定位。但是针对某些编译器,有些会有汇编代码的需求。除此之外,不同编译器对于ISR的处理可能也有不同的处理方式,这些都需要在移植修改的时候注意。
对于嵌入式系统来说,启动代码以及链接文件也是比较特殊而基础的东西。在进行相关的移植修改的时候,相应的信息也必须确认没问题。在已经存在的工程里面,有些宏定义可以方便进行不同功能的选择,在处理的时候可以充分利用。最后,需要注意FreeRTOS本身的一个驱动必需项——Tick信号。这个一般是来自于周期性中断ISR,可以在port.c中找到函数原型prvSetupTimerInterrupt。
关于存储的管理,有专门的文档来进行阐述。常见的问题有两个,这里做了简单的说明。第一个问题是关于RAM的不足,解决的方式是可以尝试修改FreeRTOS需要的HEAP大小,减少Task的数目等等。另一个ROM本身的不足,遇到这样的问题可能得尝试删除不需要的功能或者文件,具体可以参考Demo的目录树说明。
|