概述
在開發一款產品特別是要裝到密閉空間里面的產品的時候,經常要考慮到程式的更新問題,更新程式的方法有使用芯片廠家自帶的功能的(通過拉某個引腳,設定芯片啟動某塊boot程式,然后引導將自己的程式下載進去),有自己寫BootLoader程式的,使用廠家自帶功能更新程式方便,但必須要用廠家的通訊協議,板卡設計時必須留出程式升級要求的通訊介面,如果這個通訊介面后期使用還好,后期沒用就占用了BOM成本,如果板卡對外有自己的通訊口,可以寫一個BootLoader程式代替廠家的程式升級功能,TI的DSP在工控領域應用較多,在這篇文章中以TI的28335為例介紹一下BootLoader的寫法,其他C2000系列的都大同小異,
功能要求
BootLoader的功能簡單一句話概括,就是完成一些自檢,然后準備好應用程式的運行環境然后執行應用程式,在有需要更新應用程式時更新應用程式,在這篇文章中重點介紹升級程式的功能,
要點
要做BootLoader程式需要的基礎功能(知識)有:
1、程式存盤介質的擦寫功能,對程式運行在芯片內部flash上的需要有擦寫內部flash的功能,對一些程式在外部存盤介質上的需要能擦寫外部存盤介質,如果程式是一個檔案(不是簡單二進制)還需要有對檔案系統的支持,
2、芯片中斷向量表的深刻理解,有一些芯片在BootLoader程式和應用程式上都能隨便更改中斷向量表,但有一些芯片只能在BootLoader程式上改中斷向量表,這時候就要自己做一個中斷跳轉表了,
3、鏈接檔案的理解,BootLoader程式和應用程式是分開編譯的,對于這種單片機的程式必須要理解程式編譯到哪兒了,要在哪兒執行,這涉及到一些加載域和執行域的東西,
4、HEX檔案的格式,編譯DSP程式可以編譯出來hex檔案,然后根據hex檔案就知道程式應該放到哪塊兒地址了,
實作
上面說了要點,在這兒就對每個問題進行介紹,
1、TI官方提供了一個擦寫內部flash的庫,在TI的ControlSuit里面,目錄是:ti\controlSUIT\libs\utilities\flash_api,在這個目錄下有詳細的介紹和例程,需要注意的是:擦寫flash的代碼要運行在RAM中,不可對OTP區還有受保護區進行擦寫(曾經無意擦了一次,芯片鎖死了);擦寫動作不可被打斷,執行的時候要關中斷,
2、28335的中斷向量表存在RAM中,可以在BootLoader程式和應用程式中隨便更改,涉及的變數是PieVectTable,跟蹤代碼可以發現,這個變數被鏈接到了固定的地址中,這個地址剛好是芯片的中斷向量表處,所以在BootLoader程式中設定一下這個表,然后再在應用程式中設定一下這個表就能設定好中斷向量了,
3、修改鏈接檔案,修改方法如下

上面是應用程式的鏈接檔案,BootLoader程式還默認起始點定在BEGIN_M0上,修改為起始點之后還要注意修改程式空間的劃分,這就要根據自己專案確定了,可以將flash劃分為自己想要的區域,
這里需要注意的是將codestart定位到了BEGIN_FLASH上面,在這兒第一條的指令是匯編的指令,根據以前的經驗這個代碼的功能是初始化堆疊,然后跳轉到main函式(這款芯片看不到具體的原始碼,感興趣的可以參考STM32的啟動檔案);由于要初始化堆疊,所以不能自己將main函式定位到自己定義的地方,如果非要這樣做,初始化堆疊的作業要在BootLoader中做好,在這里就直接使用芯片自帶的功能了(多說一嘴,在其他一些BootLoader程式比如uboot和UEFI中都是自己代碼初始化堆疊的),
4、hex檔案的格式,滿天都是可以參考學習一下,將DSP的程式編譯出hex格式網上也有相關的說明都可以參考學習(感謝網路!),
有了上面介紹的基礎知識后實作起來就比較方便了,在設計BootLoader程式的時候,程式啟動就檢查是否要更新程式,如果要更新更新就和外部主機進行通訊獲得更新的代碼,然后寫到相應的位置上(這里就要BootLoader設計一個通訊協議了,通訊協議無非 幀頭||長度||命令||資料||c校驗碼 等,設計復雜的可以傳輸加密的資料),將應用程式寫到它的位置上之后更新一個標記(flash上自己定義的),標記已經有應用程式,下次啟動檢查有這個標記表明有應用程式了,跳到應用程式去執行就可以了,
程式跳轉的位置也要保存在flash上自己定義的位置上,上面通過修改鏈接檔案應用程式已經不在芯片默認的起始點了,可以通過map檔案獲取到程式的起始點

打開map檔案,就可以看到應用程式的入口地址了,第一個函式是 _c_init00 在這里面就是初始化C運行的環境了,初始化完成后去執行main(C的天下了)
后記
上面大概就是撰寫BootLoader的一些技術要點了,涉及基礎知識不多,是一些需要注意到的點,和關鍵點的實作,希望對大家有所幫助,
將BootLoader程式寫完在生產的時候通過廠家的工具下載進去,然后啟動BootLoader就可以更新自己的應用程式了,如果嫌棄這樣麻煩,可以在將程式編譯出hex檔案之后自己寫工具將BootLoader程式和應用程式打包成一個hex檔案,通過廠家的工具也可以下載到芯片中去,
TI的DSP可以使用C2prog將程式下載到DSP中,如果嫌棄這個工具麻煩,自己也可以仿照C2prog寫一個工具實作程式下載的功能,這就相當于又有一個BootLoader程式,這在大規模自動化生產的時候比較有用,有了這個工具可以實作非常多的自己的功能,這方面TI也提供了一些例子,下面的文章中將介紹一下這個工具的實作原理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/272308.html
標籤:其他
