综合资讯 在线阅读 原文阅读 在线商城 下载专区 DATASHEET 技术论坛 商务频道

嵌入式系统  单片机  D S P  EDA/PLD  接口电路  存储技术  显示光电  电源技术
传感/控制  模拟技术  通信网络  无线通信  电测仪表  消费电子  汽车电子

所在的位置:首页技术文章嵌入式系统正文
 
基于IAR集成开发平台的ARM程序设计方法
发布日期:2005-12-12 作者:王道新 熊祖彪 陈竞 刘玉 来源:电子设计应用

摘    要:本文主要介绍了在不加载操作系统的情况下,如何使用IAR软件平台进行基于ARM的嵌入式系统开发,包括了底层驱动、I/O控制,中断控制等程序设计。
关键词:嵌入式系统;IAR;ARM;中断控制

引言
在项目开发,特别是中小型项目开发中,为了降低开发难度和开发成本,常选择不加载操作系统的方案。本文选择IAR嵌入式开发平台,在不加载操作系统的前提下,使用C语言(约95%)和汇编语言(约5%),对以ATMEL公司的AT91M40800芯片(ARM7TDMI内核)为主芯片的工业控制系统进行了软件开发。


图1  系统硬件结构


图2  系统软件框架
硬件构架
系统的整体硬件框架如图1所示,该系统基本包括了目前工业控制系统所需要的各种功能,其软件开发十分具有代表性。

IAR集成开发环境
IAR开发平台是瑞典IAR公司开发的基于最新C/C++编译和调试技术的综合开发平台。该平台是一套完整的集成开发环境,可以完成创建工程、编辑文件、编译、汇编、连接和调试应用程序的所有工作;同一个工作空间可放多个工程;可针对单个源文件,一组源文件或者全部源文件进行配置;提供工程模板,支持几乎所有ARM内核;提供ANSI标准C编译器、ISO/ANSI C 和嵌入式C++库;支持包括Wiggler JTAG接口等多种JTAG;提供了多种代码优化方式。
IAR生成的目标代码分为调试版本(Debug)和发行版本(Release)两种。其中Debug目标代码的地址定义在SRAM中,将被下载到SRAM中执行;Release目标代码的地址定义在Flash中,最终大部分在Flash中执行。在程序编译之前需要根据模板编写Debug.xcl和Release.xcl这两个内存分配文件。在IAR提供的工程模板基础上,需要修改的地方有:
-DROMSTART=2000000
-DROMEND=200FFFF
//ROM的地址段
-Z(CODE)INTVEC=00-3F
-DRAMSTART=2010000
-DRAMEND=207FFFF
//RAM的地址段
-D_USR_STACK_SIZE=20000
//栈的大小
-D_SVC_STACK_SIZE=50
-D_FIQ_STACK_SIZE=100
-D_ABT_STACK_SIZE=50
-D_UND_STACK_SIZE=50
-D_IRQ_STACK_SIZE=1000
-D_HEAP_SIZE=2000  
//堆的大小

启动代码设计
通常C语言是从main函数开始执行的,在没有操作系统的情况下,对main函数的初始化工作由启动代码来完成,包括硬件初始化、堆栈初始化、各种寄存器的初始化等。
在完成所有的初始化工作以后,用一条跳转指令进入C程序的main函数,程序的控制权转移到C程序。

