《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明

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

你可能感兴趣的:(《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明)