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 LPC
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
里面的keil工程不能用,makefile可以。
如果想在keil内编译,需加入所有需要的源文件,加入头文件的搜索路径(demo的和os的),
再在define框内设置上GCC_ARM7(有个头文件依靠他才能被包含)即可。
注意加入keil_lpc2138_mcb2130_freeRTOSdemo\FreeRTOS\DemoCommon\Minimal
下面的源文件而不是keil_lpc2138_mcb2130_freeRTOSdemo\FreeRTOS\DemoCommon\Full下面的,
加入ParTest和serial文件夹下的文件,而且有几个源文件也不需要(去掉death.c,cr_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_ARM
"options for target" -> "output" -> "run user program #
"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)字节顺序。
//////////////////////////////////////////////////////////////////
修改:
1,LPC2000.h
修改 #include "LPC214x.h" 为 #include "LPC22xx.h"
编译通过 2008.6.18
2,修改工程 device 为LPC2292
编译通过 2008.6.18
3,port.c中使用T0产生tick,LPC22XX和LPC21XX基本相同,不需要修改。
其它好像也不需要修改,哈哈!
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.ld,debug_in_ERAM.ini
9,为了测试是否移植成功,在main.c中去掉了所有的其他测试demo创建任务的函数,只留下了
comtest demo。
10,经过查看代码,comtest.c是使用的uart0,周立功的esayarm2200上可以使用。发光二极管
没有直接接到端口上的,使用74hc595驱动,麻烦。决定使用串口调试。
11,comtest.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,
修改后,故障解除.
没有评论:
发表评论