驱动程序设计
系统的软件框架如图2所示。驱动程序包括设备驱动程序、中断程序以及中断服务程序。首先以Flash驱动设计为例。根据Flash的Datasheet及硬件设计,有以下定义:
#define FLASH_BASE  ((volatile USHORT *)(0x01000000))
/*FLASH的基地址*/
/*定义flash的操作代码*/
#define FLASH_SEQ_ADD1      (0x5555)
#define FLASH_SEQ_ADD2      (0x2AAA)
#define FLASH_CODE1         ((USHORT)(0xAA))
#define FLASH_CODE2         ((USHORT)(0x55))
#define ID_IN_CODE           ((USHORT)(0x90))
#define ID_OUT_CODE         ((USHORT)(0xF0))
#define WRITE_CODE          ((USHORT)(0xA0))
#define CHIP_ERASE_CODE     ((USHORT)(0x10))
然后编写FLASH功能函数。下面的函数用于验证FLASH的设备ID号:
-ramfunc-farfunc BOOL FLASH_Test(void)
{
//输入命令序列,manuf_code表示生产编号,device_code表示设备编号
USHORT manuf_code,device_ code;
*(FLASH_BASE + FLASH_ SEQ_ADD1) = FLASH_CODE1;
*(FLASH_BASE + FLASH_ SEQ_ADD2) = FLASH_CODE2;
*(FLASH_BASE + FLASH_ SEQ_ADD1) = ID_IN_CODE;
//读取生产编号和设备编号
manuf_code  = *FLASH_BASE ;
device_code = *(FLASH_BASE + 1) ;
//退出产品认证模式
*(FLASH_BASE + FLASH_ SEQ_ADD1) = ID_OUT_CODE;
//判断读出的生产编号和设备编号是否正确
return ((manuf_code== 0x001f)&&(device_code==0x00c0));
}
中断发生时,ARM内核运行状态会由一般模式(System & User)进入其它几种模式(包括FIQ、IRQ等),因此需要保护正在运行的现场(r0~r12通用寄存器),同时将ARM状态寄存器(CPSR和SPSR)入栈。中断程序使用汇编语言保护寄存器,而中断服务程序可以使用C语言编写。这里以控制步进电机运动的定时器中断为例:
tc0_handler
stmfd sp!, {r14}
;保护寄存器入栈
mrs  r14, SPSR
stmfd sp!, {r14}
mrs  r14, CPSR
stmfd sp!, {r0-r12,r14}          
IMPORT  Interrupt_Tc0
ldr r0,=Interrupt_Tc0
;此处跳转进入C语言中断服务程序Interrupt_Tc0( )
mov  lr,pc
bx  r0
IntExit 
;中断服务程序完毕
ldmia sp!,{r0-r12,r14}
;恢复现场
msr  CPSR_cxsf, r14
ldmia sp!,{r14}
msr  SPSR_cxsf,r14
ldmia sp!, {r14}
subs  pc,lr,#4
值得注意的是,ARM的除法运算采用软件除法方式,会用到r14寄存器,所以也必须加以保护,在中断服务程序完毕后恢复现场,将寄存器依次出栈。

结语
在本系统的开发过程中有如下体会:
1 尽量少用占用大量存储空间的变量(如int buffer[4096]),系统开销太大,可能造成系统崩溃。
2 慎重使用malloc()这样的内存分配函数。如果使用,一定要在使用完毕后调用free()函数释放内存空间,否则容易造成内存泄漏,甚至系统崩溃。
3 要注意IAR编译器的所有警告信息,仔细查看警告信息的意义。
4 一些经常调用且需要快速处理的模块,考虑使用汇编完成。
5 生成 Release版本目标代码时,Release目录下的exe目录内即为目标文件,而List目录内的*.map文件包含了目标文件内存分配的具体情况,可以根据里面的信息判断内存分配是否存在问题。
按照以上开发方式开发出的某款工控产品,经过了严格测试后,已经推向市场,其可靠性和稳定性均得到了验证。


 (全文结束)

信息发布:   转引自: 【 】 【打印】 【关闭
 相 关 文 章
基于JTAG的ARM芯片系统调试 (11-21)
基于ARM和Ethernet的现场实时信号采集分析系统 (11-21)
ARM嵌入式系统软件实时时钟的设计 (11-21)
基于ARM的嵌入式系统Bootloader启动流程分析 (11-21)
基于uC/OS-II的嵌入式数控系统分析与设计 (11-13)
基于EP7312的新型嵌入式系统的实现 (11-13)
基于ARM7TDMI的SoC语音处理系统的设计 (11-11)
一个嵌入式系统的启动分析 (11-11)
基于混沌加密的嵌入式通信系统的研究 (11-11)
用动作识别控制GUI输入的研究及其实现 (12-12)
基于ARM-Linux的SQLite嵌入式数据库技术 (12-12)
基于ARM高速闪存MCU应对广泛嵌入式需求 (02-28)
基于ARM2210的智能移动机器人人机界面设计 (07-18)
ARM HMS30C7202与触摸屏接口电路的设计 (03-07)
一种基于ARM7与ST7538的电力线载波通信模块的设计 (02-15)
带ARM核的双CPU数字信号处理器 (01-15)
ARM微控制器LPC210X的LCD接口技术 (12-15)
AIS系统协议栈的研究与实现 (12-22)
基于ARM核的IntelTMStrongARM嵌入式系统 (01-06)
MSP430 单片机C语言和汇编语言混合编程 (11-08)
关于我们 ┋ 友情链接


深圳市福田区海滨广场恒福花园恒华阁11F
电话:0755-88305872 传真:0755-88305880
Copyright©2005-2007 无忧电子开发网版权所有

粤ICP备05064233号