首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

ARM9 处理器 C语言编程标准教程 09

ARM9 处理器 C语言编程标准教程 09

2.3.5
程序的运行
程序固化到
FLASH 中后,运行前往往将其复制到
SDRAM 中去,这样可以提高运行速度,作者在
科研工作中,因工作需要,编写了一段将程序从
FLASH 中复制到 DSRAM 中去的 C语言程序,可
供参考,其中 ARM9init(void) 程序略。
//
//---------------------------------------------------------------- ------------------------------------------------------------------------------ --------------
//
主程序
//
//---------------------------------------------------------------- ------------------------------------------------------------------------------ --------------
#include
"def.h h"
#include
"2410addr.h h"
#include
"2410lib.h h"
#define ARM_ADDR 0X30000000
0X30000000;// // 定义 SDRAM 地址
void (*
run)(void ); // 定义函数指针
void ARM9init(void)
void);
void CopyFromFlashToRAM(U32 * FlashAddr,U32
*ArmAddr,U32 ul ul);
void copy(void)
void);
void main(void)
{
run=(void(*)(void)) ARM_ADDR
ADDR;
ARM9init()
ARM9init();
copy()
copy();
run()
run();
}
//
//------------------------------------------------------------------------------------------------------------------------------------------- ------------
//
复制程序
//
//------------------------------------------------------------------------------------------------------------------------------------------- ------------
CopyFromFlashToRAM(U32 * pulFlashAddr,U32
*pulArmAddr,U32 ul ul)
{
U32 *
pulSource pulSource=pulFlashAddr pulFlashAddr;
U32 *
pulDest pulDest=pulArmAddr pulArmAddr;
U32 i
i;
ul/=4
4;
for(i=0
0;i< ul ul;i++)
{
*pulDest pulDest++=* ++=*pulSource pulSource++ ++;
}
}
//
//-------------------------------------------------------------------------------------------------------------------------------------------- -------------
//
调复制程序
//
//-------------------------------------------------------------------------------------------------------------------------------------------- -------------
copy(void)
{
U32*p1
p1;
U32*p2
p2;
P1=(U32 * )0x00200000
0x00200000;
P2=(U32 * )0x30000000
0x30000000;
CopyFromFlashToRAM(p1,p2,0x20000)
p2,0x20000);
}
2.4 ARM C
语言程序的基本规则和系统初始化程

