IAP和USER程序之間除LD文件修改外,還有什么地方要修改的嗎?

目前我們是使用兩款MCU,CH32V307RTC6? 和 CH32V203C8T6。
都在研究如何實(shí)現(xiàn)遠(yuǎn)程升級(jí),剛開始開發(fā),還沒有完全弄明白。

計(jì)劃是如此:
CH32V307RTC6 - 通過網(wǎng)絡(luò)下載

CH32V203C8T6 - 通過串口下載

思路:1)先把生成的bin文件,在User系統(tǒng)下分塊下載放至儲(chǔ)存區(qū)(user2),每塊CRC檢驗(yàn)
? ? ? ? ?2)然后寫入升級(jí)標(biāo)識(shí),通過

????//soft - 0x00 run t0 BootLoader

????NVIC_SystemReset();


? ? ? ? ?3)在boot狀態(tài)把 儲(chǔ)存區(qū)的 user2 復(fù)制至 運(yùn)行區(qū)(User1)
? ? ? ? ?4)通過下面的代碼跳至 User1 區(qū)啟動(dòng)

? ??????????// 進(jìn) 機(jī)器模式 跳轉(zhuǎn)到 0x5000;

? ? ????????NVIC_EnableIRQ(Software_IRQn);

? ? ????????NVIC_SetPendingIRQ(Software_IRQn);


有3點(diǎn)疑問:

IPA的LD文件的設(shè)置如此的:
MEMORY

{

????FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 20K

????RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K

}


USER的LD文件的設(shè)置如此的:

MEMORY

{

????FLASH (rx) : ORIGIN = 0x00005000, LENGTH = 44K

????RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K

}


但在DEMO文件內(nèi),描述寫入地址分別是

/*@Note

?*bootloader:0x08000000 - 0x08005000? 20K

?*UserCode:? 0x08005000 - 0x08010000? 44K

?*

?*/

----------------------------------
疑問1:USER的起始位置: LD文件的是寫 0x00050000,但DEMO代碼是0x08005000,兩者為什么不一樣的?
疑問2:除LD的文件配置寫入位置偏移外,還有哪些地方配置才能區(qū)分 IAP 和 user 的兩個(gè)啟動(dòng)入口?
? ? ? ? ? ?就是它怎么知道?
? ? ? ? ? ? ? ?通過?NVIC_SystemReset() 是進(jìn)入 boot 區(qū)
? ? ? ? ? ? ? ?通過?NVIC_EnableIRQ 和?NVIC_SetPendingIRQ 就是進(jìn)入user 區(qū)。
? ? ? ? ? ?DEMO說(shuō)的注釋【進(jìn) 機(jī)器模式 跳轉(zhuǎn)到 0x5000】,除了LD設(shè)備外,哪個(gè)還要修改?

疑問3:通過MounRiver生成的BIN文件,可以直接下載后,直接寫入user區(qū),然后啟動(dòng)嗎? 中間需要做什么轉(zhuǎn)換不?


您好,關(guān)于你的問題:

(1)關(guān)于ld文件中FLASH0x000050000x08005000是一樣的,硬件做了00x08000000的映射。

(2)關(guān)于IAP升級(jí),首先你的代碼區(qū)域會(huì)被分成兩個(gè)空間,從0地址開始的那段空間存放IAP的代碼,后面那段空間存放APP代碼,上電后會(huì)直接運(yùn)行IAP的代碼,根據(jù)你在程序中所設(shè)定的條件進(jìn)行升級(jí)或跳轉(zhuǎn)到APP,因此無(wú)論復(fù)位或上電都會(huì)先運(yùn)行IAP代碼。此外,關(guān)于通過NVIC_EnableIRQ ?NVIC_SetPendingIRQ 就是進(jìn)入user 區(qū),這兩個(gè)函數(shù)分別是開啟軟件中斷和掛起,然后就會(huì)觸發(fā)進(jìn)入中斷函數(shù),如下圖,中斷函數(shù)中會(huì)進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)到用戶區(qū)。

image.png

關(guān)于你所說(shuō)的機(jī)器模式,我們目前EVT提供的IAP例程都是在用戶模式下即可實(shí)現(xiàn),若需要進(jìn)入機(jī)器模式,在啟動(dòng)文件中修改mstatus的值即可,比如將6088改為7888,關(guān)于mstatus寄存器的介紹,可參考內(nèi)核手冊(cè),直接在我司官網(wǎng)搜索qingke即可下載

