OTA(Over-The-Air Technology,空中下载技术)是一种通过无线网络对设备进行远程升级的技术。这种技术最初在PC电脑和移动手机行业中得到应用,近年来在汽车行业中也得到了广泛的应用。
IAP:In-Application Programming (IAP) 是一种使微控制器(MCU)能够在系统运行时更新自身固件的技术。这种技术允许设备在现场升级,而无需通过传统的编程器或调试器。IAP通常通过使用MCU的通信接口,如UART、USB或CAN等来实现。此外,还支持通过各种通信协议进行,如以太网、Wi-Fi或蜂窝网络,bootloader即是实现这种功能的代码。
XIP:烧写到flash上,直接在flash上执行
Z-Modem:是一个高级的文件传输协议,主要用于计算机之间的文件传输,尤其是在拨号网络和早期互联网时代非常流行。相比于X-Modem和Y-Modem协议,Z-Modem提供了更高的传输速度、错误恢复能力以及自动文件名和文件大小的协商,极大地提高了文件传输的效率和可靠性。
Z-Modem协议的几个关键特点包括:
自动握手与错误纠正:Z-Modem能够自动进行连接握手,无需用户干预,而且具备强大的错误检测和纠正机制,可以在嘈杂的通信线路中保证数据的完整性。
高速传输:通过使用更大块的数据包(可达32K字节),Z-Modem能够比X-Modem和Y-Modem更快地传输文件。
流控与中断恢复:Z-Modem支持双向的流控制,能够在传输过程中动态调整数据速率,以适应当前的线路条件。此外,它还支持断点续传,即使传输中断也能从中断处继续,无需重新开始。
自动文件名与方向检测:Z-Modem协议能够自动传输文件名和文件大小信息,接收方可以决定是否接受传输。同时,它能够自动检测文件传输的方向,无需用户指定发送或接收。
透明数据传输:支持二进制文件的无缝传输,无需对特殊字符进行转义,提高了文件传输的通用性。
尽管随着网络技术的发展,如FTP、HTTP、SCP等协议在今天的网络文件传输中更为常见,Z-Modem因其高效和健壮性,在某些特定场景下(如复古计算、嵌入式系统或不可靠网络环境)仍有一定的应用价值。
分为两个程序,一个程序是bootloader,烧写在flash开始的地方;另一个为app,烧写到bootloader跳转的地方。
实现的功能:bootloader程序在上电之后初始化串口,然后跳转到app的地址去运行打印,打印出信息。
程序解析:
bootloader程序的启动程序
bootloader的main函数:
app的启动文件:
app的main函数:
bootloader的启动文件不变,main函数:
app的启动文件:
为什么要使用汇编代码来跳转?
程序解析:
bootloader的汇编文件:
使用SCB的向量表偏移寄存器,将向量表的地址定位到app的地址。
程序解析:
bootloader的main函数:
bootloader的汇编文件:
程序解析:
当我们把app程序链接到RAM中,且程序中使用绝对跳转的指令,直接使用例如指针赋值等指定的地址时,会导致程序从指针指向的地址运行,导致无法运行。
app的汇编文件:
app的main函数:
app的反汇编文件:
程序解析:
app的main文件:
遇到的问题:
复制的方式,可以用于烧写的地方不是可以执行的地方(XIP),比如我们烧写到外部SD卡,spi-flash等等大容量的设备上
这时要bootloader将程序复制到ROM或者RAM,然后跳到程序去运行。
三个要素:
如何生成这个头部?
使用U-boot的工具,mkimage.exe,可以生成带头部的image文件
./mkimage.exe -n "f103ZET6_app" -a(加载地址) 0x20000000 -e(入口地址) 0x20000008 -d app.bin app_with_header.bin
程序解析:
修改异常向量的地址:
硬件支持,通过重定位向量表寄存器修改向量表地址
有一些硬件并不支持重定位向量表,发生异常时,仍然在bootloader中的异常向量表去寻找。
int argc, char **argv
是C语言中用于命令行参数传递的两个典型变量,通常在主函数(main function)的定义中见到。它们用于接收程序启动时从命令行传入的参数。让我们逐个解析这两个参数:
int argc: 这个参数代表了“argument count”,即传入程序的参数个数。它是一个整数,总是大于等于1。argc至少为1,是因为程序名称自身也被视为一个参数(即argv[0])。如果用户没有提供额外的参数,argc将等于1;每增加一个额外的参数,argc的值就增加1。
**char argv[]: 这个参数代表了“argument vector”,即一个指向字符指针的指针,也可以理解为一个字符串数组。它包含了指向各个参数的指针。每个指针都指向一个以空字符('\0')结尾的字符串,即C语言中的字符串。argv[0]通常是程序本身的名称或路径,argv[1]开始是用户提供的第一个参数,以此类推,直到argv[argc-1]。
举例说明,假设你有一个名为myProgram
的程序,用户在命令行中输入如下命令来运行它:
myProgram -f input.txt -o output.txt
在这个例子中,argc
将为4,因为总共有4个参数(包括程序名自身)。argv
的内容如下:
argv[0]
指向 "myProgram"
argv[1]
指向 "-f"
argv[2]
指向 "input.txt"
argv[3]
指向 "-o"
argv[4]
指向 "output.txt"
argv[5]
是NULL,表示参数列表的结束。通过解析argc
和argv
,程序可以了解用户在命令行中提供了哪些参数,以及如何根据这些参数调整行为。这是编写能够接受用户输入或配置的命令行工具的基础。