嵌⼊式系统开发环境概述
嵌⼊式系统开发环境主要包括:
集成开发⼯具
交叉编译器
批处理⽂件
makefile
Link Script怎么邀请别人加入
调试⼯具
下载⼯具
其它⼯具(Offline Tools)
模拟器
版本控制⼯具
接下来分别讲解以上各个⼯具:
1、集成开发⼯具
⼀般CPU⼚商会提供针对该CPU的集成开发环境(IDE),但在实际应⽤中,⼤多数嵌⼊式项⽬开发公司都还是会使⽤⾃⼰开发的环境。⼀是项⽬某些功能的特殊性要求,⼆是并不是所有CPU型号都有相应的IDE。
2、 Cross-Tools
Cross-Tools包含:
Cross-Assembler
Cross-Compiler
Cross-Library
Cross-Linker
dump⼯具(将可执⾏⽂件转换为汇编语⾔代码的相关信息)
调试⼯具(GNU gdb)
以GNU Tool-Chain中的C编译器gcc为例,以下是⼀些编译时的选项:
-Werror:将所有警告信息变为错误信息,⼀旦有警告信息产⽣,就不产⽣⽬标⽂件。
-S : 编译时输出汇编语⾔代码。
-C : 编译时仅产⽣⽬标⽂件
-E : 只执⾏预处理,不产⽣⽬标⽂件
-D : 编译时定义宏常数
-O、-O2、-O3: 优化等级。
-g : 编译时加⼊调式信息,使之可以使⽤GDB进⾏调试
以GNU Tool-Chain中的C链接器Linker为例,以下是⼀些选项:
-
T : 制定链接脚本⽂件
-Map :连接时产⽣map⽂件,其中包含了程序中所有symbol的地址信息。
GNU tool chain可以⽀持许多不同的CPU,使⽤者可以根据需求设定配置。例如arm-elf-gcc就是会以elf格式产⽣ARM机器码的C编译器,⽽68K-coff-ld就是会以COFF格式产⽣68000机器码的linker。
3、Make
make是⽤来进⾏⾃动编译的程序⼯具,只要在makefile中详细叙述要⽤什么⼯具(例如cross-compiler)对哪个⽂件(.c、.obj、…)做何种处理(产⽣不优化的⽬标⽂件),make同时还会检查这些⽂件是否过期,如果过期会仅仅⾃动重新编译需要编译的(make会⽐较⽂件之间的依存关系与⽇期,以决定某个⽂件是否需要重新编译),⽽通常的批处理程序(例如windows下的.bat程序),在有某些⽂件更新后,需要重新编译所有⽂件。
《programming with GNU Software/GNU程序设计》
《Managing Project with make/make 项⽬开发⼯具》
以上两本书有对make使⽤的详细说明。
(1) makefile⾥的重要概念
Target(⽬标):就是想要产⽣的⽂件名称。
Dependency(依赖):定义两个⽂件是否存在依存关系。
Prerequisite(必备⽂件):⼀些能建⽴target的⽂件,⼀个target通常由多个⽂件建⽴。
UP to Date(新版):假设某个⽂件⽐它所依赖的⽂件还要新,则表⽰这个⽂件有了新版本。
makefile的基本语法:
#⽂件名:sample.mak
Target:Dependency list
command1
command2
要执⾏上述makefile的命令是:make -f sample.mak,如果没有使⽤-f指定makefile⽂件的话,make会在当前⽬录下寻名
为“makefile”的⽂件。此外如果没有指定targe的话,make会以makefile中第⼀个target⽂件名当作⽬标名。
(2)makefile举例
下例为makefile中的宏定义⽰例:
#File Name : DEFINE.MAK
#
#定义其它makefile中会⽤到的宏,思想和C语⾔的#define⼀样
如果当时歌词#
!IFNDEF _DEFINE_MAK
_DEFINE_MAK = DEFINED
#
#定义项⽬相关⽂件所在的磁盘机编号
#
PRJ_DRIVER = Y:
#
#定义项⽬⼯具所在⽬录
#
PRJ_TOOLS_ROOT = $(PRJ_DRIVER)\Tools
#
#定义编译器所在⽬录
#
GNU_CC = $(GNU33_ROOT)\kcc33
GNU_LK = $(GNU33_ROOT)\ld
GNU_AR = $(GNU33_ROOT)\ar
#
#定义项⽬程序所在⽬录
#
SRC_ROOT = $(PRJ_DRIVER)\Project2020
SRC_INC = $(SRC_ROOT)\include
小制作视频#
#当编译时传⼊-DXXX参数,其效果如同在程序中写了#define XXX
#
PRJ_CONFIG = -DPRJ_2020 -DCPU_ARM9 -DLCD_160X160
#
#定义执⾏C compiler时的参数
#
CFLAGS= -c -gstabs -mlong-calls -fno-builtin -mgda=0 -mdp=1 -O3 -I$(GNU_INCLUDE)
-I$(SRC_INC)
高中生自我评价范文-I$(PRJ_CONFIG)
#
#定义执⾏linker时的参数
#
LDFLAGS= -T main.lds -Map $(TARGET).map -N
#...
#...
!
ENDIF
下例为⼀个较复杂的范例:
#
#在makefile中,也可以和include⼀样,包含其它makefile
#
!IF "$(_DEFINE_MAK)" == ""
!INCLUDE DEFINE.MAK
!ENDIF
#
#定义各模块包含的object file,每个object都是⼀个target
#
MODEL1_OBJS = m1_001.obj m1_002.obj m1_003.obj
MODEL2_OBJS = m2_001.obj m2_002.obj
#
# 项⽬中所有需要的object file
#
OBJS = $(MODEL1_OBJS) $(MODEL2_OBJS)
#
#定义会⽤到的库函数
#
LIBS = $(GNU_LIB)\libgcc.a
#
#第⼀个target产⽣最终可执⾏⽂件main.elf,
#和main.elf有依赖关系的target有:所有的object file,main.mak,Link Script
#"$@"表⽰target本⾝,即main.elf
#
main.elf : $(OBJS) main.mak main.lds
$(GNU_LK) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
#
# $* 表⽰target名称去掉扩展名
# $@ 表⽰target本⾝
# $< 表⽰XXX.c
#
m1_001.obj : $(SRC_ROOT)\m1\m1_001.c $(SRC_INC)\m1.h
$(GNU_CC) $@ $(CFLAGS) $*.c
m1_002.obj : $(SRC_ROOT)\m1\m2_001.c $(SRC_INC)\m1.h
$(GNU_CC) $@ $(CFLAGS) $*.c
...
当需要重复处理⼏个扩展名⼀样的⽂件时,通常可以使⽤make的预设编译规则。例如当需要以同样的规则编译所有以.obj为扩展名的target时可以采⽤如下语句:
.c.obj:;$(GNU_CC) $@ $(CFLAGS) $<
(3)⾮⽂件名称的Target
clean:
del $(OBJS)朱丹
del main.elf
del main.bin
上述makefile语句中仅有target,没有dependency,意味着该target是⼀定会去执⾏下⽂的del命令。⼀般⽤于重新编译所有⽂件前执⾏。
这种⾮⽂件名target也可作为其它target的dependency,⽤于当要make某个target时,先去执⾏⼀系列指令的效果:
build_all : clean
...
...
(4)版本控制
在系统正式发布之前,程序代码中肯定会包含许多⽤于调试的代码⾏。但实际中,由于嵌⼊式系统的存储资源有限,不可能将含有调试代码的程序作为最终代码烧进板⼦。所以在设计时,⼀般会设计两个版本(调试版和发⾏版)。当然,当程序开发完,我们不可能⽤⼿动的⽅式⼀个个去删除这些调试代码。此时可以采⽤C语⾔中条件编译的思想,见下⽂分析:
调试版批处理⽂件:make_debug.bat
REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Make_debug.bat
REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM 设定Windows/DOS的系统环境变量
REM
set BUILD_MODE = Debug
REM make我们的程序
REM
make target
发⾏版批处理⽂件:make_release.bat
REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
REM Make_release.bat
REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
set BUILD_MODE = Release
make target
makefile:
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#makefile
水文地质工程地质
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
!IF "$(BUILD_MODE)" == "Debug"
# 如果BUILD_MODE等于“Debug”,则设定编译时期的参数CFLAGS_DEBUG = __DEBUG_VERSION
# 反之,则设定编译时期的参数为空
#
CFLAGS_DEBUG = -D__DEBUG_VERSION
!ENDIF
target:
gcc $(CFLAGS_DEBUG) xxx.c
#-D参数⽤来在编译时期设定宏变量“__DEBUG_VERSION”
4、Link Script
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论