色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

前言

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

了解

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

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

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

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

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

圖片

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

; *************************************************************
; *** 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")))

實現(xiàn)方式

1.同樣的定義一個結(jié)構(gòu)體,里面定義一些軟件版本相關(guān)的信息

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

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

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

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

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

圖片

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


映像工具實現(xiàn)固件打包

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

通過Bat腳本實現(xiàn)以下功能:

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

根據(jù)目錄結(jié)構(gòu)樹編寫指定腳本

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

實現(xiàn) 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%

:: 版本信息的起始和結(jié)束位置
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編譯下載的沒有用)。

圖片

圖片


擴展

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

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

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

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關(guān)注

    關(guān)注

    146

    文章

    17162

    瀏覽量

    351309
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3787

    瀏覽量

    81069
  • 版本
    +關(guān)注

    關(guān)注

    0

    文章

    15

    瀏覽量

    9480
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

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

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

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

    本文介紹一個小技巧: 使用MDK編譯器,讓STM32程序HEX文件中加入固件版本信息。 代碼 代碼如下
    的頭像 發(fā)表于 06-23 15:14 ?4064次閱讀
    如何使用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中加入頭文件和庫文件關(guān)鍵文件介紹加入頭文件大多數(shù)習(xí)慣于8位單片機開發(fā)的工程師,都會使用操作寄存器的方式來使用
    發(fā)表于 11-23 18:07 ?15次下載
    華大<b class='flag-5'>單片機</b>如何向MDK<b class='flag-5'>中加入</b>頭文件和庫文件

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

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

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

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

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

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

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

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

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

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

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

    開發(fā)完MCU軟件后,通常都會生成hex文件或者bin文件,用來做固件燒錄或者升級,如果用來做產(chǎn)品開發(fā),就涉及到固件版本的問題,初學(xué)者通常采用固件文件重命名來區(qū)分
    的頭像 發(fā)表于 02-15 15:13 ?1413次閱讀
    <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 。
    的頭像 發(fā)表于 02-15 15:38 ?745次閱讀
    <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

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

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

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

    時我們寫程序,通常都會備注軟件版本,那么,怎么在單片機中保存版本信息呢? 方法其實有很多,但基本原理都是在指定存儲區(qū)域(Flash)中寫入軟件版本
    發(fā)表于 08-22 09:16 ?438次閱讀
    <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單片機實現(xiàn)固件在線升級(IAP)

    1,固件升級方案綜述單片機固件升級方式很多種。1、ICP:簡單說就是在單片機開發(fā)時使用燒錄器
    的頭像 發(fā)表于 12-16 08:00 ?5414次閱讀
    STM32<b class='flag-5'>單片機</b>實現(xiàn)<b class='flag-5'>固件</b>在線升級(IAP)
    主站蜘蛛池模板: 女bbbbxxx孕妇| 亚洲国产精品线在线观看| 老人FREE VIODES老少配| 久久免费国产视频| 伦理片2499电影伦理片| 欧美同志高清vivoeso| 三级黄色在线视频中文| 午夜男女爽爽羞羞影院在线观看| 乌克兰粉嫩摘花第一次| 亚洲欧美在无码片一区二区| 在线观看亚洲专区5555| 99精品影院| 干了快生了的孕妇| 国产自产第一区c国产| 久久综合色一综合色88中文| 欧美性情video sexo视频| 翁熄性放纵交换01| 一本道久在线综合色姐| 99久热精品免费观看| 高清不卡伦理电影在线观看| 国精一区二区AV在线观看网站| 久久国产亚洲精品AV麻豆| 嗯别插太快好深再深点| 偷偷要色偷偷| 在线观看国产日韩| 超碰免费视频部落格| 含羞草影院免费区| 暖暖 日本 视频 在线观看免费 | 99久久国产露脸精品国产吴梦梦 | 伊人久久国产| www.绿巨人| 国产综合在线视频| 蜜臀AV精品久久无码99| 我的漂亮朋友在线观看全集免费| 伊人精品影院| 成人公开免费视频| 国拍在线精品视频免费观看| 男女免费观看在线爽爽爽视频| 午夜国产一区在线观看| 69xx欧美| 国产精品无码中文在线AV|