1.改写后的程序需要如下源文件:startup.s retarget_.s fpinit.c vfpinit.s system_.s main.c
2.另外需要链接器设置文件:6410_scatter.txt(RealView Linker中选择Scattered时设置);
DRAM 0x5020 0000{ DODE 0x5020 0000 startup.o(Init,+FIRST) *(+RO) *(+RW,+ZI) }说明:Scatter文件,也叫分散加载描述文件;它指定镜像文件内部各区域的下载和运行时配置。armlink将会根据scatter文件产生一些区域相关的符号,他们是全局的供用户建立运行环境时使用。6410_scatter.txt中指定了代码段的起始地址是0x5020 0000,入口目标文件为startup.o,程序入口段为Init,紧接着该段依次存放RO(代码与只读数据)、RW(读写变量)和ZI(未初始化变量)。
注意:有C的程序和单纯汇编是有区别的;如果单纯汇编代码我们可以在RealView Linker中不选择Scattered而直接在Simple中给出RO地址(也就是代码段地址)编译运行,但C语言需要堆栈、所以在有C语言时必须在它的main函数之前由汇编完成堆栈空间设置等。因此,本程序需要编译汇编部分代码、并且在RealView Linker中设置Scattered。
3.链接配置文件:option.inc(放置src目录即可,不必添加到工程);
汇编语言预定义文件:RealView Assembler.xml(RealView Assembler中Predefines时设置)。
4.下面首先看下更改精简后的,main.c
#define LED1_ON ~(1<<4) #define LED2_ON ~(1<<5) #define LED3_ON ~(1<<6) #define LED4_ON ~(1<<7) #define LED1_OFF (1<<4) #define LED2_OFF (1<<5) #define LED3_OFF (1<<6) #define LED4_OFF (1<<7) #define LEDALL_OFF (0xf<<4) typedef unsigned long u32; #define rGPIOKCON0 (*(volatile u32 *)0x7f008800) #define rGPIOKDAT (*(volatile u32 *)0x7f008808) void delay(int times); int main(void){ u32 uConValue; uConValue = rGPIOKCON0; uConValue &= ~(0xffff<<16); uConValue |= 0x1111<<16; rGPIOKCON0 = uConValue; rGPIOKDAT |= LEDALL_OFF; while(1){ rGPIOKDAT &= LED1_ON; delay(1000); rGPIOKDAT |= LEDALL_OFF; rGPIOKDAT &= LED2_ON; delay(1000); rGPIOKDAT |= LEDALL_OFF; rGPIOKDAT &= LED3_ON; delay(1000); rGPIOKDAT |= LEDALL_OFF; rGPIOKDAT &= LED4_ON; delay(1000); rGPIOKDAT |= LEDALL_OFF; } } void delay(int times){ int i; for(;times>0;times--) for(i=0;i<3000;i++); }====================================================================================================================================
以下是可能遇到问题:
一、基本C问题
编译错误:expected an expression
原因:
#define rGPIOKCON0 (*(volatile u32 *)0x7f008800);//多了; #define rGPIOKDAT (*(volatile u32 *)0x7f008808)二、链接库(汇编部分)编译问题
链接库编译错误:Bad symbol 'VIC_MODE'
原因:
Project菜单下Debug Settings选项卡;Language Settings下的RealView Assembler(即汇编语言设置)下的Predefines->Import Panel,
选如下文件:RealView Assembler.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> <?codewarrior exportversion="1.0" ideversion="5.5" ?> <!DOCTYPE EXPORTEDPANEL [ <!ELEMENT EXPORTEDPANEL (NAME, (SETTINGLIST|VALUE))> <!ELEMENT SETTINGLIST (SETTING+)> <!ELEMENT SETTING (NAME?, (VALUE|(SETTING+)))> <!ELEMENT NAME (#PCDATA)> <!ELEMENT VALUE (#PCDATA)> ]> <EXPORTEDPANEL> <NAME>Panel_for_armasm</NAME> <SETTINGLIST> <SETTING><NAME>Panel_for_armasm</NAME> <SETTING><NAME>Version</NAME><VALUE>261</VALUE></SETTING> <SETTING><NAME>Created by</NAME><VALUE>RealView Assembler</VALUE></SETTING> <SETTING><NAME>Modified by</NAME><VALUE>RealView Assembler</VALUE></SETTING> <SETTING><NAME>Tool name</NAME><VALUE>armasm</VALUE></SETTING> <SETTING><NAME>Arguments</NAME><VALUE>--debug --keep --cpu=ARM1176JZF-S --predefine="VIC_MODE SETA 1" --predefine="USE_TCM SETA 1"</VALUE></SETTING> </SETTING> </SETTINGLIST> </EXPORTEDPANEL>三、程序跑飞问题,也是堆栈设置不完整问题
链接库如下不可少:fpinit.o startup.o retarget_.o system_.o vfpinit.o main.o
即如下文件:fpinit.c startup.s retarget_.s system_.s vfpinit.s main.c
四、程序不执行问题
倘若在RealView Linker中不选择Scattered而直接在Simple中给出RO地址(也就是代码段地址)编译、源文件只有main.c,则也可以编译通过。但在开发板中运行时从RVDS单步调试来看,程序代码一句都没有执行。原因也很简单:就像JAVA语言的运行需要JAVA虚拟机这个前提一样,C的运行不能没有之前对堆栈的设置。