www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] 最近在調(diào)試2410的過程中,經(jīng)常出現(xiàn)程序跑飛的現(xiàn)象,跟蹤進(jìn)行后發(fā)現(xiàn)。。。所以決定把它記錄下來。現(xiàn)象:調(diào)試用的是技創(chuàng)ARM仿真器(兼容multi-ICE)和ADS1.2,板子外擴(kuò)NandFLASH(裝有Bootload)和SDRAM。

最近在調(diào)試2410的過程中,經(jīng)常出現(xiàn)程序跑飛的現(xiàn)象,跟蹤進(jìn)行后發(fā)現(xiàn)。。。所以決定把它記錄下來。
現(xiàn)象:
調(diào)試用的是技創(chuàng)ARM仿真器(兼容multi-ICE)和ADS1.2,板子外擴(kuò)NandFLASH(裝有Bootload)和SDRAM。當(dāng)將程序燒到FLASH運(yùn)行時(shí)會出現(xiàn)無規(guī)律的死機(jī)。用仿真器仿真時(shí)情況是這樣:當(dāng)CPU復(fù)位后,第一次裝載程序執(zhí)行時(shí),情況與燒到FLASH運(yùn)行時(shí)一樣。但如果將運(yùn)行的程序停下來(無論有無跑飛情況下),再重新裝載(CPU復(fù)位后第二次及以后裝載)時(shí),運(yùn)行到下述程序中的“msr cpsr_cxsf,r1”就跑飛。
bic r0,r0,#MODEMASK | NOINT ;IRQ、FIQ位清0
orr r1,r0,#SVCMODE
msr cpsr_cxsf,r1 ;SVCMode ;充許中斷后,使程序跑飛
ldr sp,=SVCStack
過程:
上面是啟動(dòng)代碼中初始化堆棧處的程序,就是這里允許了中斷后,產(chǎn)生中斷才使程序跑飛的。打開MEMORY窗口,查看各中斷掛起寄存器,發(fā)現(xiàn)有定時(shí)器等中斷請求,此時(shí)我直接在MEMORY窗口中給該標(biāo)志位寫“1”清除它們,INTPEND中的能清除,SRCPND清不掉,奇怪?原來目標(biāo)CPU的定時(shí)器還在不停的運(yùn)行著呢(習(xí)慣了51仿真的同志要注意這一點(diǎn),哈哈!包括我)!剛一清除,又立即溢出了,盡管正處在停止運(yùn)行的仿真狀態(tài)?,F(xiàn)在可以解釋為什么CPU復(fù)位后第一次裝載運(yùn)行不會使程序跑飛了,因?yàn)閺?fù)位后,各寄存器都變成初始態(tài),定時(shí)器也還沒有開啟,所以也就不會觸發(fā)中斷。而當(dāng)開啟了定時(shí)器后,再裝載程序時(shí),定時(shí)器已經(jīng)溢出,觸發(fā)了中斷。那么為何一進(jìn)中斷就會使程序跑飛呢?于是就在命令窗口中輸入br 0x18,再執(zhí)行程序,原來IRQ中斷入口0x18的內(nèi)容已從原先的0xea000047被改成了0x6b736564,反匯編代碼如下:
00000018 [0x6b736564] * blvs 0x1cd95b0
CPU復(fù)位后的代碼如下:
00000018 [0xea000047] * b 0x13c
啊!這怎么能被改掉!這不是NandFLASH的內(nèi)容嗎?接著我就用MEMORY窗口觀察該處,再單步執(zhí)行我的程序,果然跟蹤到了修改該處的程序,可是沒有寫NandFLASH的操作,源程序如下:
typedef struct software_config_system
{
int software_flag;
CHAR curfont[20];
。。。。。。
} software_config, *s_config; //定義數(shù)據(jù)結(jié)構(gòu)及其指針

