博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《tiny6410裸机程序》第二章:LED跑马灯RVDS精简main.c说明
阅读量:4180 次
发布时间:2019-05-26

本文共 3121 字,大约阅读时间需要 10 分钟。

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

]>
Panel_for_armasm
Panel_for_armasm
Version
261
Created by
RealView Assembler
Modified by
RealView Assembler
Tool name
armasm
Arguments
--debug --keep --cpu=ARM1176JZF-S --predefine="VIC_MODE SETA 1" --predefine="USE_TCM SETA 1"
三、程序跑飞问题,也是堆栈设置不完整问题

链接库如下不可少: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的运行不能没有之前对堆栈的设置。

转载地址:http://degai.baihongyu.com/

你可能感兴趣的文章
There is no tracking information for the current branch.
查看>>
fatal: refusing to merge unrelated histories
查看>>
Git命令还原未提交的变更
查看>>
Linux系统中环境变量的配置
查看>>
Linux系统中配置脚本程序开机启动
查看>>
让Linux系统上的nginx支持php程序
查看>>
源码编译安装LNMP环境之Nginx篇
查看>>
源码编译安装LNMP环境之PHP篇
查看>>
Linux中rpm工具使用教程
查看>>
Linux中yum工具使用教程
查看>>
C++字符串函数
查看>>
mknod详解
查看>>
linux中的run-level何解?
查看>>
Linux内核编译详解(转自linuxSir)
查看>>
实模式,保护模式与V86模式
查看>>
628. Maximum Product of Three Numbers(排序)
查看>>
Linux内核-------同步机制(二)
查看>>
面试题31-------连续子数组的最大和(数组)
查看>>
epoll 实现Chat
查看>>
21. Merge Two Sorted Lists(链表)
查看>>