前言
学习linux的过程中,看到过多很多程序并且编译过,使用过很多嵌入式集成开发平台,如IAR,Keil MDK-ARM,DS-5等。有时候会遇到很奇怪的现象:对于同一种功能的代码,不同的平台下程序的框架大致相同,但是程序指令会不一样;对源文件的编译,连接等操作的指令也出出现不同;对于段section的含义表述相同呢,但是在编写是语法不同;对于分散加载文件的含义表述相同,但是在编写是语法不同;如上的等等问题都是因为:ARM的开发工具链的差异。
1. ARM现在主流的三大工具链
ADS |
REALVIEW MDK |
RVDS |
|
公司 |
ARM |
Keil(后被ARM收购) |
ARM |
版本 |
被RVDS取代 |
持续更新 |
持续更新 |
破解情况 |
有 |
有 |
有 |
工程管理 |
CodeWarrior IDE |
nVision IDE |
Eclipse/ CodeWarrior IDE |
编译器 |
ARM C compiler for ADS |
ARM C/C++ Compiler (RVCT) |
ARM C/C++ Compiler (RVCT) |
调试器 |
ARM Extention Degugger(AXD) |
NVision Degger |
REALVIEW Degugger(RVD) |
仿真器 |
ARMulator |
nVision CPU & Peripheral Simulation |
REALVIEW ISS |
硬件调试单元 |
Multi-ICE/wiggler |
uLink /jlink |
Realview ICE(RVI)/ Multi-ICE(3.1版本后不支持Multi-ICE) |
支持调试协议 |
RDI |
RDDI/RDI(3.1版本后不支持RDI) |
其编译器为IAR ARM C/C++ Compiler;汇编器为IAR ARM Assembler;连接器为IAR XLINK Linker。
2.简单例子:一个简单的分散加载文件
(1)ARM RealView工具,REALVIEW MDK Keil平台,分散加载文件为.scat:
这是一个标准的常用的分散加载文件,现在加注释于后,方便以后查阅:
;******************************************************************************
; SCATTER LOADING DEION
; ARM
; KEIL's uVision3
; (RealView Microprocessor Developer Kit)
; Filename : LPC2378_Flash.scat
;******************************************************************************
LR_IROM1 0x00000000 0x00080000 ;; 第一个加载域,名字为LR_IROM1,起始
{ ;;地址为0x0,大小为0x80000
ER_IROM1 0x00000000 0x00080000 ;;加载域中的运行时域,名字为ER_IROM1
{ ;; 起始地址为0x0,大小为0x80000
vectors.o (VECT, +First) ;;将vectors.c编译后生成的文件vectors.o中的代码
init.o (INIT) ;;以及init.o中的代码
* (+RO) ;;以及所有编译生成的RO属性的代码全部存放在
} ;;运行时域ER_IROM1指定的地址范围内,存放方式:顺序存放
RW_IRAM1 0x40000000 0x0000e800 ;;这是第二个运行时域,功能同上
{ ;;其中 *是代表具有()里面指定的属性的全部数据
*(+RW,+ZI) ;;与*功能相似的有.ANY,后面说明
} ;; The following declarations select the "two region model" ;
;; A default __user_initial_stackheap() will be used ;
ARM_LIB_HEAP 0x40007000 EMPTY 0x00000100 {} ;;指定堆栈地址
ARM_LIB_STACK 0x40008000 EMPTY -0x00000E00 {}
}
(2)IAR EWARM工具,IRA平台,分散加载文件为.scf:
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x08000000;/*中断向量表开始地址*/
/*-Memory Regions-*/
/*定义内部FLASH地址 */--/*定义内部RAM地址 */
define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;/*闪存起始地址*/
define symbol __ICFEDIT_region_ROM_end__ = 0x0800FFFF;/*闪存结束地址---flash大小64k*/
define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;/*SRAM起始地址*/
define symbol __ICFEDIT_region_RAM_end__ = 0x20004FFF;/*SRAM结束地址---SRAM大小20k*/
/*-Sizes-*//* 栈和堆大小*/
define symbol __ICFEDIT_size_cstack__ = 0x800; /*栈大小*/
define symbol __ICFEDIT_size_heap__ = 0x800;/*堆大小*/
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };//CSTACK块属性(8字节对齐、大小__ICFEDIT_size_cstack__)
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
/* 下列语句定义所定义地址空间内可完成的操作类型*/
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; //__ICFEDIT_intvec_start__赋值给.intvec标识符
place in ROM_region { readonly };
place in RAM_region { readwrite,
block CSTACK, block HEAP };
(3)GCC工具链,采用ld工具(交叉编译采用arm-linux-ld),分散加载文件为.lds
SECTIONS {
. = 0x50008000 //设置起始链接地址
. = ALIGN(4); //字节对齐设置
.text :
{
start.o (.text) /*设置代码段的首文件*/
*(.text) //所有文件的代码段
}
. = ALIGN(4); //字节对齐设置
.data :
{
*(.data) //所有文件的数据段
}
. = ALIGN(4); //字节对齐设置
bss_start = . ;//变量的使用
.bss :
{
*(.bss) //所有文件bss段
}
bss_end = .; //变量的使用
}
3.简单小结
根据上面的介绍,进行嵌入式工程设计开发时,会遇到如上的问题,这取决于我们采用什么样的嵌入式开发平台;比如我们实验室用的就有IAR和GCC两种,其中IAR是用来编译调试STM32程序的(一个大型的while(1)裸机程序),IAR可以与STM32芯片通过JTAG进行在线调试,比较方便;GCC是在linux系统下安装完成后直接使用的,并没有安装大型的开发平台,这带来了很多弊端:可以对uboot,kernel等文件编译生成可执行映像文件,但是在调试时很麻烦,只能把映像文件烧写ARM板卡后,在板卡启动时通过串口打印消息开看uboot和kernel文件是否正常。这种调试手段确实很落后,所以建议大家在尽心开发时,还是需要了解好相关的开发工具,工欲善其事,必先利其器。
由于自身能力有限,本文章存在相关表述问题,希望大家能够批评指正,相互交流,共同进步!