原创 IAR集成开发平台的ARM程序设计方法

2009-9-19 20:03 1868 4 5 分类: MCU/ 嵌入式
作者:    时间:2007-08-17    来源: 
 
       摘  要:本文主要介绍了在不加载操作系统的情况下,如何使用iar软件平台进行基于arm嵌入式系统开发,包括了底层驱动、i/o控制,中断控制等程序设计。

关键词:嵌入式系统;iar;arm;中断控制

  引言


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

2007062717077_15005.jpg
图1 系统硬件结构

2007062717077_27704.jpg
图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文件包含了目标文件内存分配的具体情况,可以根据里面的信息判断内存分配是否存在问题。


  按照以上开发方式开发出的某款工控产品,经过了严格测试后,已经推向市场,其可靠性和稳定性均得到了验证。

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户169038 2009-9-29 17:06

IAR的网站上怎么下不了IAR这个软件呢?
相关推荐阅读
用户1414655 2012-11-28 16:09
给你们介绍一些毛骨悚然的骗人技术
星期六下午 2 点多, 我一个人乘70 路至四川路,当中我在和我老公通电话的时候发觉有人拍了下我的肩膀,刚开始我以为是遇到认识的人和我打招呼的,后来一看旁边是40 多岁的...
用户1414655 2009-11-24 23:01
通信电源蓄电池温度监测系统设计
0 引 言    在通信系统的设计和建设中,通信电源被称为通信系统的心脏,电源系统将直接影响通信系统的可靠性和稳定性。美国APC公司的一项调查结果表明,大约有75%以上的通信系统故障都是由于电源设备故...
用户1414655 2009-09-23 08:53
各种白光LED驱动电路特性评比
作者:    时间:2008-12-02    来源:52RD硬件研发         1996年日亚化学的中村氏发表蓝光LED之后,白光LED就被视为次世代照明光源最具发展潜力的元件,因此有关白光L...
用户1414655 2009-09-23 08:52
论机器视觉与图像分析技术
作者:    时间:2008-12-02    来源:52RD硬件研发         也许你仍然希望能得到咨询专家的帮助,不过紧缩包裹型(Shrink-Wrapped)开发工具包现在已经使得缺乏专业...
用户1414655 2009-09-23 08:52
LCD TV视频解码器技术概述
作者:    时间:2008-12-03    来源:52RD硬件研发          CD TV属于高整合性电子产品,它涵盖了演算法、软体、韧体、硬体、晶片、无线射频等领域,且许多专利仍是属于国外...
用户1414655 2009-09-23 08:52
液晶显示器的自动调光技术
作者:    时间:2008-12-03    来源:52RD硬件研发          最近几年大型液晶显示器的应用,从笔记型电脑、PDA、桌上型电脑用监视器,持续扩展至家用液晶电视等领域,液晶电视...
EE直播间
更多
我要评论
1
4
关闭 站长推荐上一条 /3 下一条