2.4.1 ARM
使用 C语言编程基本规则
在应用系统的程序设计中,若所有的编程任务均由汇编语言
来完成,其工作量巨大,并且不易移植。由于 ARM 的程序
执行速度较高,存储器的存储速度和存储量也很高,因此,
C语言的特点充分发挥,使得应用程序的开发时间大为缩
短,代码的移植十分方便,程序的重复使用率提高,程序架
构清晰易懂,管理较为容易等等。因此, C语言的在 ARM 编
程中具有重要地位。
在ARM 程序的开发中,需要大量读写硬件寄存器,尽量缩
短程序的执行时间,因此部分初始化代码一般使用汇编语言
来编写,比如 ARM 的启动代码, ARM 的操作系统的移植代
码等,除此之外,绝大多数代码可以使用 C语言来完成。
C语言使用的是标准的 C语言, ARM 的开发环境实际上就是
嵌入了一个 C语言的集成开发环境,只不过这个开发环境和
ARM 的硬件紧密相关。
在使用
C语言时,有时要用到和汇编语言的混合编程。当
汇编代码较为简洁,则可使用直接内嵌汇编的方法,否
则,将汇编程序以文件的形式加入项目当中,通过
ATPCS ATPCS(ARM/Thumb Procedure Call Standard Standard)的规
)定与 C程序相互调用与访问。
ATPCS
ATPCS,就是 ,ARM 、Thumb 的过程调用标准,它规定了
一些子程序间调用的基本规则。如寄存器的使用规则,堆
栈的使用规则,参数的传递规则等。
在C程序和 ARM 的汇编程序之间相互调用必须遵守
ATPCS 。而使用 ADS 的C语言编译器编译的 C语言子程序
满足用户指定的 ATPCS 的规则。但是,对于汇编语言来
说,完全要依赖用户保证各个子程序遵循 ATPCS 的规则。
具体来说,汇编语言的子程序应满足下面 3个条件:
. 在子程序编写时,必须遵守相应的 ATPCS 规则;
. 堆栈的使用要遵守相应的 ATPCS 规则;
. 在汇编编译器中使用 -atpcs 选项。
基本的
ATPCS 规定,详情请见相关 PDF 文档 ,简单
说明就是 :
1.
汇编程序调用 C程序
. 汇编程序的设置要遵循 ATPCS 规则,保证程序调
用时参数正确传递。
. 在汇编程序中使用 IMPORT 伪指令声明将要调用
的C程序函数。
. 在调用 C程序时,要正确设置入口参数,然后使
用BL 调用。
2. C
程序调用汇编程序
. 汇编程序的设置要遵循 ATPCS 规则,保证程序调用时参数正
确传递。
. 在汇编程序中使用 EXPORT 伪指令声明本子程序,使其他程
序可以调用此子程序。
. 在C语言中使用 extern 关键字声明外部函数(声明要调用的汇
编子程序)。
在C语言的环境内开发应用程序,一般需要一个汇编的启动程
序,从汇编的启动程序,跳到 C语言下的主程序,然后,执行
C程序,在 C环境下读写硬件的寄存器,一般是通过宏调用,
在每个项目文件的 Startup2410/INC 目录下都有一个 2410addr.h
的头文件,那里面定义了所有关于 2410 的硬件寄存器的宏,对
宏读写,就能操作 2410 的硬件 ,具体的编程规则同标准 C语言。
2.4.2
初始化程序和开发环境设置
基于
ARM 芯片的应用系统,多数为复杂的片上系统,在系
统中,多数硬件模块都是可配置的,需要由软件来预先设
置其需要的工作状态,因此在用户的应用程序之前,需要
由专门的一段代码来完成对系统基本的初始化工作。由于
此类代码直接面对处理器内核和硬件控制器进行编程,故
一般均用汇编语言实现。系统的基本初始化内容一般包括:
. 分配中断向量表
. 初始化存储器系统
. 初始化各工作模式的堆栈
. 初始化有特殊要求的硬件模块
. 初始化用户程序的执行环境
. 切换处理器的工作模式
此外
,还要对项目的交叉编译环境进行设置,这其中包括处理
器设置、仿真器设置和调试设置等 20 几个大项、近 100 个小项。
系统的初始化程序和交叉编译环境设置是初次学习
ARM 程序
设计最难掌握的内容之一,初次学习 ARM 程序设计,有哪些
硬件模块需要预先设置其需要的工作状态,如何设置?初始化
程序代码直接面对处理器内核和硬件控制器进行编程,故一般
均用汇编语言实现,初学者对 ARM 的汇编语言不熟;交叉编
译环境设置大约有 20 几个大项,近 100 个小项要设置,如何保
证各项都设置的正确,这些都是我们需要解决的问题。
最简单的做法是我们打开一个和我们开发的项目相近的系
统提供的例子项目,在例子项目中,系统的初始化程序和
交叉编译环境都是设置好的,我们可先不去修改,而是先
保留,我们只是把其中的主程序内容换成我们新项目内
容,把我们项目所需函数加入进去,这样,我们就绕过了
系统初始化程序和交叉编译环境设置的困惑,节省系统开
发时间。
比如,我们要开发一个
LCD 显示项目,项目的初始化程序
可能很难,简单作法是我们打开一个例子项目 lcd.mcp mcp,
如图 2-33 所示,在项目窗口我们看到,初始化程序在一个
文件夹组 startup2410 中,在其中包括 3个汇编语言程序
2410INIT.S 、OPTION.S 和2410SLIB.S S,2个C语言程序
2410LIB.C 和TARGET.C C,五个 ,C语言头文件 2410addr.h 、
2410lib.h 、2410slib.h 、和 option.h h,很复杂。 ,
现在我们先不去研究这些程序,把
startup2410 文
件夹保留,只修改 Application 文件夹中的
MAIN.C C,把我们项目所需要函数加到其中一个文
,件夹或新建一个文件夹加到项目中,可以很快完
成嵌入式系统开发。
图2-33 lcd.mcp的项目窗口
第二章习题与练习
1,在你的计算机中安装 ,ADS1.2 ADS1.2,并建立一个新
,项目。
2,如何简化系统初始化程序和开发环境设置,
,快速完成嵌入式控制系统设计?
3,编写一个 ,C语言程序,将用户程序从 FLASH 复
制到 SDRAM SDRAM,并从 ,SDRAM 中运行。
4,Nor 和Nand Flash 的区别和使用有哪写不
同?
5,大致描述 ,Flash Programmer 软件的安装和使
用。
6,参考图 ,2-23 23,分析 ,lcd.mcp 项目包括几个文件
夹,哪个文件夹包含系统初始化程序?
7,系统初始化应完成哪些工作?
返回列表