嵌入式软件开发基础
15 char* memptr;
16 memptr = (char *)malloc(1024);
17 if(NULL == memptr)
18 {
19
printf(malloc error\n);
20
return -1;
21 }
22 else
23 {
24
printf(malloc successfully\n);
JTAG调试
JTAG是Joint Test Action Group 的简称。 JTAG使用边界扫描( Boundary-Scan )的 方式调试:在正常的运行状态下,这些边 界扫描寄存器对于芯片是透明的;在调试 的运行状态下,通过这些边界扫描寄存器 单元,可以实现对芯片输入输出信号的观 察和控制。
RO data (只读数据段)
RW data (读写数据段)
代码段 数据段
执行程序内部细节
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 const char ro_data[1024]={This is readonly data}; 5 char rw_data_1[1024]={This is global readwrite data}; 6 static char rw_data_2[1024]={This is internal readwrite data}; 7 static char zero_data_1[1024]; 8
调试器
编译(Compile)
编译( Compile )是指从高级语言转换成 汇编语言的过程。从本质上编译是一个文本 转换的过程(从文本文件到文本文件)。编 译包含了 C语言的语法解析和生成汇编语言 两个步骤。
。
汇编 (Assemble)
汇编(Assemble)是指从汇编语言 程序生成目标系统的二进制代码(机器 代码)的过程。相对于编译过程的语法 解析,汇编的过程相对简单。这是因为 对于一款特定的处理器,其汇编语言和 二进制的机器代码是一一对应的。
嵌入式调试的特点
在嵌入式系统中,调试的概念相对复杂。对 于其调试过程,程序主体运行在目标机上,主机 所起的作用是获得程序运行中的信息,并通过人 工或者程序的方式分析这些信息。因此嵌入式调 试的基础是需要一条从主机到目标机的通讯通道。
主机
程序运行信息 控制命令
通信通道
目标机
打印调试信息
打印调试信息是基本的调试方式, printf()标准输出,在嵌入式系统中, 这种输出的通讯通道可能是串口或者 网络协议。在某些系统中,没有实现 标准输出,这就需要开发者自己开发 调试手段。
执行程序内部细节
9 int main(int argc, char *argv[])
10 {
11 static char zero_data_2 [1024];
12 int i;
13 char stack_data_1[100];
14 char stack_data_2[] = {Init stack Data};
远程GDB调试
在远程 GDB 调试中,调试器是运行在主机 (host,桌面电脑)的应用程序, 被调试的程序 是运行在目标( target)上。它通过插桩 (stub)的 方式实现,即在目标操作系统和调试器内分别加 入某些功能模块,二者互通信息来进行调试。调 试器与被调程序的通信: Gdb和调试stub通过 GDB串行协议进行通信。
6.2 嵌入式软件开发流程
? 嵌入式应用的生成特点 ? 编译 ? 汇编 ? 链接 ? 加载程序
嵌入式应用的生成特点
C语言程序的生成分成 编译、汇编、 链接等几个步骤。最终的目标文件的主要 部分是处理器可执行的机器代码组合。
根据系统的不同,目标文件除了可执 行的二进制代码部分外,可能还包括一定 的头。
链接(Link)
链接(Link)过程将汇编成的多个 机器代码组合成一个可执行程序。一般 来说,通过编译和汇编过程,每一个源 文件将生成一个目标文件。链接器的作 用就是将这些目标文件组合,组合的过 程包括了代码段、数据段等部分的合并, 以及添加相应的文件头。
6.3 调试工具和方法
? 嵌入式调试的特点 ? 打印调试信息 ? JTAG调试 ? 远程gdb调试
嵌入式应用的生成特点
C代码 编译器
ADS:armcc.exe\tcc.exe Linux: arm-liunx-gcc
汇编代码
ADS:armasm.exe Linux: arm-linux-as
汇编器
机器代码
ADS:armlink.exe Linux: arm-linux-ld
链接器 可执行程序
ADS:armsd.exe 或axd.exe Linux: gdb \ gdb server
第6章 嵌入式软件开发基础
第6章 嵌入式软件开发基础
? 6.1 嵌入式软件开发语言 ? 6.2 嵌入式软件开发流程 ? 6.3 调试工具和方法 ? 6.4 C语言程序的结构 ? 6.3 仿真环境
6.1 嵌入式软件开发语言
? 汇编(与体系结构相关) ? C语言(最常用语言) ? C++语言(面向对象,C语言的扩展) ? JAVA(面向对象,可移植性强) ? 脚本语言(不需要编译)
嵌入式应用的生成特点
集成开发环境:
ADS(Arm Developer Suite),主要需要使用以下工具: ? 编译器:armcc.exe(编译成ARM指令汇编)和
tcc.exe(编译成Thumb指令汇编) ? 汇编器:armasm.exe ? 链接器:armlink.exe ARM-Linux GCC交叉编译系统,则主要使用以下工具: ? 编译器:arm-lixux-gcc(可以统一编译-汇编过程) ? 汇编器:arm-linux-as ? 链接器:arm-linux-ld
6.4 C语言程序的结构
? C语言目标文件中的段 ? 执行程序内部细节 ? 目标文件各段的链接 ? C语言程序的执行
C语言目标文件中的段
C语言的目标文件一般包含三个主体段: ? 代码段(Code,又称Text) ? 只读数据段(RO Data) ? 读写数据段(RW Da