unsignedCHAR InitsoftDescription(void)
{
if (s_config->software_flag != 0x2)
{
s_config->software_flag = 0x2; //給指針指向的地址處賦值
memcpy(s_config->curfont, "hanzi", 5);
。。。。。。
}
}
原來是定義了一個(gè)全局的結(jié)構(gòu)指針變量(s_config),由于沒有對它進(jìn)行賦值,而它默認(rèn)的初始值為0,所以對他進(jìn)行讀寫,也就對0x0開始處的地址進(jìn)行讀寫。而且此時(shí)這段區(qū)間的NANDFLASH已被映射成Boot internelSRAM了,所以可以隨機(jī)讀寫(這點(diǎn)一定要注意)。
總結(jié):
1.在仿真情況下(即使停止程序的運(yùn)行),目標(biāo)CPU的各外圍還是在工作的,如定時(shí)器等。
2.當(dāng)將系統(tǒng)設(shè)計(jì)成NANDFLASH啟動(dòng)時(shí),0x0開始處的4K地址空間已是CPU的內(nèi)部SRAM了,可以像其它RAM一樣隨意讀寫,此時(shí)定義全局的指針變量時(shí),一定要記得賦值,否則就會修改這部分的代碼。
3.在用仿真器仿真時(shí),可以在初始化堆棧的前面加一些關(guān)閉定時(shí)器及清中斷標(biāo)志等代碼,以免在沒有復(fù)位CPU的情況下,程序還沒執(zhí)行到main函數(shù)就頻繁產(chǎn)生中斷。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在這篇文章中,小編將對PLC的相關(guān)內(nèi)容和情況加以介紹以幫助大家增進(jìn)對它的了解程度,和小編一起來閱讀以下內(nèi)容吧。

關(guān)鍵字: PLC 模塊化 程序

ARM系統(tǒng)幾乎都采用Linux的操作系統(tǒng),而且?guī)缀跛械挠布到y(tǒng)都要單獨(dú)構(gòu)建自己的系統(tǒng),與其他系統(tǒng)不能兼容,這也導(dǎo)致其應(yīng)用軟件不能方便移植,這一點(diǎn)一直嚴(yán)重制約了ARM系統(tǒng)的發(fā)展和應(yīng)用。GOOGLE開發(fā)了開放式的Andro...

關(guān)鍵字: Linux x86 ARM

隨著計(jì)算需求的多樣化,尤其是隨著移動(dòng)設(shè)備、嵌入式系統(tǒng)和云計(jì)算的興起,ARM 和 x86 架構(gòu)之間的爭論變得更加突出。ARM(高級 RISC 機(jī)器)和 x86 代表兩種不同類型的處理器架構(gòu),每種架構(gòu)都針對不同的工作負(fù)載和用...

關(guān)鍵字: Linux x86 ARM

從畫質(zhì)優(yōu)化 (NSS) 到幀率提升 (NFRU) 和光線追蹤(NSSD),Arm 計(jì)劃覆蓋移動(dòng)端圖形處理的多個(gè)維度,推動(dòng)邊緣 AI 圖形革命。而未來通過持續(xù)的技術(shù)迭代,Arm也將保持在移動(dòng)計(jì)算領(lǐng)域的技術(shù)領(lǐng)先,滿足手游、A...

關(guān)鍵字: ARM 神經(jīng)圖形技術(shù) GPU AI ML

7月31日消息,據(jù)媒體報(bào)道,芯片架構(gòu)提供商Arm Holdings首席執(zhí)行官Rene Haas宣布,公司正加大投入開發(fā)自有芯片產(chǎn)品,此舉標(biāo)志著其從傳統(tǒng)IP授權(quán)模式向提供實(shí)體芯片的戰(zhàn)略重大轉(zhuǎn)變。

關(guān)鍵字: ARM META

7月28日消息,2025年,中國AI硬件市場規(guī)模將首次突破萬億元大關(guān)。

關(guān)鍵字: AI ARM
關(guān)閉