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;
页: 1 [2] 3 4
查看完整版本: 32G8K64 最简单的C代码都运行异常