作者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