tubulvxing
发表于 2024-12-9 13:56:03
LAOXU 发表于 2024-12-9 13:42
if(admark==0X00000000)
改成 if(admark==0x00000000),试试
大小写不一样吗?不应该区分大小写吧,有什么说法
ercircle
发表于 2024-12-9 14:06:25
你还是上传下工程吧,一张图说明不了问题呀
社区闲人
发表于 2024-12-9 14:39:51
关注一下。
wlhet
发表于 2024-12-9 18:06:45
mark一下
网老四
发表于 2024-12-9 19:29:25
<p>处理器和编译器的思维都是非常固执死板的,很多时候代码其他部分bug,导致某些不可思议结果,</p>
<p>比如开了中断,但没写中断函数.......</p>
浦江一水
发表于 2024-12-9 21:18:01
根据本人的认知、体会, 扯谈几句,供楼主参考:
从STM32编译环境转场到C51或C251编译环境,也许有点不习惯的,两者功能差异很大,不能相提并论的。
KeilC编译环境,对于STC单片机而言:(印象中,从前对Intel 8051的仿真调试不是这样的)
凡是局部变量、形式参数,C251(或C51)的Debug仿真调试跟踪过程中,
设断点、鼠标悬停在变量上时,观察其数值时,一律显示0,
即不显示真实数值,即使加入Watch观察也不行。
目前就要认识和适应这样的现实了。
只有将变量设置为全局变量时, 才有可能跟踪观察其真值。
上述提到的变量,admark, 在这里不是什么全局临时变量, 而是行参,相当于局部变量, 所以别指望观察其真实的值。
这里,admark的真实值,并非是0x00000000,所以实际上是等式不成立,所以不会执行 return 0;而是运行下一句。
可以认为这是“异常”,其实并没有出错。
如果程序语法和逻辑都不错的话,尽管跟踪观察不到其真实的值,但运行还是正常的,效果还是正确的。
有句话说,三分编程,七分调试。可见这“调试”充满着技巧和智慧的。
如何应对这样的现实呢?
有两种办法:一是“回避”,二是“改为全局”。
有的程序员编程从来不仿真调试,就是通过无数次的“下载”全速运行,利用项目的显示器件,反复设定观察点,反复纠正。
事实上,我们看到的许多例程,打开工程文件时,都看不到对Debug的有关设置。可以说就是“回避”的。
而当你来Debug调试时,常有可能出现很多警告。当然,HEX文件是可用没错的。
另一种方法就是将需要观察的变量设定为(或临时设为)全局变量,以便调试时,跟踪观察。
因此可看到一些例程大量使用全局变量。其实,这一点虽然没错,但不合结构化、模块化编程机理。
至于说,建议将0X00000000改写为0x00000000,应该是没有关系的。
在从前的相当长一段时间里,各种厂商对各种51单片机制造了各种仿真器,价格都不菲的,把许多业余爱好者挡在了门外。
而今,STC、AI单片机,仅仅用一根串口通讯线、或用一根USB通讯线,就能实现仿真调试,已经非常了不起了。
当然,STC、AI单片机仿真调试密切适配于Keil编译环境,还期待更进一步完善了。
多言了,仅供参考......
VCC
发表于 2024-12-9 21:29:56
浦江一水 发表于 2024-12-9 21:18
根据本人的认知、体会, 扯谈几句,供楼主参考:
从STM32编译环境转场到C51或C251编译环境,也许有点不习惯 ...
竟然是这样!!震惊了
可以说是keil的C51和C251的仿真调试模块有bug吗?
浦江一水
发表于 2024-12-9 22:33:23
VCC 发表于 2024-12-9 21:29
竟然是这样!!震惊了
可以说是keil的C51和C251的仿真调试模块有bug吗?
本人认为不能这样说。
注意我上述“扯谈”中最后的一句话:
“STC、AI单片机仿真调试密切适配于Keil编译环境,还期待...”
为何不这样写:
“Keil 编译环境对 STC、AI单片机仿真调试的支持,还期待...”。
有何区别吗?
Keil 大概率在View/Watch windows /watch1...中有观察变量的功能,不会是形同虚设的.
相比较, Keil MDK V4.XXV5.XX for STM32 的编译环境, 都是做得非常好的.
这是个人的体会感觉,希望是片面的、错误的,大家可以反复实践验证。
tzz1983
发表于 2024-12-10 07:57:26
浦江一水 发表于 2024-12-9 21:18
根据本人的认知、体会, 扯谈几句,供楼主参考:
从STM32编译环境转场到C51或C251编译环境,也许有点不习惯 ...
在仿真一块,我是这样子的,除了偶尔局部代码的硬测外,基本不用仿真。
仿真这东西多了一个仿字,所以并不真,还会某明奇妙,正常代码有时候也会走挂。
用免费的printf吧,
如1楼所遇问题,在if前 printf(变量值),比真金还真。啥问题没有。
如确实是0又不判断,则可翻看汇编代码,基本上这种问题花很少的时间就可以搞定问题出在哪
liuzonggong
发表于 2024-12-10 08:29:50
不要用0x00000000;直接用十进制的0;