作者ihady (艾和狄)
看板ASM
標題[問題] keil code於main()之前偷跑
時間Wed Jan 4 19:28:24 2012
各位大大好,是這樣的,
我目前一個「測試watchdog」且「紀錄於外部記憶體」的程式
由於watchdog會測到reset,因此我用外部記憶體紀錄,現在跑到哪一步驟
但keil在編譯、download過程中,似乎會偷偷去執行某一部份程式碼
每次ctrl+f5編譯完進入debug模式時,外部記憶體已然動過了
很明顯是被我寫的程式給動過,且動到一半就跳出,跳到main()去的樣
run to main()選項有沒有勾選,都會有這樣的情形發生
細節:外部記憶體主要兩區:password與step
password正確就代表測試程式執行中,step代表測試到第幾步
password不正確,就會輸入password且把step歸1
每次ctrl+f5編譯完,password已經紀錄了,
但step跑到5、6步,紀錄的結果也是充滿錯誤。
此時讓程式由main()開始跑就一定得不到正確結果。
當然手動把pass跟step歸零、讓程式從main()跑到尾會是正確的
這樣會導致我寫的程式執行錯誤
請問有沒有方法可以解決呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.32.216.166
1F:→ ksmrt0123:看不太懂細節, 不過keil在main()之前會改到xdata應該是 01/05 18:02
2F:→ ksmrt0123:(1)正常變數初始化, 如 char c = 'a'; 或是 01/05 18:04
3F:→ ksmrt0123:(2) startup.a51 中設定將xdata變數清為0 01/05 18:06
4F:→ ksmrt0123:進debug mode後, 開disassembly window再按一下RST應該 01/05 18:07
5F:→ ksmrt0123:可讓PC回到C:0x0000, 再single step慢慢看就可看到到底 01/05 18:09
6F:→ ksmrt0123:是那邊改到 01/05 18:09
感謝k大的賜教,不過似乎不是這樣的問題,startup.a51我沒有去動過
也沒有初始化數值。
一進入debug模式時,還沒讓他跑,
程式的前半段已經不知在何時跑過,但程式的後半段沒有跑
deubg的指標是指向程式的最前端main()的部份
由於我寫的程式有關於reset的設計,他如果跑到一半,斷掉從頭跑
那我程式從頭開始執行,會跳到後半段開始跑,而不會整個從頭跑,因而出錯
我的問題是:「為什麼ctrl+f5進入debug模式,還沒讓程式開始跑時,
程式的前半段已經被偷偷執行過了呢?」
希望這樣講得比較有條理,希望能得到解答!
※ 編輯: ihady 來自: 114.32.216.166 (01/06 16:13)
7F:推 ksmrt0123:進debug mode後按一下RST (Peripherals下的Reset CPU) 01/06 18:27
8F:→ ksmrt0123:應可讓PC(你說的deubg的指標)回到 C:0x0000, 01/06 18:28
9F:→ ksmrt0123:然後再single step就可看到執行到main()前發生了什麼事 01/06 18:29
10F:→ ihady:是的k大,但指標指向0x000前、deubg前、程式執行前, 01/06 18:35
11F:→ ihady:ex-memory已經是被前半段程式執行過的樣子了@@ 01/06 18:35
12F:→ ihady:而debug模式下,一行一行跑的程式,功能沒有問題 01/06 18:36
13F:推 ksmrt0123:keil不會無緣無故把xdata填成前半段程式執行過的樣子 01/08 01:58
14F:→ ksmrt0123:不是程式初始化就是那樣, 不然就是程式執行過 01/08 01:59
15F:→ ksmrt0123:你可試reset後手動把xdata相關部分全填成0 01/08 02:00
16F:→ ksmrt0123:然後讓程式執行到main()的開頭看看xdata有沒有變化 01/08 02:02
17F:→ ksmrt0123:有的話就是程式(變數)初始化做的 01/08 02:02