image.png

(3)關(guān)于下載升級(jí)流程,一般是先下載IAP程序,然后通過IAP升級(jí)的方式下載APP程序,我們EVT IAP文件夾下有對(duì)應(yīng)IAP流程講解,如下圖,可以看一下

image.png

后續(xù)若有問題,可通過郵箱(lzs@wch.cn)和我溝通


@TECH62


解析得很清楚。非常感謝!

還有個(gè)疑問:
以CH32V307RCT6 (FLASH - 256K)為例,LD文件配置

IAP:

MEMORY

{

? ? FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 256K

? ? RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K

}


USER:

MEMORY

{

? ? FLASH (rx) : ORIGIN = 0x00005000, LENGTH = 256K

? ? RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K

}


把FLASH分成三大部分:
[0 - 0x00005000] - IAP區(qū)
[0x00005000 - 0x00020000] - 用戶運(yùn)行代碼區(qū)(user1)
[0x00020000 - ] - 臨時(shí)升級(jí)文件儲(chǔ)存區(qū)(user2)


升級(jí)原理:
在用戶(user1)運(yùn)行狀態(tài),先下載至第三個(gè)區(qū)(user2),校驗(yàn)完成后,再切入 boot 狀態(tài),先把 user1區(qū) 擦掉,再把 user2區(qū) 復(fù)制至 user1區(qū),并進(jìn)行校驗(yàn)。通過后,軟重啟過入 user1區(qū) 啟動(dòng)。

疑問1:上面這個(gè)分區(qū)是否合理?目前IPA編譯后大小是15K左右, USER編譯后58K左右。
疑問2:這個(gè)升級(jí)原理是否合理?
疑問3:在通過 MouseRiver (hex文件方式) 或 官方的離線燒錄器(bin文件方式),燒錄寫入IAP程序時(shí),會(huì)把其它兩個(gè)區(qū)都擦掉嗎?


您好,先說(shuō)一下我對(duì)你這流程的理解:

按照我的理解,你的意思是將FLASH分為3個(gè)區(qū)域(flash1,flash2,flash3),首先將IAP升級(jí)代碼下載到flash1,然后通過IAP升級(jí)的方式將用戶代碼下載到flash3并進(jìn)行校驗(yàn),若檢驗(yàn)沒問題,再次將程序搬運(yùn)到flash2區(qū)域。

關(guān)于你這個(gè)流程,可以理解為需要進(jìn)行兩次IAP,且每次IAP跳轉(zhuǎn)的地址是不一樣的,該功能理論應(yīng)該是可以實(shí)現(xiàn)的,但沒有這么操作過,不懂為何要這么操作,因?yàn)檎T谶M(jìn)行IAP的時(shí)候,寫入完成之后通常都會(huì)進(jìn)行校驗(yàn)的,一次就可以了。

關(guān)于你的問題:

1、若你IAP固件大小為15K,APP大小為58K,這分區(qū)是沒問題的,0x5000大小為20K,0x20000大小是128K,是可以容納你的固件的;

2、關(guān)于升級(jí)原理,具有操作可行性,但個(gè)人感覺沒必要這么操作,若是我的理解有問題,你可以通過郵箱和我溝通說(shuō)明一下;

3、關(guān)于燒寫流程,就上我上面說(shuō)的那樣,正常你應(yīng)該先下載IAP程序,然后通過IAP去進(jìn)行升級(jí),而不是都通過MRS去下載,目前MRS不支持修改地址下載,若你要通過MRS下載,需要進(jìn)調(diào)試模式且需要進(jìn)行一些修改,建議你直接通過IAP升級(jí)的方式。

以上是我的理解和對(duì)你問題的回答,若理解有誤或后續(xù)若有相關(guān)問題,可通過郵箱(lzs@wch.cn)和我溝通



關(guān)于為什么分成三個(gè)區(qū),目前是這樣想的:

