在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

單片機固件中加入版本信息的方式有哪些?-2

汽車電子技術 ? 來源:大橙子瘋嵌入式 ? 作者:大橙子瘋 ? 2023-02-15 15:36 ? 次閱讀

前言

上一篇介紹完如何在程序中添加版本信息后,這篇介紹一下如何在 MCU 程序中固定位置添加程序的版本信息等。

了解

首先了解一下__attribute__機制,它是個編譯器指令,告訴編譯器聲明的特性,或者讓編譯器進行更多的錯誤檢查和高級優化。

GUN C中可以使用__attribute__()給變量、函數和類型設置各種屬性,而__attribute__的section選項可以改變段的特性;

其中__attribute__((section("section_name")))的作用是將該定義的函數或數據變量放入指定名為”section_name”段中。

無論是 GNU 還是 ARM 的編譯器, 都支持__attribute__所指定的編譯屬性。

打開keil的options…,取消勾選下圖所示,然后點擊“Edit…”。

圖片

自動彈出“*.sct”文件(先編譯通過再操作),下面就是 Keil 中 STM32 的鏈接文件,編譯器會根據鏈接文件和__attribute__的section選項(可以自己添加一個段,分配地址和大小)等分配函數和數據變量在程序固件中的地址。

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00010000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00010000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00005000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

這里不做過多介紹了,下面介紹的方式不需要自己修改“*.sct”文件,還是采用__attribute__的section選項,只不過在section選項中指定位置即可。

__attribute__ ((section(".ARM.__at_0x08000020")))

實現方式

1.同樣的定義一個結構體,里面定義一些軟件版本相關的信息

typedef struct
{
    char szVersion[32];    // 軟件版本
    char szBuildDate[32];  // 程序編譯日期
    char szBuildTime[32];  // 程序編譯時間
}AppInfo_t;

2.通過__attribute__定義一個只讀結構體變量(只讀的目的:防止程序改變、節約RAM)并固定變量在程序固件中的位置,賦初值(其中__DATE___TIME__C語言中的內置宏,分別是當前的編譯日期和編譯時間)。

const AppInfo_t __attribute__ ((section(".ARM.__at_0x08002000"))) sg_tAppInfo =
{
    "STM32_V0.1.5",
    __DATE__,
    __TIME__,
};

注:STM32的代碼起始地址是從0x08000000開始的,且存儲中斷向量表信息,因此在選擇程序地址的時候一定要繞開,也不能太靠后,不然生成的bin文件超出了實際的代碼固件大小,在實現bin文件升級的時候就會耗時太長。

3.編譯成功后打開hex文件,查看一下0x08002000所在的內容,版本信息和編譯時間(之后可以通過新增代碼或者變量驗證是不是位置變了)

圖片

4.在主函數添加打印,將版本信息輸出到終端上,打印結果就不演示了,有興趣的朋友可以翻開上一章


映像工具實現固件打包

這里采用的映像工具是srec_cat,網上有源碼(點擊閱讀原文下載srec_cat.exe),可以編譯成 Windows 或 Linux 的可執行文件;這里用這個工具來打包固件信息,比如版本號,同時修改文件名,即文件名=版本號。

通過Bat腳本實現以下功能:

  1. 不需要修改代碼即可修改程序版本信息
  2. 按照當前固件打包時間作為程序的版本信息,同時按照版本信息命名文件
  3. 版本命名格式為:STM32_T2206111526

根據目錄結構樹編寫指定腳本

MDK_STM32
    ---- CORE
    ---- STM32F10x_FWLib
    ---- OBJ(編譯生成的hex文件)
    ---- USER
tool
    ---- srec_cat.exe
    ---- pack.bat

實現 pack.bat:

:: 版本信息前綴和長度
set strPrefix=STM32_
set strPrefixlen=6

:: hex 文件路徑和文件名
set hexFilePath=..\\MDK_STM32\\OBJ
set hexFileName=main.hex

:: 版本信息信息起始地址
set verStringAddr=0x08002000

if %time:~0,2% leq 9 (set hour=0%time:~1,1%) else (set hour=%time:~0,2%)
if %time:~0,2% leq 9 (set minute=%time:~2,2%) else (set minute=%time:~3,2%)

