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