一、开发用到的软件
CodeWarrior IDE集成开发环境,它集成了ARM汇编器、ARM C/C++编译器、Thumb
的C/C++编译器、ARM连接器,包含了工程管理器、代码生成接口、语法敏感编辑器、源文件和类浏览器等等;
AXD调试器(ARM eXtended Debugger),支持软件仿真和硬件仿真; ARM USB2.0仿真机驱动程序; ADS程序启动文件vivi。
二、开发涉及的文件类型
*.c、*.h C语言文件,使用ARM C Compiler编译器
*.cc、*.cpp、*.hpp C++语言文件,使用ARM C++ Compiler编译器 *.s 汇编语言文件,使用ARM Assembler编译器 *.axf 可执行映像文件
*.bin 可以直接烧写到FLASH 中二进制可执行文件
三、工程的编辑
1. 建立工程
打开CodeWarrior,选择操作:File->New…打开新建对话框如图,
选择以下三个工程模板的其中之一。
ARM Executable Image ARM可执行映像 Thumb Executable Image Thumb可执行映像
Thumb ARM Interworking Image Thumb 和ARM交织映像 选择好工程存放路径,后建立后缀为.mcp的工程(项目)。 2. 建立文件
打开CodeWarrior,选择操作:File->New…打开新建对话框如图,单击File选项卡,建立Text 文件,选择操作:File->Save,保存文件为*.c、*.h 、*.cc、*.cpp、*.hpp、*.s格式,注意:将文件保存在相应工程的目录下,便于管理和查找。 3. 添加文件到工程
在工程窗口中Files窗口空白处右击鼠标,弹出浮动菜单,选择Add Files命令,选择相应的文件添加即可
4. 编译连接工程
DebugRel Settings:工程设置、输出文件设置和编译选项等。
在如图的对话框中,单击左侧的Language Settings设置Architecture or Processor,这里设置为ARM920T.
单击ARM Linker 进行连接地址的设置,对于简单的软件调试,可以不进行连接地址的设置,对于较复杂的许设置,如下图,在Output选项卡下设置工程连接地址RO Base为0x40000000,RW为0x40003000,在Optiong选卡下设置调试入口地址Image entry point为0x40000000。
在ARM Linker目录下,单击Layout选项卡,弹出如图对话框,在Place at beginning of image里设置镜像开始点(注意:必须设置),在Place at end of image设置镜像结束点(一般不用设置)。当使用自己的C程序启动代码时,汇编源代码和使用方法见附录。
完成上述三个选项卡的设置以后,Equivalent Command Line中显示信息为
-info totals-0xXXXXXXXX-entry 0xXXXXXXXX-ro-base 0xXXXXXXXX-rw-base 0xXXXXXXXX-first *.o(镜像起始代码段名称)
Make:编译连接(快捷键为F7);
Debug:启动AXD进行调试(快捷键为F5); Run:启动AXD进行调试,并直接运行程序;
Touch栏用于标记文件是否被编译,若打上对号,表明文件需要重新编译,可通过单击该栏位置来设置/取消对号标志,如图
四、工程的联机调试
编译完工程以后单击Debug图标,即可启动AXD进行调试,选择操作:
Options->Configure Target打开如图对话框
在没有田间其他仿真驱动之前,Target标签中只有两项,分别为ADP(JTAG硬件仿真)和ARMUL(软件仿真)。
这里使用ADP,点击“configure”按钮,select ARM Ethernet driver,配置IP地址为127.0.0.1。然后的操作过程如下:
用sjf烧写仿真启动文件,2410烧写vivi-dm9000,2440烧写vivi-2440;
按照文档 注意:在链接目标板与AXD的同时,一定要打开ARM USB2.0; Make之后,即可产生*.axf文件,选择驱动程序之后,在AXD中选择操作:File->Load Image加载.ELF格式的文件,即*.axf文件; 之后就可以运行调试了。 附录 C程序启动的汇编源代码: ;========================================= ; NAME: STARTUP.S ; DESC: C语言程序启动代码 ;========================================= IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data) IMPORT |Image$$RW$$Base| ; Base of RAM to initialise IMPORT |Image$$ZI$$Base| ; Base and limit of area IMPORT |Image$$ZI$$Limit| ; to zero initialise IMPORT Main ; The main entry of mon program AREA START,CODE,READONLY ENTRY CODE32 ;声明32位指令 RESET LDR SP,=0x4000f000 ;注意堆栈指针与镜像RO Base与RW Base的关系 ;初始化C程序的运行环境 ldr r0, =|Image$$RO$$Limit| ; Get pointer to ROM data ldr r1, =|Image$$RW$$Base| ; and RAM copy ldr r3, =|Image$$ZI$$Base| ;Zero init base => top of initialised data cmp r0, r1 ; Check that they are different beq %F2 1 cmp r1, r3 ; Copy init data ldrccr2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4 strcc r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4 bcc %B1 2 ldr r1, =|Image$$ZI$$Limit| ; Top of zero init segment mov r2, #0 3 cmp r3, r1 ; Zero init strcc r2, [r3], #4 bcc %B3 b Main ;Don't use main() because ...... END 使用方法: 1.此为C程序启动的汇编代码; 2.已经相当简化; 3.使用时,只需将STARTUP.S加入到ADS工程,然后进行一些设置: 在Code Warrior->DebugRel Settings下的Linker\\ARM Linker的Layout选项卡下, 设置:启动文件名Object\\Symbol: STARTUP.o 启动代码段名 section: START 因篇幅问题不能全部显示,请点此查看更多更全内容