《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明
2012-12-07 01:07
225 查看
1.改写后的程序需要如下源文件:startup.s retarget_.s fpinit.c vfpinit.s system_.s main.c
2.另外需要链接器设置文件:6410_scatter.txt(RealView Linker中选择Scattered时设置);
注意:有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
以下是可能遇到问题:
一、基本C问题
编译错误:expected an expression
原因:
链接库编译错误:Bad symbol 'VIC_MODE'
原因:
Project菜单下Debug Settings选项卡;Language Settings下的RealView Assembler(即汇编语言设置)下的Predefines->Import Panel,
选如下文件:RealView Assembler.xml
链接库如下不可少: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单步调试来看,程序代码一句都没有执行。原因也很简单:就像J***A语言的运行需要J***A虚拟机这个前提一样,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单步调试来看,程序代码一句都没有执行。原因也很简单:就像J***A语言的运行需要J***A虚拟机这个前提一样,C的运行不能没有之前对堆栈的设置。
相关文章推荐
- 《tiny6410裸机程序》第五章:汇编与C混合编程-LED跑马灯最终说明、myled再次精简
- 模仿了一个夸张的商品倒计时效果,设计的精简当然也很丑,只是为了检测自己说明问题
- 精简说明C#最基本的Socket编程示例
- 关于main(int argc,char **argv)中参数的说明
- 转: python _main_ _name_的说明
- CentOS 7 防火墙FirewallD 精简说明
- Symbian入门指南第二章:Symbian开发环境的建立以及目录结构的说明
- MFC 基础:静态加载DLL ,main()、main全局变量、dllMain()、dllMain全局变量的一些说明
- 有关Yii的main.php 主配置文件的说明
- opencv主函数main中的参数说明
- CKEditor 官方精简瘦身说明
- c语言中 main()函数的参数说明
- linux 0.12之head.s跳转到main.c的说明
- c/c++ main 中int argc和char** argv的说明
- main(int argc, char **argv)参数argc,argv说明和指向指针的指针变量
- AndroidMainfest.xml 中属性说明
- FCKeditor2.6.3操作说明,基本设置,精简以及JS调用方
- 实验九指针1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- MySQL数据库mysql-test功能回归测试报main.range [fail]说明
- nginx Mainline Stable Legacy 版本 说明