[導讀]一、背景知識??BOOT跳轉(zhuǎn)到APP,就跟我們程序里面函數(shù)調(diào)用跳轉(zhuǎn)是一樣的,并不會復位外設,需要用戶手動去操作。導致我們BOOT跳轉(zhuǎn)APP經(jīng)常會遇到這樣那樣的問題,根本原因還是BOOT跳轉(zhuǎn)前沒有提供一個干凈的環(huán)境給APP運行,這個環(huán)境如果可以達到和程序剛上電時的狀態(tài)是最好的。??...
一、背景知識
BOOT跳轉(zhuǎn)到APP,就跟我們程序里面函數(shù)調(diào)用跳轉(zhuǎn)是一樣的,并不會復位外設,需要用戶手動去操作。導致我們BOOT跳轉(zhuǎn)APP經(jīng)常會遇到這樣那樣的問題,根本原因還是BOOT跳轉(zhuǎn)前沒有提供一個干凈的環(huán)境給APP運行,這個環(huán)境如果可以達到和程序剛上電時的狀態(tài)是最好的。
一般情況下,大家的跳轉(zhuǎn)程序是下面這種玩法,各種倒騰中斷,外設復位等,哪個遺漏了,在APP里面都會有意想不到的效果。
二、解決辦法
我們跳轉(zhuǎn)前,人為的做一個跳轉(zhuǎn)操作,提供一個干凈的運行環(huán)境,思路框圖如下:
框圖含義:我們的正常BOOT里面有各種操作,跳轉(zhuǎn)前逐個復位太繁瑣,經(jīng)常會有各種遺漏沒考慮到,特別是BOOT里面用到了,APP也用到的外設。
那么我們就可以人為的執(zhí)行一個軟件復位,復位后直接跳轉(zhuǎn)到APP即可,這里就有一個核心,就是我們要設置一個不被編譯器初始化的變量,我們可以BOOT和APP里面都使用。
(1)MDK AC5設置:
AC5設置設置最簡單,定義下即可:
uint32_t g_JumpInit __attribute__((at(0x20000000), zero_init));
(2)MDK AC6設置:
定義如下:
uint32_t g_JumpInit __attribute__( ( section( ".bss.NoInit"))); 分散加載設置,定義一個占用4字節(jié)大小的.bss.NoInit分段。
(3)IAR設置:
定義如下:
#pragma location = ".NoInit" uint32_t g_JumpInit; 分享加載設置,定義一個占用4字節(jié)大小的.noinit 分段(實際上下面的定義是占用了5個字節(jié))。
三、視頻講解說明
配套的例子點擊本帖末尾閱讀原文可下載,視頻講解說明如下:
本站聲明: 本文章由作者或相關機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。