:: 打包時間格式為年月日時分 T2206111526
set strTime=T%date:~2,2%%date:~5,2%%date:~8,2%%hour%%minute%
set strVersion=%strPrefix%%strTime%

:: 版本信息的起始和結束位置
set /a InfoEnd=%verStringAddr%+%strPrefixlen%+11

:: 拷貝臨時文件進行處理
copy %hexFilePath%\\%hexFileName% .\\

.\\srec_cat.exe -generate %verStringAddr% %InfoEnd% -repeat-string %strVersion% %hexFilePath%\\main.hex -intel -exclude %verStringAddr% %InfoEnd% -o .\\%strVersion%.hex -intel

:: 刪除臨時文件
del %hexFileName%

編譯完成后,雙擊 pack.bat 生成添加版本信息后的固件,之后需要通過J-LINK工具包打開生成的固件進行燒錄(通過Keil編譯下載的沒有用)。

圖片

圖片


擴展

如果實現了 bootloader 程序,那么一定會用到寄存器SCB->VTOR重新設置中斷向量表的起始地址了,所以干脆可以將版本信息放在 APP 程序區中的最開始位置,后面緊跟中斷向量表的起始地址。

這樣做的好處是不用擔心程序編譯后版本信息的位置超出了APP可執行程序的實際大小,而且在實現升級的時候bootloader程序在一開始就可以直接對版本信息進行校驗等。

同時通過映像工具 srec_cat 將 bootloader 和 APP 程序固件進行合并。

也能通過 keil 在編譯后自動執行腳本。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17688

    瀏覽量

    357711
  • 程序
    +關注

    關注

    117

    文章

    3816

    瀏覽量

    82115
  • 版本
    +關注

    關注

    0

    文章

    15

    瀏覽量

    9556
