|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
是bug嗎,OS_EXIT_CRITICAL()被ADS錯誤編譯成兩條語句 |
| 作者:碧水長天 欄目:ARM技術(shù) |
本來,OS_EXIT_CRITICAL()應(yīng)被編譯成一條 BL ARMEnableInt語句,但是在OSSchedLock函數(shù)中卻不是這樣的,請看如下的反匯編代碼: void OSSchedLock(void) { [0xe92d401] stmfd r13!,{r4,r14} if (OSRunning ==TRUE){ [0xe59f4490] ldr r4,0x0c001874 [0xe5d40006] ldrb r0,[r4,#6] [0xe3500001] cmp r0,#1 [0x1a000007] bne 0xc00140c OS_ENTER_CRITICAL(); [0xeb000faa] bl ARMDisableInt if(OSLockNesting < 255){ [0xe5d40002] ldrb r0,[r4,#2] [0xe35000ff] cmp r0,#0xff [0x2a000001] bcs 0xc001404 ;(OSSchedLock + 0x2c) OSLockNesting ++; [0xe2800001] add r0,r0,#1 [0xe5c40002] strb r0,[r4,#2] OS_EXIT_CRITICAL(); ;請看這里!!!!!!!!!!! [0xe8bd4010] ldmfd r13!,{r4,r14} ;竟然不是bl ARMEnableInt!!! [0xea000fa8] b ARMEnableInt ; } } [0xe8bd8010] ldmfd r13!{r4,pc} ;OSSchedLock函數(shù)返回 編譯器將此處的OS_EXIT_CRITICAL()函數(shù)編譯成了兩條匯編語句,而我在調(diào)試時,其他的恢復(fù)cpsr是的 OS_EXIT_CRITICAL()函數(shù)只匯編成一條 bl ARMEnableInt指令(這個是符合程序的正常狀態(tài)的) 正是此處的 ldmfd r13!,{r4,r14}指令使得r13被改變(但觀察時發(fā)現(xiàn)r13從調(diào)用前的0x0x500ff8竟變成了0x0c501000!),因此cpsr恢復(fù)錯誤,導(dǎo)致ARM的工作模式從SVC意外變成了USR態(tài),使得程序出現(xiàn)異常。 有高手能解釋一下這個現(xiàn)象么,謝謝。 |
| 2樓: | >>參與討論 |
| 作者: 深思 于 2005/11/15 9:08:00 發(fā)布:
這是 ADS 優(yōu)化的結(jié)果,你修改優(yōu)化級別即可。 DEBUG/OPTION 中,選擇BEST DEBUG。。。 ADS 的C編譯器文檔中有說明的,CPSR不能修改,所以編譯器就給優(yōu)化了,最好的解決辦法是用SWI, |
|
| 3樓: | >>參與討論 |
| 作者: 碧水長天 于 2005/11/15 21:01:00 發(fā)布:
非常感謝深思大俠 我裝的D版ADS沒有幫助文檔,這個問題困擾我兩天了,再次感謝你的指點,祝你工作順利! |
|
| 4樓: | >>參與討論 |
| 作者: 深思 于 2005/11/16 8:55:00 發(fā)布:
自己到 ADS 安裝目錄下找,有的,只是ADS找不到而已,呵呵 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |