隨著電子技術(shù)的發(fā)展,客戶對嵌入式產(chǎn)品的期望也越來越高,對應(yīng)的嵌入式產(chǎn)品功能越來越豐富,里面包含的代碼也越來越復(fù)雜。很多時(shí)候很難把所有功能都實(shí)現(xiàn)之后再進(jìn)行測試驗(yàn)證,而是階段性的開發(fā)對應(yīng)的功能,然后進(jìn)行測試驗(yàn)證。為了能夠升級對應(yīng)MCU里面包含的Application,越來越多的的嵌入式產(chǎn)品會(huì)包含Bootloader進(jìn)行Application升級:修改之前的Bug和添加新的功能實(shí)現(xiàn)。
本文主要介紹IAR Embedded Workbench中的一些相關(guān)特性,幫助開發(fā)人員進(jìn)行Bootloader和Application聯(lián)合開發(fā)和調(diào)試。
一個(gè)Workspace同時(shí)包含Bootloader和Application工程
通常來說,Bootloader和Application需要單獨(dú)建立工程,在IAR Embedded Workbench中,可以在一個(gè)Workspace里面同時(shí)包含Bootloader和Application的工程:
將變量放置到指定的地址
在IAR Embedded Workbench中,開發(fā)人員可以很方便的將變量放置到指定的地址:
·#pragma location ·@
在Bootloader和Application中,需要通過共享變量進(jìn)行交互(比如Bootloader傳給Application的MCU復(fù)位原因,Application傳給Bootloader的升級請求等),這些共享變量需要放置到指定的位置。
下面通過一個(gè)簡單的例子來說明利用#pragma location和@將變量放置到指定的地址:
/* Shared variables between Bootloader and Application */ #pragma location = 0x2001FFF8 static uint32_t UpdateRequest; //#pragma location = 0x2001FFFC static uint32_t McuResetReason @0x2001FFFC;
Build之后在生成的map文件中查看,對應(yīng)的變量會(huì)被放置到指定的地址:
UpdateRequest 0x2001'fff8 0x4 Data Lc main.o [3] McuResetReason 0x2001'fffc 0x4 Data Lc main.o [3]
聲明變量不初始化
在IAR Embedded Workbench中,開發(fā)人員可以很方便的使用關(guān)鍵字__no_init將變量聲明為不初始化。
在Bootloader和Application中,有些變量是不能進(jìn)行初始化的,比如Bootloader傳給Application的MCU復(fù)位原因變量不能在Application中初始化,而Application傳給Bootloader的升級請求變量不能在Bootloader中初始化。
下面是在Bootloader中聲明Application傳給Bootloader的升級請求變量UpdateRequest不初始化:
/* Shared variables between Bootloader and Application */ #pragma location = 0x2001FFF8 __no_init static uint32_t UpdateRequest; //#pragma location = 0x2001FFFC static uint32_t McuResetReason @0x2001FFFC;
Build之后在生成的map文件中查看,對應(yīng)的變量類型是uninit
Absolute sections, part 1 of 2: 0x4 .noinit uninit 0x2001'fff8 0x4 main.o [3] - 0x2001'fffc 0x4 Absolute sections, part 2 of 2: 0x4 .bss zero 0x2001'fffc 0x4 main.o [3] - 0x2002'0000 0x4計(jì)算Application Checksum并在Bootloader中校驗(yàn)
在Bootloader跳轉(zhuǎn)到Application之前,需要計(jì)算Application對應(yīng)的校驗(yàn)碼并和之前存取在Application的校驗(yàn)碼進(jìn)行比較,確保Application是完整的。
在IAR Embedded Workbench中內(nèi)嵌了ielftool,可以在Link的時(shí)候生成對應(yīng)代碼區(qū)域的校驗(yàn)碼并存儲(chǔ)在指定的地址:
在Application ICF中把計(jì)算出的checksum放到對應(yīng)的地址:
place at address mem: 0x080FFFFC { section .checksum };
在Bootloader ICF中定義(define)并導(dǎo)出(exported)Application Checksum計(jì)算相關(guān)的信息:開始地址,結(jié)束地址以及存放對應(yīng)checksum的地址:
define symbol __ICFEDIT_region_FLASH_start__ = 0x08000000; define symbol __ICFEDIT_region_FLASH_end__ = 0x08003FFF; define exported symbol APPROM_start = 0x08004000; define exported symbol CHECKSUM_start = 0x08004000; define exported symbol CHECKSUM_end = 0x080FFFFB; define exported symbol CHECKSUM_address = 0x080FFFFC; define symbol APPROM_end = 0x080FFFFF;
在Bootloader 程序中計(jì)算對應(yīng)Application的checksum并和之前存放的checksum進(jìn)行比較:
extern uint32_t CHECKSUM_start; extern uint32_t CHECKSUM_end; extern uint32_t CHECKSUM_address; /* Resets the CRC calculation unit */ CRC->CR = 0x01; /* Calculate the code flash checksum using CRC calculation unit */ CrcValue = HAL_CRC_Accumulate(&hcrc, (uint32_t *)&CHECKSUM_start, (((uint32_t)&CHECKSUM_end - (uint32_t)&CHECKSUM_start + 1u)/4u)); /* Compare the calculated checksum with the previously stored checksum */ /* Only jump to Applicstion when the checksum is the same */ if(*((uint32_t *)&CHECKSUM_address) == CrcValue)
單獨(dú)調(diào)試Application
在IAR Embedded Workbench中調(diào)試時(shí),下載完成之后調(diào)試器會(huì)把PC設(shè)置為對應(yīng)應(yīng)用程序的起始地址(軟復(fù)位),這樣可以在沒有Bootloader的情況下,單獨(dú)調(diào)試Application。
注意:需要在Application初始化的時(shí)候把中斷向量重定向到Application的中斷向量表。
聯(lián)合調(diào)試Bootloader和Application
在開發(fā)Bootloader和Application時(shí),最后需要聯(lián)合調(diào)試,確保程序可以在Bootloader和Application正常跳轉(zhuǎn)。
IAR Embedded Workbench提供非常方便的功能幫助開發(fā)人員聯(lián)合調(diào)試Bootloader和Application。
通常來說Bootloader和Application的代碼放置到不同的Flash區(qū)域,可以單獨(dú)下載(下載Bootloader的時(shí)候不會(huì)影響Application,同理,下載Application的時(shí)候不會(huì)影響B(tài)ootloader)。當(dāng)然,也可以一起下載??梢宰孡inker在Bootloader中包含Application,或者Application中包含Bootloader(注意,不能同時(shí),否則會(huì)重復(fù)包含)。
下面以Application中包含Bootloader為例。在Project > Options > Linker > Input中輸入BOOT,并選擇對應(yīng)的Bootloader.bin文件:
在Application的ICF文件中,把Bootloader放到對應(yīng)的Flash區(qū)域:
define exported symbol boot_vector = 0x08000000; place at address mem: boot_vector { readonly section .BOOT };
這樣Bootloader就會(huì)包含在Application中:
Section Kind Address Size Object ------- ---- ------- ---- ------ "A2": 0x18b8 .BOOT const 0x800'0000 0x18b8 Bootloader.bin [1] - 0x800'18b8 0x18b8 "A0": 0x188 .intvec ro code 0x800'4000 0x188 startup_stm32f405xx.o [3] - 0x800'4188 0x188 "P1": 0x78fc .text ro code 0x800'4188 0xf12 xprintffull_nomb.o [7] .text ro code 0x800'509a 0x2a copy_init3.o [9] .text ro code 0x800'50c4 0x16 strchr.o [9] .text ro code 0x800'50dc 0x40 xfail_s.o [7] .text ro code 0x800'511c 0x36 strlen.o [9] .text ro code 0x800'5154 0x58 memchr.o [9]
調(diào)試時(shí),可以在Bootloader工程中加載Application的調(diào)試信息,也可以在Application工程中加載Bootloader的調(diào)試信息,從而實(shí)現(xiàn)Bootloader和Application聯(lián)合調(diào)試。
下面以Application工程師中包含Bootloader調(diào)試為例。在Project > Options > Debugger > Images中勾選“Download extra image”和“Debug info only”,并選擇對應(yīng)的Bootloader.out文件:
同時(shí)由于Bootloader和Application都包含__vector_table,需要在Project > Options > Debugger > Extra Option中輸入對應(yīng)的命令:--drv_vector_table_base=0x08000000(0x08000000是Bootloader的__vector_table地址)。這樣調(diào)試時(shí)調(diào)試器會(huì)使用Bootloader的__vector_table:
注意:不要勾選Project > Options > Debugger > Setup中的Run to main選項(xiàng),這樣調(diào)試的時(shí)候,下載完成之后調(diào)試器會(huì)讓程序停在對應(yīng)的入口地址,而不是main函數(shù):
這樣調(diào)試的時(shí)候,調(diào)試器會(huì)指向Bootloader的入口地址,通過View > Images打開對應(yīng)的Images窗口,里面會(huì)顯示Bootloader和Application的調(diào)試信息:
總結(jié)
本文主要介紹了IAR Embedded Workbench中的一些相關(guān)特性,幫助開發(fā)人員進(jìn)行Bootloader和Application聯(lián)合開發(fā)和調(diào)試。
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304793 -
IAR
+關(guān)注
關(guān)注
5文章
350瀏覽量
36664 -
工程
+關(guān)注
關(guān)注
0文章
165瀏覽量
27858
原文標(biāo)題:在IAR Embedded Workbench中進(jìn)行Bootloader和Application聯(lián)合開發(fā)和調(diào)試
文章出處:【微信號:IAR愛亞系統(tǒng),微信公眾號:IAR愛亞系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論