在市场上有各式各样的单片机,例如Arduino,51单片机,STM等。通常,我们都用其对应的IDE软件进行单片机的编程。这些软件既负责将程序代码转写成二进制代码,即机器语言,也负责将该二进制代码导入单片机。与此同时,有一个开源软件,叫做Avrdude,可以将二进制代码程序写入各个品牌的单片机中。该项目在Github上,支持Windows、MacOS、以及以Linux为内核的系统[1]。这是由于许多单片机的公司的产品是开源的,也就是说将二进制程序代码写入单片机的报文是公开的,所以有这样的电子工程师将这些写入的报文做成程序供大家使用。
本文通过分析Avrdude的源代码,大致了解一下二进制程序代码写入单片机的过程,即报文格式,帮助读者进一步了解单片机的工作原理。通过了解这些内容,有助于开发第三方软件进行单片机的编程。开发第三方软件的意义有,例如,有的人认为现有的单片机IDE程序太复杂,想设计一个简单的,易用的版本,只包含基本功能即可;另外,也可以将单片机的IDE程序移植到其它的平台,如鸿蒙,安卓,甚至一些小众的操作系统和平台上。
一、Avrdude的基本操作
Avrdude可以作为Linux的控制台程序,其运行的命令形式大致为[1]:
avrdude -c <programmer> -p <part> -U flash:w:<file>:i
如:
avrdude -c arduino -P COM1 -b 115200 -p atmega328p -D -U flash:w:objs/blink.hex:i
详细说明见[2]。简单地说,-c 后面跟单片机的类型,-P后面跟传输的串口号,-b后面跟波特率,-p后面跟具体的型号,-U后面跟需要写入的单片机内存、是写还是读、二进制代码文件、格式。
从该句的大意可以看出,把程序写入单片机的过程,本质上说是把二进制程序代码写入单片机的某个内存中。这个内存通常是flash或eeprom。关于flash和eeprom的区别,见[3]。
二、源程序的分析
注:该源代码包里包含多个文件,经常出现一个函数或常量的定义在另一个文件中的现象。所以为了分析方便,强烈建议用支持在文件夹里从多个文件中搜索关键词的功能,且支持多视图的软件。例如NotePad++[5] [6]。若要用iPad阅读代码,推荐Code App[7]。注意要在设置里打开以下选项,启用多视图功能。
一个用C语言写的程序,运行时,通常从main函数开始。而通过命令行运行程序时,输入的程序名以及参数,会被传递到main函数的参数中。具体的说明,见[4]。
所以,在这里,main函数在src目录下的main.c中
当通过命令行运行avrdude时,"avrdude","-c","arduino"等字符串都会传递到argv中。
这里观察一下main函数中处理这些参数的方式。
这里,重点研究-U后面的参数,即写入的单片机内存和二进制代码文件。从程序中可看出,这些参数都被赋给了upd指向的对象的属性中。
通过阅读代码,可知写入芯片的过程是由do_op函数进行的。经搜索,这个函数的定义在update.c中。
这里,upd->op应该是DEVICE_WRITE,即把文件里的内容写入单片机的内存。
这里涉及到两个重要步骤:第一个,是把文件的二进制代码提取到程序中,由函数update_all_from_file进行;第二个,是把二进制代码写入单片机的内存中,由函数update_avr_write进行。
下面分析这两个函数:
1. update_all_from_file
最终,在fileio_rbin中,mem被更新了。
这里,mem->buf被填充了文件里读出的二进制代码。因此,mem就携带了要上传给单片机的程序。
2. update_avr_write
avr_write_mem用于将报文传入单片机。
观察avr_write_byte函数
该函数用于将字节写入单片机的指定内存,即地址。其具体实现方式,不同的单片机会有不同,这里以其中一款为例。
这里,cmd[0]代表地址,cmd[1]代表输入的字节。
serial_send函数,即通过串口把内容从电脑上传至单片机的函数,实现方式和操作系统有关。目前,windows系统和POSIX即Unix内核的系统的串口实现方式在该代码包中已实现。HarmonyOS NEXT系统将使用鸿蒙自己的内核[7],可能和windows及Unix均不同,所以如要把该程序移植到鸿蒙星河版上,这一部分的实现可能需要重新编写。
三、其它方面的研究
用这样的分析方法,可以研究不同的单片机的各内存的地址,以及从单片机中读取内容的过程等。
链接
[1]https://github.com/avrdudes/avrdude/tree/main
[2]AVRDUDE: 2.1 Option Descriptions
[3]嵌入式开发——EEPROM和FLASH的区别和优劣势-CSDN博客
[4]【Linux】命令行参数_命令行参数的使用linux-CSDN博客
[5]notepad++ 根据文件内容查找文件_notpad++ 查找 文件小于100k-CSDN博客
[6]Notepad++使用教程_nodepad++-CSDN博客
[7]华为鸿蒙内核成为 HarmonyOS NEXT 流畅安全新基座 - IT之家