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