網(wǎng)站虛擬空間更新緩存b2b平臺運營模式
在市場上有各式各樣的單片機,例如Arduino,51單片機,STM等。通常,我們都用其對應(yīng)的IDE軟件進行單片機的編程。這些軟件既負責(zé)將程序代碼轉(zhuǎn)寫成二進制代碼,即機器語言,也負責(zé)將該二進制代碼導(dǎo)入單片機。與此同時,有一個開源軟件,叫做Avrdude,可以將二進制代碼程序?qū)懭敫鱾€品牌的單片機中。該項目在Github上,支持Windows、MacOS、以及以Linux為內(nèi)核的系統(tǒng)[1]。這是由于許多單片機的公司的產(chǎn)品是開源的,也就是說將二進制程序代碼寫入單片機的報文是公開的,所以有這樣的電子工程師將這些寫入的報文做成程序供大家使用。
本文通過分析Avrdude的源代碼,大致了解一下二進制程序代碼寫入單片機的過程,即報文格式,幫助讀者進一步了解單片機的工作原理。通過了解這些內(nèi)容,有助于開發(fā)第三方軟件進行單片機的編程。開發(fā)第三方軟件的意義有,例如,有的人認(rèn)為現(xiàn)有的單片機IDE程序太復(fù)雜,想設(shè)計一個簡單的,易用的版本,只包含基本功能即可;另外,也可以將單片機的IDE程序移植到其它的平臺,如鴻蒙,安卓,甚至一些小眾的操作系統(tǒng)和平臺上。
一、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后面跟傳輸?shù)拇谔?#xff0c;-b后面跟波特率,-p后面跟具體的型號,-U后面跟需要寫入的單片機內(nèi)存、是寫還是讀、二進制代碼文件、格式。
從該句的大意可以看出,把程序?qū)懭雴纹瑱C的過程,本質(zhì)上說是把二進制程序代碼寫入單片機的某個內(nèi)存中。這個內(nèi)存通常是flash或eeprom。關(guān)于flash和eeprom的區(qū)別,見[3]。
二、源程序的分析
注:該源代碼包里包含多個文件,經(jīng)常出現(xiàn)一個函數(shù)或常量的定義在另一個文件中的現(xiàn)象。所以為了分析方便,強烈建議用支持在文件夾里從多個文件中搜索關(guān)鍵詞的功能,且支持多視圖的軟件。例如NotePad++[5]?[6]。若要用iPad閱讀代碼,推薦Code App[7]。注意要在設(shè)置里打開以下選項,啟用多視圖功能。
一個用C語言寫的程序,運行時,通常從main函數(shù)開始。而通過命令行運行程序時,輸入的程序名以及參數(shù),會被傳遞到main函數(shù)的參數(shù)中。具體的說明,見[4]。
所以,在這里,main函數(shù)在src目錄下的main.c中
當(dāng)通過命令行運行avrdude時,"avrdude","-c","arduino"等字符串都會傳遞到argv中。
這里觀察一下main函數(shù)中處理這些參數(shù)的方式。
這里,重點研究-U后面的參數(shù),即寫入的單片機內(nèi)存和二進制代碼文件。從程序中可看出,這些參數(shù)都被賦給了upd指向的對象的屬性中。
通過閱讀代碼,可知寫入芯片的過程是由do_op函數(shù)進行的。經(jīng)搜索,這個函數(shù)的定義在update.c中。
這里,upd->op應(yīng)該是DEVICE_WRITE,即把文件里的內(nèi)容寫入單片機的內(nèi)存。
這里涉及到兩個重要步驟:第一個,是把文件的二進制代碼提取到程序中,由函數(shù)update_all_from_file進行;第二個,是把二進制代碼寫入單片機的內(nèi)存中,由函數(shù)update_avr_write進行。
下面分析這兩個函數(shù):
1. update_all_from_file
最終,在fileio_rbin中,mem被更新了。
這里,mem->buf被填充了文件里讀出的二進制代碼。因此,mem就攜帶了要上傳給單片機的程序。
2. update_avr_write
avr_write_mem用于將報文傳入單片機。
觀察avr_write_byte函數(shù)
該函數(shù)用于將字節(jié)寫入單片機的指定內(nèi)存,即地址。其具體實現(xiàn)方式,不同的單片機會有不同,這里以其中一款為例。
這里,cmd[0]代表地址,cmd[1]代表輸入的字節(jié)。
serial_send函數(shù),即通過串口把內(nèi)容從電腦上傳至單片機的函數(shù),實現(xiàn)方式和操作系統(tǒng)有關(guān)。目前,windows系統(tǒng)和POSIX即Unix內(nèi)核的系統(tǒng)的串口實現(xiàn)方式在該代碼包中已實現(xiàn)。HarmonyOS NEXT系統(tǒng)將使用鴻蒙自己的內(nèi)核[7],可能和windows及Unix均不同,所以如要把該程序移植到鴻蒙星河版上,這一部分的實現(xiàn)可能需要重新編寫。
三、其它方面的研究
用這樣的分析方法,可以研究不同的單片機的各內(nèi)存的地址,以及從單片機中讀取內(nèi)容的過程等。
鏈接
[1]https://github.com/avrdudes/avrdude/tree/main
[2]AVRDUDE: 2.1 Option Descriptions
[3]嵌入式開發(fā)——EEPROM和FLASH的區(qū)別和優(yōu)劣勢-CSDN博客
[4]【Linux】命令行參數(shù)_命令行參數(shù)的使用linux-CSDN博客
[5]notepad++ 根據(jù)文件內(nèi)容查找文件_notpad++ 查找 文件小于100k-CSDN博客
[6]Notepad++使用教程_nodepad++-CSDN博客
[7]華為鴻蒙內(nèi)核成為 HarmonyOS NEXT 流暢安全新基座 - IT之家