flash1:僅有一個(gè)檢測(cè)是否需要升級(jí)的邏輯,如果有,就從flash3搬至flash2,不含網(wǎng)絡(luò)連接、下載bin文件等邏輯。
flash2:放平時(shí)的運(yùn)行代碼,包含連網(wǎng)、業(yè)務(wù)邏輯、以及下載bin文件,并放在flash3區(qū)。
flash3:僅是臨時(shí)放遠(yuǎn)程升級(jí)包

flash2的代碼是正在運(yùn)行中的,應(yīng)該不能一邊運(yùn)行自己一邊下載并覆蓋自己吧?(我理解是不可以的)
另外,不太想在IAP里面實(shí)現(xiàn)下載的邏輯,所以就是flash2里面實(shí)現(xiàn)升級(jí)下載bin的邏輯。

-------------------
我以為有兩種網(wǎng)絡(luò)遠(yuǎn)程升級(jí)的方式,是這樣?
1、在flash2中實(shí)現(xiàn)下載代碼,在提供業(yè)務(wù)服務(wù)的同時(shí),下載升級(jí)bin文件并臨時(shí)儲(chǔ)存至flash3,校驗(yàn)完成后,重啟進(jìn)入flash1,把flash3搬到flash2。
2、從flash2遠(yuǎn)程重啟至flash1,由flash1的代碼實(shí)現(xiàn)下載,校驗(yàn)完成后,引導(dǎo)至flash2 (不存在flash3)


您好,按照你的描述,我的理解是:

flash1:里面程序僅僅用作判斷,產(chǎn)生判斷標(biāo)志以表示是否升級(jí);

flash2:存放了IAP程序+APP程序,根據(jù)flash1產(chǎn)生的判斷標(biāo)志判斷是運(yùn)行APP還是IAP;

flash3:存放了待升級(jí)的APP程序

首先關(guān)于你上面這個(gè)邏輯,若flash3僅用于存放待升級(jí)固件,那么升級(jí)寫入的時(shí)候?qū)懭氲腁PP存放于哪個(gè)區(qū)域呢?操作邏輯肯定是不能一邊運(yùn)行一邊覆蓋自己的,只能另外有一個(gè)單獨(dú)的空間。此外,若要進(jìn)行IAP升級(jí),沒必要預(yù)先將固件存放在flash3,你在遠(yuǎn)程進(jìn)行IAP升級(jí)時(shí)將所需的固件數(shù)據(jù)傳輸過來(lái)寫入到某個(gè)區(qū)域就好了,感覺你把這流程搞的有點(diǎn)復(fù)雜了,而且IAP程序一般和APP程序都是單獨(dú)放的。按照你的邏輯,那flash2應(yīng)該也要被分為兩個(gè)區(qū)域,IAP(包含IAP和的APP)一個(gè)區(qū)域,APP(存放升級(jí)后的flash3中的固件)一個(gè)區(qū)域。建議你可以去具體了解一下IAP升級(jí)的整個(gè)過程,然后再考慮一下是否用這種方式,可能是我對(duì)于具體產(chǎn)品應(yīng)用了解較少,不太明白你這種方式的意圖,但我目前遇到使用IAP升級(jí)方式的一般都是前面所說(shuō)過的那種思路。關(guān)于判斷標(biāo)志以及IAP,完全可以放在一個(gè)程序里,我們EVT例程就是,比如通過按鍵是否按下判斷是否要進(jìn)行升級(jí),若按鍵按下,則進(jìn)行升級(jí),沒有按下,則直接跳轉(zhuǎn)到APP運(yùn)行,很簡(jiǎn)單的一步程序。若要進(jìn)行IAP升級(jí),比如通過串口,將固件通過上位機(jī)傳輸給單片機(jī),在IAP程序中進(jìn)行寫入編程操作,將APP固件寫入到指定區(qū)域即可,在寫入完成后,可通過讀取flash地址數(shù)據(jù)進(jìn)行校驗(yàn),一個(gè)IAP,沒必要搞的那么復(fù)雜。




非常感謝耐心回復(fù),我自行先梳理一下。

現(xiàn)在遇到IAP程序無(wú)法跳至 0x5000 (sw_handler沒有被調(diào)用),要先解決此問題


您好,無(wú)法跳轉(zhuǎn)問題參考該帖回復(fù)

http://m.findthetime.net/bbs/thread-107982-1.html

?



只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频