飛思卡爾單片機(jī)RAM與flash相關(guān)問(wèn)題
最近在做飛思卡爾16位單片機(jī)的在線升級(jí)bootloader程序。有2個(gè)問(wèn)題不太清楚,請(qǐng)教下論壇里的高人。
1.bootloader程序中,對(duì)存放應(yīng)用程序的flash空間進(jìn)行擦除和寫入新的應(yīng)用程序以完成升級(jí)。比較特別的是,需要將flash操作代碼拷貝到ram中執(zhí)行,這是為什么?bootloader程序所在flash空間設(shè)置為被保護(hù)狀態(tài),不會(huì)誤擦除,而且運(yùn)行到哪個(gè)函數(shù)自然會(huì)把函數(shù)壓棧到RAM里執(zhí)行吧?為什么還要特地拷貝到RAM里呢?
2.單片機(jī)上電初始化后,RAM存儲(chǔ)初始化全局變量,這些全局變量是從調(diào)試器燒進(jìn)去的S19文件中獲取的嗎?每次程序都是從bootloader的main函數(shù)開(kāi)始執(zhí)行,確定不是升級(jí)狀態(tài)后跳轉(zhuǎn)到應(yīng)用程序重映射的reset中斷向量地址(flash地址)執(zhí)行。bootloader和應(yīng)用程序中有些全局變量分配的ram重合了,有什么影響嗎?會(huì)在跳轉(zhuǎn)后重新初始化RAM嗎?
解答如下:
(1)Flash操作的那部分,也就是Flash的讀寫驅(qū)動(dòng)程序是必須放到RAM中執(zhí)行,原因是當(dāng)進(jìn)行Flash擦寫時(shí),F(xiàn)lash中的程序就不可以被執(zhí)行了,這是硬件的限制。這是Freescale單片機(jī)的情況,我不清楚其它單片機(jī)會(huì)不會(huì)有這個(gè)限制。
你說(shuō)的“運(yùn)行到哪個(gè)函數(shù)自然會(huì)把函數(shù)壓棧到RAM里執(zhí)行吧”,不可能把函數(shù)壓到堆棧里面的,只是在函數(shù)調(diào)用和函數(shù)被中斷打斷,一些寄存器和一些局部變量等會(huì)被壓倒堆棧里面。默認(rèn)情況下,16位freescale單片機(jī)在prm中配置的堆棧大小是0x100字節(jié),很多函數(shù)都要比它大。評(píng)論:程序不可能在堆棧中運(yùn)行,要運(yùn)行也只能在RAM中或者NORflash中。
(2)"單片機(jī)上電初始化后,RAM存儲(chǔ)初始化全局變量,這些全局變量是從調(diào)試器燒進(jìn)去的S19文件中獲取的嗎?"這是個(gè)很好的問(wèn)題,全局變量和靜態(tài)變量的初始化值是保存在Flash中的Const段里的,新建一個(gè)工程的時(shí)候默認(rèn)有個(gè)startup的匯編程序文件,它負(fù)責(zé)將const段中的初始值付給這些全部變量。這些事情是發(fā)生在你的main函數(shù)之前的。
(3)"bootloader和應(yīng)用程序中有些全局變量分配的ram重合了,有什么影響嗎?",沒(méi)有影響,bootloader和你的應(yīng)用程序是分時(shí)復(fù)用RAM的,上電程序就跑到bootloader,如果有合法的應(yīng)用程序就跑到應(yīng)用程序,應(yīng)用程序里面會(huì)再次初始化變量的,也就是上面2說(shuō)到的。