2008年6月20日星期五

FreeRTOS在lpc2292上的移植步骤

 
其实,也不是什么移植,经搜索和看数据手册,发现LPC22XX系列和LPC21XX系列没有太大的区别,只是LPC22XX开放外部总线(还有些细微的区别,不过不影响移植),寄存器的定义都有差不太多,这可以从两者的寄存器定义文件上看出来。而LPC22XX与LPC23XX的区别要大一些。(http://panda.ece.stevens-tech.edu/sd/grp8/2008_feb.html )和(http://tech.groups.yahoo.com/group/lpc2000/message/30783 )有个在FreeRTOS FOR LPC2368的基础上移植的大体步骤,但是太不详细,而且这样要比在FreeRTOS for LPC2138的基础上修改麻烦的多。
具体步骤如下:
 

KEIL  +  winARM + FreeRTOS环境搭建及移植

 

created    2008.02.28 shiyouyu

 

 嵌入式操作系统FreeRTOS的原理与实现

////////////////////////////////////////////////////////////////////

硬件平台:

ZLG   EsayARM2200开发板

IS61LV25616AL  BANK0:0X80000000-0X8007FFFF

  SST39VF160     BANK1:0X81000000-0X811FFFFF

  LPC2214        FLASH:256K BEGIN:0X00000000

                 SRAM:16K   BEGIN:0X40000000

软件平台:

KEIL UVISION3 V3.31 + WinARM-20060606.exe + WinARM_Keil_uVision_glue.rar补丁 + JLINK

//////////////////////////////////////////////////////////////////

软件环境搭建:

Keil uvision 3 V3.31

WinARM-20060606.exe

keil环境下使用winarm工具链需安装一个补丁(http://www.mcu123.com/product/lpc214x/

WinARM_Keil_uVision_glue.rar)才行, GNUARM工具链直接就可以在keil下使用。

 

ARM-Projects(http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/)

主页上的"FreeRTOS example with LPC2138"(An example for the LPC2106 on the Olimex

LPC-P2106-board comes with the FreeRTOS-code. This is a ported version of the

example to the LPC2138. The LED-handling has been adapted to the Keil MCB2130

evaluation-board. The code has been tested with WinARM 3/06 (arm-elf-gcc 4.1.0))

里面的keil工程不能用,makefile可以。

如果想在keil内编译,需加入所有需要的源文件,加入头文件的搜索路径(demo的和os的),

再在define框内设置上GCC_ARM7(有个头文件依靠他才能被包含)即可。

注意加入keil_lpc2138_mcb2130_freeRTOSdemo\FreeRTOS\DemoCommon\Minimal

下面的源文件而不是keil_lpc2138_mcb2130_freeRTOSdemo\FreeRTOS\DemoCommon\Full下面的,

加入ParTestserial文件夹下的文件,而且有几个源文件也不需要(去掉death.ccr_hook.c

cr_flash.c),详细的看下main.c开头包含的头文件。

详细:

"options for target"-> "CC"-> "include paths" 设置为:"./FreeRTOS/DemoCommon/include;

./FreeRTOS/Source/include;../keil_lpc2138_mcb2130_freeRTOSdemo";源文件包含路径

"options for target"-> "CC"-> "define 设置为:"GCC_ARM7"

"options for target" -> "output" -> "run user program #1"设置为:

"arm-elf-objcopy -O ihex uvisionflash.elf uvisionflash.hex";是为了转化elf文件为

可烧写的hex文件。

"options for target" ->"linker" ->"linker script" 设置为:"LPC2138-ROM.ld";链接脚本

 

设置编译器选项:

"project"->"component environment books"->"folders/extentions"->勾选"use gnu compiler",设置"gnu tool- prefix"为"arm-glue-",设置"Cygnus folder"为"D:\program\WinARM\"你的winarm安装目录。

 

 

arm-elf-objcopy RTOSDemo.elf -O ihex RTOSDemo.hex

arm-elf-objcopy RTOSDemo.elf -O binary RTOSDemo.bin

 

 

其它:

LPC2114/2124/2212/2214 ARM7TDMI-S 配置为小端(little-endian)字节顺序。

 

 

//////////////////////////////////////////////////////////////////

修改:

1LPC2000.h

修改 #include "LPC214x.h" #include "LPC22xx.h"

编译通过  2008.6.18

 

2,修改工程 device LPC2292 

编译通过  2008.6.18

 

3port.c中使用T0产生tickLPC22XXLPC21XX基本相同,不需要修改。

其它好像也不需要修改,哈哈!

 

4,添加芯片初始化脚本debug_in_ChipRAM.ini,进行中断向量的初始化和程序的跳转,

完成在片内SRAM的调试

 

5,"options for target" -> "output" -> "select folder for objects"设置文件夹为 ./obj,

便于文件归类。

 

6,更改"name of excutables"FreeRTOS_lpc2292,进而改变make后执行用户程序命令为:

arm-elf-objcopy -O ihex .\obj\FreeRTOS_lpc2292.elf .\obj\FreeRTOS_lpc2292.hex

arm-elf-objcopy -O binary .\obj\FreeRTOS_lpc2292.elf .\obj\FreeRTOS_lpc2292.bin

生成烧写文件

 

7,在LPC2138-RAM.ld基础上修改,创建 LPC2292-RAM.ld

 

8,因为内部RAM太小,创建从外部RAM调试的文件LPC2292-ERAM.lddebug_in_ERAM.ini

 

9,为了测试是否移植成功,在main.c中去掉了所有的其他测试demo创建任务的函数,只留下了

comtest demo

 

10,经过查看代码,comtest.c是使用的uart0,周立功的esayarm2200上可以使用。发光二极管

没有直接接到端口上的,使用74hc595驱动,麻烦。决定使用串口调试。

 

11comtest.c文件中去掉了接收数据进程,点亮led没有去掉,因为esayarm2200开发板上,这两个

口跟串口2相关,不影响其他,故没有去掉。加入了第二个发送数据进程,两个发送进程具有相同的优先级。

从而近似于周期性轮转,每个进程发送完毕后,第二个才会发送。波特率改为9600.

 

12,老是接上硬件启动调试的时候,keil出问题退出,在"options for target" -> "debug"

选项卡下,不选中"load application at start""run to main"就没事了.

 

13,程序老是跑飞,发现是由于没有加入文件启动文件boot.s,加入就好了.

 

14,串口收到的数据不对,发现是文件FreeRTOSconfig.h内的晶振频率设置错(12MHZ),应该为11.0592MHZ,

修改后,故障解除.

2008-06-20

于士友

没有评论: