我们常见的MCU / CPU 代码烧录方式主要有以下三种:
ICP(In Circuit Programing):
在电路编程,可通过CPU的Debug Access Port 烧录代码
比如ARM Cortex的Debug Interface主要是SWD(Serial Wire Debug)或JTAG(Joint Test Action Group);
ISP(In System Programing):
在系统编程,可借助MCU厂商预置的Bootloader 实现通过板载UART或USB接口烧录代码,
比如STM32存储映射Code分区中的System memory可以预置厂商的Bootloader,
让MCU支持通过UART下载(不限于UART,具体由厂商预置Bootloader实现而定);
IAP(In Applicating Programing):
在应用编程,由开发者实现Bootloader功能,
比如STM32存储映射Code分区中的Flash本是存储用户应用程序的区间(上电从此处执行用户代码),
开发者可以将自己实现的Bootloader存放到Flash区间,
MCU上电启动先执行用户的Bootloader代码,
该代码可为用户应用程序的下载、校验、增量/补丁更新、升级、恢复等提供支持,
如果用户代码提供了网络访问功能,IAP 还能通过无线网络下载更新代码,实现OTA空中升级功能
————————————————
版权声明:本文为CSDN博主「流云IoT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_37621078/article/details/106798909
// 下载是指将bin文件下载到 存储器里面(包括片上的片外的,易失性的非易失性的)
一般的架构是这样子的
服务器客户端架构:
pc机上的arm-gdb(或telnet) <--socket通信(本地或远程)-->PC机上openocd或JLink_Windows中的JLinkGDBServer.exe <--USB--> 仿真器 <--SWD/JTAG--> cortex-m芯片
// arm-gdb 用 load 命令支持下载
或
无服务器架构:
PC机上openocd(linux)或者JLink_Windows中的JLink.exe或keil <--USB--> 仿真器 <--SWD/JTAG--> cortex-m芯片
// Jlink.exe 需要用 connect命令 连接 芯片,并用 loadbin 命令支持下载
// keil 需要用 点击按钮的方式 支持下载
开源实现
pc机软件 gdb http://ftp.gnu.org/gnu/gdb/
pc机软件 openocd https://sourceforge.net/projects/openocd/
https://www.gnutoolchains.com/arm-eabi/openocd/
仿真器 cmsis-dap https://github.com/wuxx/nanoDAP // 这些仿真器都是基于 ARM 发布的 CMSIS DAP 源码制作的
https://gitee.com/cazure/CMSIS-DAP // CMSID DAP 源码 位于 https://github.com/ARMmbed/DAPLink
当然也会有 脱机(无PC机) 的情况
下载器 <--SWD/JTAG--> cortex-m芯片 // 此时的结构可以下载
开源实现
脱机烧录器 DAPLink https://github.com/Kevincoooool/KS_DAP_Wireless
https://www.bilibili.com/video/BV1h54y1C7z4
调试是指 下断点/单步运行/全速运行/停止/打印(修改)寄存器 等 功能
一般的架构是这样子的
服务器客户端架构:
pc机上的arm-gdb(或telnet) <--socket通信(本地或远程)-->PC机上openocd或JLink_Windows中的JLinkGDBServer.exe <--USB--> 仿真器 <--SWD/JTAG--> cortex-m芯片
// arm-gdb 用 break/s/r/ctrl-c/bt 等命令来支持调试
或
无服务器架构:
PC机上openocd(linux)或者JLink_Windows中的JLink.exe或者keil <--USB--> 仿真器 <--SWD/JTAG--> cortex-m芯片
// Jlink.exe需要用 connect 命令连接 芯片,并用 loadbin/SetPC/g/h 命令支持调试
// keil 需要用 点击按钮的方式 支持调试
硬件:
ulink cmsis-dap st-link nulink gdlink openjtag easyopenjtag
服务器:
openocd-for-windows openocd-for-linux jlink-for-windows jlink-for-linux pyOCD
客户端:
gdb
其实是 对 level1 中的 服务器和客户端 的封装
eclipse : 有窗口可以自定义 服务器 和 客户端
Visual Studio : 有配置可以自定义 服务器 和 客户端 , 类似 eclipse
https://blog.csdn.net/makerdiary/article/details/104958596
ds-mdk
SDT
ADS
REALVIEW DEVELOPER SUITE
RealView MDK
MULTI 2000
Embest IDE
Hitool for ARM
IAR : 可以通过选择调试器驱动自定义硬件(调试器)和选择硬件(SWD/JTAG)接口,没有用客户端服务器架构,类似keil
http://bbs.eeworld.com.cn/thread-645416-1-1.html
https://github.com/talpachen/vsf_2017/tree/master/vsf/example/vsfusbd/proj/EWARM7.40
也有窗口可以自定义 服务器 和 客户端
keil : 没有用客户端服务器架构
https://zhuanlan.zhihu.com/p/259494491
https://zhuanlan.zhihu.com/p/41517198
swd
coresight
仿真过程
下载过程
openocd 支持 ARM7 ARM9 ARM11 cortex-a
如果仿真器支持 ARM7 ARM9 ARM11 cortex-a
那么 他俩 就是 调试方案
一般用来调试裸机和u-boot(u-boot也是裸机的一种)
如果 openocd 和仿真器 能调试 一个板子的 u-boot(可能是ARM7 ARM9 ARM11 cortex-a)
那么 openocd 和仿真器 能用来调试 linux吗?
linux是u-boot 是两套代码,调试u-boot时能否直接跳转到linux的调试?
应该可以,怎么实现?
有没有必要?是不是有更好的调试方式(gdb),并基于同一种coresight原理
qemu 开启单步调试, gdb 通过 target remote localhost:3333 连接
openocd 运行时 , gdb 也是通过 target remote localhost:3333 连接
qemu 和 openocd 有什么关系
相同点
都实现了一个gdbserver
不同点
qemu 中的 gdbserver 直接调用 ptrace 系统调用
openocd 中的 gdbserver 是 控制的 usb设备,用coresight技术控硬件
// OK6410
如果flash被映射到了 memory map,则可以直接用jflash(或者jlink.exe中的loadbin 命令)来烧写
如果没有映射,则可以
1.加载烧写程序(烧写程序一般比较大,比sram的总空间要大)到ddr
1.1加载初始化内存的bin到sram并运行
1.2加载没有初始化内存过程的bin(A)到ddr
2.加载即将被烧写的bin(B)到ddr
3.运行A来烧写B