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的运行不能没有之前对堆栈的设置。