嵌入式学习小组
登录
直播中
李燕梅
7年用户
189经验值
私信
关注
请教嵌入式系统交叉调试原理和方法是什么?
开启该帖子的消息推送
JTAG
嵌入式
请教一下大牛,嵌入式系统交叉调试原理和方法是什么呀?大家都说嵌入式系统交叉调试方法一般分为两种,一种是基于
JTAG
的片上调试方法,一种是基于调试代理的远程调试方法。是对的吗?
回帖
(1)
贾绰
2021-3-5 18:50:31
JTAG
是一种国际标准芯片测试协议,目前大多数
CPU
体系都支持
JTAG
。基于
JTAG
的片上调试方法最突出的代表就是
JLink
调试器,其定义了一个软件调试层面的
RDI
接口标准,然后
JLink
调试器将调试环境软件(
IAR
、
KEIL
等)发出的
RDI
接口转化为
JTAG
命令,对芯片进行调试。该方法多适用于嵌入式系统底层驱动调试、裸系统调试和单应用调试。
基于调试代理的远程调试方法是在目标机上运行一个调试代理程序,与宿主机的调试器进行通信交互,一起配合完成调试的任务。该方法主要使用软件陷入来模拟断点以接管
CPU
来完成调试。
GDB
远程调试是主要代表,其提供两种方式。一种是
gdbserver
,其能在目标机的系统上独立运行,用于调试有操作系统的应用程序;另一种是
stub
,其和嵌入式系统程序一起链接运行,一般用于调试系统程序。
Gdbserver
比较容易,但需要操作系统支持;
stub
调试比较难,需要针对具体的芯片体系进行移植。两者的工作原理是相似的。
GDB
调试基于串口协议或者
TCP/IP
协议。由于调试代理、串口驱动或者
TCP/IP
驱动需要占用大量的内存空间,因此该方法一般用于内存资源比较丰富的嵌入式系统的调试。
嵌入式系统一般分资源宽裕型系统和资源紧缺型系统,前者
CPU
处理能力强、内存资源丰富(一般在
M
字节级以上),如能支持
Linux
内核运行的嵌入式系统,而其一般都是选用基于调试代理的远程调试方法来进行开发;而后者的
CPU
处理能力一般、内存资源有限(一般在
100K
字节以下),多见于
单片机
控制器类成本敏感的消费类
电子
系统,系统程序难以和
stub
程序一起在内存中运行,因此难以选择基于调试代理的远程调试方法来进行开发,而是选择基于
JTAG
的片上调试方法或者直接串口打印的方式来进行调试。但是,在资源紧缺型嵌入式系统上,针对带操作系统(如基于
UCOS
内核、
FreeRTOS
内核)的应用程序进行调试,基于
JTAG
的片上调试方法也是难以胜任的。考虑以下类型的嵌入式系统:
带嵌入式操作系统的电子产品往往都具有多个应用,例如一些带
LCD
平的音频播放器,它除了有音乐应用,也有图片应用、
FM
应用、电子书应用等等,同时还可以充当一个
U
盘进行文件拷贝。该系统同时可能运行一到两个应用,例如听音乐看电子书,而其他应用则不能同时运行。
嵌入式系统学习加意义气呜呜吧久零就易,
这些应用程序和操作系统、
UI
资源文件、配置文件都是存在于外存(如
nand flash
或者
nor flash
)的固件区,对使用用户不可见;而音乐文件、电子书等则是存在于外存的用户区,对使用用户可见。从中可看成,各个应用程序是分时复用宝贵的内存资源。由于成本敏感,内存资源的大小是经过精心设计的。对于单个应用程序,也会将代码分为常驻内存类型和可切换类型。例如,对性能影响比较大的解码部分代码就需要常驻内存,而选择文件相关的代码则可以在需要时才加载到内存。同时,使用固化一部分内核的代码,就能做到以
100K
左右的内存来支撑整个系统的运行。应用程序在非运行状态时存储在外存中,在应用运行时才会***作系统加载到内存中,同时对可切换类型的代码进行调度切换。
如果要调试这种带操作系统类型的应用程序,由于内存的原因,依然不能选择基于调试代理的远程调试方法,而选择基于
JTAG
的片上调试方法会遇到以下问题:
由于没有
STUB
在目标机运行,所以基于
JTAG
的片上调试方法只能通过
JTAG
协议接口来对内存进行读写。而上述应用程序包括常驻代码和可切换类型代码,在未运行时需要存储到外存中,在需要的时候才能由定制的操作系统加载到内存中。很明显,
JTAG
接口无法将代码写到外存中去。因此,需要通过其他的手段将固件(包括操作系统、所有的应用程序、
UI
资源文件、配置文件)烧写到固件区,才能使用基于
JTAG
的片上调试方法进行调试。即不使用该方法的程序下载功能,而是使用读内存、设置断点等功能。
因此,调试这种带操作系统类型的应用程序一般的流程如下:
1
)
调试过程中遇到问题,停止调试,修改好,编译链接该应用程序。
2
)
打包固件,将操作系统、所有的应用程序、
UI
资源文件、配置文件等打包成一个固件。
3
)
烧写固件,一般使用
USB
量产工具,或者直接的外存烧写工具。
4
)
启动系统,并运行到该程序,进入调试状态。
这种调试方式最大的问题就是效率很低,因为每次修改程序,都要重新打包整个固件,一般要耗费
10
分钟以上,同时,还要重新烧写整个固件,烧写前还要先擦除外存,这里也要耗费不少时间。另外,由于烧写固件和
JTAG
调试是两套不同的工具,板子上电到连接工具也需要消耗不少时间。
JTAG
是一种国际标准芯片测试协议,目前大多数
CPU
体系都支持
JTAG
。基于
JTAG
的片上调试方法最突出的代表就是
JLink
调试器,其定义了一个软件调试层面的
RDI
接口标准,然后
JLink
调试器将调试环境软件(
IAR
、
KEIL
等)发出的
RDI
接口转化为
JTAG
命令,对芯片进行调试。该方法多适用于嵌入式系统底层驱动调试、裸系统调试和单应用调试。
基于调试代理的远程调试方法是在目标机上运行一个调试代理程序,与宿主机的调试器进行通信交互,一起配合完成调试的任务。该方法主要使用软件陷入来模拟断点以接管
CPU
来完成调试。
GDB
远程调试是主要代表,其提供两种方式。一种是
gdbserver
,其能在目标机的系统上独立运行,用于调试有操作系统的应用程序;另一种是
stub
,其和嵌入式系统程序一起链接运行,一般用于调试系统程序。
Gdbserver
比较容易,但需要操作系统支持;
stub
调试比较难,需要针对具体的芯片体系进行移植。两者的工作原理是相似的。
GDB
调试基于串口协议或者
TCP/IP
协议。由于调试代理、串口驱动或者
TCP/IP
驱动需要占用大量的内存空间,因此该方法一般用于内存资源比较丰富的嵌入式系统的调试。
嵌入式系统一般分资源宽裕型系统和资源紧缺型系统,前者
CPU
处理能力强、内存资源丰富(一般在
M
字节级以上),如能支持
Linux
内核运行的嵌入式系统,而其一般都是选用基于调试代理的远程调试方法来进行开发;而后者的
CPU
处理能力一般、内存资源有限(一般在
100K
字节以下),多见于
单片机
控制器类成本敏感的消费类
电子
系统,系统程序难以和
stub
程序一起在内存中运行,因此难以选择基于调试代理的远程调试方法来进行开发,而是选择基于
JTAG
的片上调试方法或者直接串口打印的方式来进行调试。但是,在资源紧缺型嵌入式系统上,针对带操作系统(如基于
UCOS
内核、
FreeRTOS
内核)的应用程序进行调试,基于
JTAG
的片上调试方法也是难以胜任的。考虑以下类型的嵌入式系统:
带嵌入式操作系统的电子产品往往都具有多个应用,例如一些带
LCD
平的音频播放器,它除了有音乐应用,也有图片应用、
FM
应用、电子书应用等等,同时还可以充当一个
U
盘进行文件拷贝。该系统同时可能运行一到两个应用,例如听音乐看电子书,而其他应用则不能同时运行。
嵌入式系统学习加意义气呜呜吧久零就易,
这些应用程序和操作系统、
UI
资源文件、配置文件都是存在于外存(如
nand flash
或者
nor flash
)的固件区,对使用用户不可见;而音乐文件、电子书等则是存在于外存的用户区,对使用用户可见。从中可看成,各个应用程序是分时复用宝贵的内存资源。由于成本敏感,内存资源的大小是经过精心设计的。对于单个应用程序,也会将代码分为常驻内存类型和可切换类型。例如,对性能影响比较大的解码部分代码就需要常驻内存,而选择文件相关的代码则可以在需要时才加载到内存。同时,使用固化一部分内核的代码,就能做到以
100K
左右的内存来支撑整个系统的运行。应用程序在非运行状态时存储在外存中,在应用运行时才会***作系统加载到内存中,同时对可切换类型的代码进行调度切换。
如果要调试这种带操作系统类型的应用程序,由于内存的原因,依然不能选择基于调试代理的远程调试方法,而选择基于
JTAG
的片上调试方法会遇到以下问题:
由于没有
STUB
在目标机运行,所以基于
JTAG
的片上调试方法只能通过
JTAG
协议接口来对内存进行读写。而上述应用程序包括常驻代码和可切换类型代码,在未运行时需要存储到外存中,在需要的时候才能由定制的操作系统加载到内存中。很明显,
JTAG
接口无法将代码写到外存中去。因此,需要通过其他的手段将固件(包括操作系统、所有的应用程序、
UI
资源文件、配置文件)烧写到固件区,才能使用基于
JTAG
的片上调试方法进行调试。即不使用该方法的程序下载功能,而是使用读内存、设置断点等功能。
因此,调试这种带操作系统类型的应用程序一般的流程如下:
1
)
调试过程中遇到问题,停止调试,修改好,编译链接该应用程序。
2
)
打包固件,将操作系统、所有的应用程序、
UI
资源文件、配置文件等打包成一个固件。
3
)
烧写固件,一般使用
USB
量产工具,或者直接的外存烧写工具。
4
)
启动系统,并运行到该程序,进入调试状态。
这种调试方式最大的问题就是效率很低,因为每次修改程序,都要重新打包整个固件,一般要耗费
10
分钟以上,同时,还要重新烧写整个固件,烧写前还要先擦除外存,这里也要耗费不少时间。另外,由于烧写固件和
JTAG
调试是两套不同的工具,板子上电到连接工具也需要消耗不少时间。
举报
更多回帖
rotate(-90deg);
回复
相关问答
JTAG
嵌入式
基于
嵌入式
操作
系统
的开发
方法
有哪些?
2019-09-16
2545
请问
嵌入式
系统
中的远程
调试
方法
有哪些?
2019-10-28
1854
有什么
方法
可以完成对
嵌入式
系统
的远程
调试
?
2021-04-27
1450
嵌入式
Linux
系统
中有哪几种远程
调试
方法
?
2021-04-22
1299
如何
系统
的学习
嵌入式
?
2021-03-09
1780
在VIM中如何实现对
嵌入式
软件的
调试
?
2021-04-27
1494
嵌入式
系统
模块化设计有什么
方法
?
2019-08-23
1930
嵌入式
系统
的
调试
包括哪些?
调试
的
方法
及注意事项有哪些?
2021-12-24
2196
在
嵌入式
Linux
系统
中关闭
调试
串口输出的
方法
是什么?
2021-12-24
1017
VIM中怎么实现
嵌入式
软件
调试
?
2020-03-06
1881
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
英国威廉希尔公司网站
william hill官网 版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分