在MicroBlaze上跑FreeRTOS V8

来源:互联网 发布:纯粮固态发酵白酒知乎 编辑:程序博客网 时间:2024/06/02 14:31

FreeRTOS已经听说过很久了,但一直也没有时间去玩,终于在最近项目上玩了一次。之前有玩过uCOS II,以及在本科毕业论文时自己为Cortex-M3弄了个“XOS”。本来之前的XOS要移植到MicroBlaze上应该不难,可是毕竟自己搞的小玩意,用在公司产品上可不行。第一功能上不够全,没有这么多事件机制,第二不通用,市面上这些开源的都搞得非常全,都直接支持几十种处理器。而且经过这几年的工作发现,有些东西不一定要自己搞,产品和功能实现是两个概念,太多时间都在“磨”设计,而市场要的是快速把功能转为产品。


废话半天,拿着板子,就如一堆破铜烂铁,就算芯片再贵,就算板子设计再好也只是一堆能上电的破铜烂铁。只有搞点代码才能让这堆破铜烂铁发挥出一点作用。首先我们得在Xilinx Platform Studio里建立一个可以运行FreeRTOS的MicroBlaze系统,我的ISE版本为14.7。这个系统里主要包括MicroBlaze,RAM,Timer,Interrupt,Clock,Reset,当然还有方便调试的UART。为什么要有Timer呢?应该这些嵌入式OS里需要有一个周期性的Tick,用于系统调度和计时。搭好MicroBlaze系统之后我们就可以综合编译导出到Xilinx SDK,开始我们的软件工作。


到了SDK环境,我们得先下个FreeRTOS,然后解压出里面的东西。我下的文件是FreeRTOSv8.0.1.exe,运行解压之后进入FreeRTOS\Demo\MicroBlaze_Spartan-6_EthernetLite\SDKProjects\RTOSDemo\目录,我们以这个作为参考起点。其实在Demo下还有一个MicroBlaze目录,这个是老版本的,而MicroBlaze_Spartan-6_EthernetLite相对来说比较新。至少其中的MicroBlaze IP的版本和最新的差得不大,都是8.xx,这样基本可以确定处理器的指令没特别大的变化,尤其是进程切换的那些context switch不会出错。运行批处理文件CreateProjectDirectoryStructure.bat,在目录下就会生成FreeRTOS_Source目录,这里面就是我们想要的已经为MicroBlaze移植好的FreeRTOS代码。把它拷贝到自己前面XPS导出的SDK工程里,然后开始写我们的main.c。


在写main.c的时候,我们需要参考目录里的main-blinky.c和FreeRTOSConfig.h。main-blinky.c有头文件包含,有Timer的初始化,有FreeRTOS所需要的Hook函数实现,也创建简单FreeRTOS任务的参考。而FreeRTOSConfig.h文件则是FreeRTOS的配置文件。弄清楚这两个文件之后就可以玩起来了。另外需要注意的就是FreeRTOS的内存管理方式。在FreeRTOS\Demo\MicroBlaze_Spartan-6_EthernetLite\SDKProjects\RTOSDemo\FreeRTOS_Source\portable\MemMang里用了heap_3.c,其实还有另外3种方式。heap_3.c里使用的是C库的malloc和free来实现内存管理的,所以需要设置SDK工程的heap大小,以避免创建任务时申请不到内存的情况。


基本上就这个流程,但还是要花点时间去看看FreeRTOS的文章,希望对后来人有所帮助。


1 0