收藏 人收藏

    評論

    相關推薦

    華大單片機是如何向MDK中加入頭文件和庫文件的

    華大單片機如何向MDK中加入頭文件和庫文件關鍵文件介紹加入頭文件大多數習慣于8位單片機開發的工程師,都會使用操作寄存器的方式來使用
    發表于 07-13 08:43

    請問單片機如何向MDK中加入頭文件和庫文件?

    請問單片機如何向MDK中加入頭文件和庫文件?
    發表于 09-27 08:32

    如何更簡單的給單片機更新固件

    單片機已經焊接到電路板上時,如何更簡單更便捷的為單片機升級固件便成了一件值得深思的問題。本文介紹了一種更簡單更便捷的固件升級方式,不需要任
    的頭像 發表于 10-23 18:19 ?1.8w次閱讀
    如何更簡單的給<b class='flag-5'>單片機</b>更新<b class='flag-5'>固件</b>?

    如何使用MDK編譯器讓STM32程序HEX文件中加入固件版本信息

    本文介紹一個小技巧: 使用MDK編譯器,讓STM32程序HEX文件中加入固件版本信息。 代碼 代碼如下
    的頭像 發表于 06-23 15:14 ?4222次閱讀
    如何使用MDK編譯器讓STM32程序HEX文件<b class='flag-5'>中加入</b><b class='flag-5'>固件</b><b class='flag-5'>版本</b><b class='flag-5'>信息</b>

    華大單片機如何向MDK中加入頭文件和庫文件

    華大單片機如何向MDK中加入頭文件和庫文件關鍵文件介紹加入頭文件大多數習慣于8位單片機開發的工程師,都會使用操作寄存器的方式來使用
    發表于 11-23 18:07 ?15次下載
    華大<b class='flag-5'>單片機</b>如何向MDK<b class='flag-5'>中加入</b>頭文件和庫文件

    學習筆記(2):輕松學習單片機-單片機的中斷處理機制(上)

    本課程的目標是幫助零基礎的學員輕松地實現單片機入門。課程不采用傳統的學校教學方式,而是從實用的角度講解單片機,特別是利用代碼自動生成工具,產生驅動基本外圍功能的程序代碼。為了學員的理解,課程
    發表于 12-31 18:54 ?1次下載
    學習筆記(<b class='flag-5'>2</b>):輕松學習<b class='flag-5'>單片機</b>-<b class='flag-5'>單片機</b>的中斷處理機制(上)

    SMT32的HEX文件里加入固件版本的方法

    本文介紹一個小技巧:使用MDK編譯器,讓STM32程序HEX文件中加入固件版本信息
    發表于 02-08 15:28 ?0次下載
    SMT32的HEX文件里<b class='flag-5'>加入</b><b class='flag-5'>固件</b><b class='flag-5'>版本</b>的方法

    單片機固件中加入版本信息的方法

    平時我們寫程序,通常都會備注軟件版本,那么,怎么在單片機中保存版本信息呢?方法其實有很多,但基本原理都是在指定存儲區域(Flash)中寫入軟件版本
    的頭像 發表于 04-18 14:50 ?1257次閱讀

    STM32程序HEX文件中加入固件版本信息

    使用MDK編譯器,讓STM32程序HEX文件中加入固件版本信息
    的頭像 發表于 08-14 16:13 ?4527次閱讀

    SMT32的HEX文件里加入固件版本的方法

    使用MDK編譯器,讓STM32程序HEX文件中加入固件版本信息
    的頭像 發表于 02-01 09:37 ?4028次閱讀

    單片機固件中加入版本信息方式哪些?-1

    開發完MCU軟件后,通常都會生成hex文件或者bin文件,用來做固件燒錄或者升級,如果用來做產品開發,就涉及到固件版本的問題,初學者通常采用固件文件重命名來區分
    的頭像 發表于 02-15 15:13 ?1642次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>固件</b><b class='flag-5'>中加入</b><b class='flag-5'>版本</b><b class='flag-5'>信息</b>的<b class='flag-5'>方式</b><b class='flag-5'>有</b>哪些?-1

    單片機固件中加入版本信息方式哪些?-3

    這篇主要介紹一下通過 Git 工具管理的程序如何在 MCU 程序版本信息中增加 Git commot 提交的 id 。
    的頭像 發表于 02-15 15:38 ?946次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>固件</b><b class='flag-5'>中加入</b><b class='flag-5'>版本</b><b class='flag-5'>信息</b>的<b class='flag-5'>方式</b><b class='flag-5'>有</b>哪些?-3

    怎么在單片機中保存版本信息呢?

    平時我們寫程序,通常都會備注軟件版本,那么,怎么在單片機中保存版本信息呢?
    的頭像 發表于 04-18 15:12 ?1041次閱讀

    單片機固件如何加入版本信息

    時我們寫程序,通常都會備注軟件版本,那么,怎么在單片機中保存版本信息呢? 方法其實有很多,但基本原理都是在指定存儲區域(Flash)中寫入軟件版本
    發表于 08-22 09:16 ?563次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>固件</b>如何<b class='flag-5'>加入</b><b class='flag-5'>版本</b><b class='flag-5'>信息</b>

    STM32單片機實現固件在線升級(IAP)

    1,固件升級方案綜述單片機固件升級方式很多種。1、ICP:簡單說就是在單片機開發時使用燒錄器
    的頭像 發表于 12-16 08:00 ?6231次閱讀
    STM32<b class='flag-5'>單片機</b>實現<b class='flag-5'>固件</b>在線升級(IAP)
    主站蜘蛛池模板: h视频免费网站 | aa国产| 中日韩欧美在线观看 | 俄罗斯小屁孩cao大人免费 | 国产精品嫩草影院一二三区入口 | 你懂的网站在线播放 | 高清视频一区 | 4438成人成人高清视频 | 亚洲欧美性另类春色 | xxx性欧美 | 国产精品久线观看视频 | 国产欧美网站 | 放荡女同老师和女同学生 | 久久网综合| www.色网| 在线播放视频网站 | 免费看18污黄 | 午夜影视在线免费观看 | 国产成人免费无庶挡视频 | 免费一级特黄特色大片 | 天天综合在线视频 | 午夜性刺激免费视频观看不卡专区 | 午夜黄色一级片 | 日日夜夜天天干 | a级黑粗大硬长爽猛视频毛片 | 免费观看视频在线观看 | 天天插天天射天天干 | 特色一级黄色片 | 国产乱子伦 | 狠狠色噜噜狠狠狠狠97不卡 | 日本欧美一区二区三区视频 | 在线免费观看一级片 | 天天做日日爱 | 国产看色免费 | 一 级 黄 中国色 片 | 久草免费在线播放 | 高清影院在线欧美人色 | 亚洲精品卡1卡二卡3卡四卡 | 免费无码看av的网站 | 2018天天操夜夜操 | 亚洲免费网站在线观看 |