位置:51电子网 » 技术资料 » 嵌入式系统

嵌入式开发ARM系统代码固化的串口实现

发布时间:2008/8/29 0:00:00 访问次数:429

  早期的嵌入式程序采用“编程—烧写—修改—烧写”的开发模式,大量的时间消耗在重复烧写芯片上,增加了开发成本和研发周期。

  之后发展到仿真器阶段,虽然简化了开发模式,但是由于仿真器与arm芯片的兼容性等因素,经常会发生程序在仿真器上能正确运行,但是固化之后运行却出现问题的情况。

  程序的固化是软件开发过程中重要的一环,一般可通过jatg口、网口及串口等进行烧写。相比之下,串口实现更为便捷,更值得推广。笔者在开发1c1t小灵通中继站的过程中,通过编制烧写程序,利用串口将编译后的目标代码发送给 arm处理器;由arm处理器内部的监控程序将目标代码写入片外flash,实现程序的在线烧写。这样不仅简化了电路设计,而且降低了开发成本,缩短了开发时间。

  1 烧写原理及过程

  硬件连接如图1所示,arm开发板一方面通过串口与pc机连接,另一方面通过20针idc宽带线与仿真器相连,再由仿真器通过25针并口插座与pc机的lpt口相连。开发板通电后即可进行烧写工作。

  arm开发板与pc机的连接

  如图2所示,代码固化分2 个步骤进行。第1步,如虚线一所示,监控程序的映像通过仿真器下载到arm的内部ram中运行,用户可以在主机端用超级终端或者其他串口调试工具与开发板通信。第2步,将应用程序的可执行代码通过串口发送,如虚线二所示,此时内部ram里的监控程序就会接收并把它烧写到flash中。

  代码烧写原理

  图2 代码烧写原理

  2 监控程序的设计

  2.1 启动代码设计

  实现串口烧写的监控程序包括arm启动代码、串口通信代码和flash烧写代码3部分。arm启动代码是整个程序运行的入口点,完成arm系统正常运行所必需的简单初始化,然后把系统控制权交给操作系统或者高级语言编写的监控程序。由于启动代码直接对soc内核和硬件控制器进行编程,因此必须采用汇编语言。

  启动代码包括异常向量表的定义、各种模式的堆栈初始化、系统硬件初始化、程序运行环境初始化,最后跳转到用户c语言主程序。当系统上电或复位后首先会从逻辑地址0x0处执行。

  arm处理器有7种运行模式,如表1所列。每一种模式都有独立的堆栈指针寄存器(sp),因此对使用的模式都要给堆栈指针寄存器sp定义堆栈地址。改变状态寄存器(cpsr)内的状态位,使处理器切换到不同模式,然后给sp赋值就可以实现堆栈的初始化。当然,堆栈的大小视需要而定。

  表1 arm处理器的7种运行模式

  arm处理器的7种运行模式

  堆栈初始化程序如下:

  initstack

  movr0,lr;保存返回地址

  mov r1,#mode_svc:or:i_bit:or:f_bit;设置管理模式堆栈

  msrcpsr_c, r1

  ldrr13, =svc_stack

  movpc,r0;子程序返回

  系统硬件初始化包括设置外部存储器的类型、数据位宽度等,完成之后即可通过“b main”语句跳转到c语言主程序。与ldr指令相比,虽然跳转范围小,但是32 mb的地址空间跳转足以满足程序需要,而且运行得更快。

  2.2 烧写主程序设计

  main函数功能主要包括接收串口数据、解析映像文件及写入外部flash,如图3所示。串口函数主要由init_sio()、 init_val()和send_data()组成。函数init_sio()用于对串口通信参数的设置:波特率,57 600 b/s;奇偶校验,无;数据位,8位;停止位,1位。init_val()是对接收到的数据进行转存,为了提高接收速率,把接收到的数据先暂存到外部 sram中。如果程序量较小也可以选择暂存到芯片内部的ram(64 kb)中,等接收完毕后再对其进行解析。send_data()用于向串口回送烧写工作的信息。

  main函数流程

  图3 main函数流程

  下一步就是要对映像文件进行解析并正确地写入外部flash中。嵌入式程序通过编译器生成的映像文件是elf格式的axf文件,里面有文件头、段信息等信息,不能直接烧录,一般将它转化为bin或者hex文件。这里将嵌入式程序编译成srecord十六进制文件。这是一种motorola公司推出的标准文件格式,用来将数据从pc机传送到目标平台flash,在嵌入式开发中广为应用。srecord文件格式如下:

  srecord文件格式

  其中,sid表示当前记录的类型,常见的有s0、s1、s5和s9等,各个类型代表的意义不同,如s9所在语句表示文件的结束;数据长度代表本句后面数据的长度;地址的字节数会因不同的s记录而异,一般为2字节,表示的是后面的数据在存储器中的地

  早期的嵌入式程序采用“编程—烧写—修改—烧写”的开发模式,大量的时间消耗在重复烧写芯片上,增加了开发成本和研发周期。

  之后发展到仿真器阶段,虽然简化了开发模式,但是由于仿真器与arm芯片的兼容性等因素,经常会发生程序在仿真器上能正确运行,但是固化之后运行却出现问题的情况。

  程序的固化是软件开发过程中重要的一环,一般可通过jatg口、网口及串口等进行烧写。相比之下,串口实现更为便捷,更值得推广。笔者在开发1c1t小灵通中继站的过程中,通过编制烧写程序,利用串口将编译后的目标代码发送给 arm处理器;由arm处理器内部的监控程序将目标代码写入片外flash,实现程序的在线烧写。这样不仅简化了电路设计,而且降低了开发成本,缩短了开发时间。

  1 烧写原理及过程

  硬件连接如图1所示,arm开发板一方面通过串口与pc机连接,另一方面通过20针idc宽带线与仿真器相连,再由仿真器通过25针并口插座与pc机的lpt口相连。开发板通电后即可进行烧写工作。

  arm开发板与pc机的连接

  如图2所示,代码固化分2 个步骤进行。第1步,如虚线一所示,监控程序的映像通过仿真器下载到arm的内部ram中运行,用户可以在主机端用超级终端或者其他串口调试工具与开发板通信。第2步,将应用程序的可执行代码通过串口发送,如虚线二所示,此时内部ram里的监控程序就会接收并把它烧写到flash中。

  代码烧写原理

  图2 代码烧写原理

  2 监控程序的设计

  2.1 启动代码设计

  实现串口烧写的监控程序包括arm启动代码、串口通信代码和flash烧写代码3部分。arm启动代码是整个程序运行的入口点,完成arm系统正常运行所必需的简单初始化,然后把系统控制权交给操作系统或者高级语言编写的监控程序。由于启动代码直接对soc内核和硬件控制器进行编程,因此必须采用汇编语言。

  启动代码包括异常向量表的定义、各种模式的堆栈初始化、系统硬件初始化、程序运行环境初始化,最后跳转到用户c语言主程序。当系统上电或复位后首先会从逻辑地址0x0处执行。

  arm处理器有7种运行模式,如表1所列。每一种模式都有独立的堆栈指针寄存器(sp),因此对使用的模式都要给堆栈指针寄存器sp定义堆栈地址。改变状态寄存器(cpsr)内的状态位,使处理器切换到不同模式,然后给sp赋值就可以实现堆栈的初始化。当然,堆栈的大小视需要而定。

  表1 arm处理器的7种运行模式

  arm处理器的7种运行模式

  堆栈初始化程序如下:

  initstack

  movr0,lr;保存返回地址

  mov r1,#mode_svc:or:i_bit:or:f_bit;设置管理模式堆栈

  msrcpsr_c, r1

  ldrr13, =svc_stack

  movpc,r0;子程序返回

  系统硬件初始化包括设置外部存储器的类型、数据位宽度等,完成之后即可通过“b main”语句跳转到c语言主程序。与ldr指令相比,虽然跳转范围小,但是32 mb的地址空间跳转足以满足程序需要,而且运行得更快。

  2.2 烧写主程序设计

  main函数功能主要包括接收串口数据、解析映像文件及写入外部flash,如图3所示。串口函数主要由init_sio()、 init_val()和send_data()组成。函数init_sio()用于对串口通信参数的设置:波特率,57 600 b/s;奇偶校验,无;数据位,8位;停止位,1位。init_val()是对接收到的数据进行转存,为了提高接收速率,把接收到的数据先暂存到外部 sram中。如果程序量较小也可以选择暂存到芯片内部的ram(64 kb)中,等接收完毕后再对其进行解析。send_data()用于向串口回送烧写工作的信息。

  main函数流程

  图3 main函数流程

  下一步就是要对映像文件进行解析并正确地写入外部flash中。嵌入式程序通过编译器生成的映像文件是elf格式的axf文件,里面有文件头、段信息等信息,不能直接烧录,一般将它转化为bin或者hex文件。这里将嵌入式程序编译成srecord十六进制文件。这是一种motorola公司推出的标准文件格式,用来将数据从pc机传送到目标平台flash,在嵌入式开发中广为应用。srecord文件格式如下:

  srecord文件格式

  其中,sid表示当前记录的类型,常见的有s0、s1、s5和s9等,各个类型代表的意义不同,如s9所在语句表示文件的结束;数据长度代表本句后面数据的长度;地址的字节数会因不同的s记录而异,一般为2字节,表示的是后面的数据在存储器中的地

相关IC型号

热门点击

 

推荐技术资料

DFRobot—玩的就是
    如果说新车间的特点是“灵动”,FQPF12N60C那么... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!