打印

Keil果然如神一般的编译器!

[复制链接]
楼主: 291355171
手机看帖
扫描二维码
随时随地手机跟帖
41
291355171|  楼主 | 2012-6-29 14:06 | 只看该作者 回帖奖励 |倒序浏览
最看不起的就是这种人
lyjian 发表于 2012-6-29 12:34

您可以看不起我,这是您的自由。我无权干涉。

使用特权

评论回复
42
291355171|  楼主 | 2012-6-29 14:08 | 只看该作者
用KEIL的DEBUG  监视
hnlxy712 发表于 2012-6-29 12:30

谢谢这位兄弟。

不过小弟有一事不明,不知道你发的什么?管理员居然给你删帖了,我真想知道是什么决然让我们的管理员都愤怒了。。。:lol

使用特权

评论回复
43
zyzfgpzgh| | 2012-6-29 14:12 | 只看该作者
一般编译器是不会有问题的。

使用特权

评论回复
44
291355171|  楼主 | 2012-6-29 14:13 | 只看该作者
江山人才辈出……

执行完你的main()后,程序存储器后面全是FF……于是PC一直不停加1……一直跑到程序存储器尾部,然后又回到程序存储器开头……然后又开始执行你的main()…… ...
mohanwei 发表于 2012-6-29 12:24

回复23楼

那么如果我程序运行完了,而PC指针任然在加,直到加满溢出,复位重头开始在加。

如果细分的话我这个程序执行完也不够指针加满溢出的,那么是不有有断时间是PC指针在加的空操作。而我D1没有任何反应?等到溢出复位了以后在执行D1的0和1的操作。是不是可以这样理解?

使用特权

评论回复
45
291355171|  楼主 | 2012-6-29 14:13 | 只看该作者
把最简化的工程文件传上来,大家会验证的。
估计99.9999999%LZ是错的。
xxlin1984 发表于 2012-6-29 09:37

兄弟被你说对了,业务不熟害死人哪。

使用特权

评论回复
46
delin17| | 2012-6-29 14:26 | 只看该作者
楼主看一下汇编就成了,其实应该是运行完main,程序就自动复位了。startup文件一般都会这么做,看一下相应的汇编呗

使用特权

评论回复
47
yytdragon| | 2012-6-29 14:31 | 只看该作者
LZ 你太自信了

虽然自信是好事

你的问题完全是你自己的程序问题

正确的解释 如 23L 所说的

并不是所谓的什么PC指针加满溢出的问题
而是 在你的代码的 剩余空间上都是0xFF(mov A,R7指令) 这样程序是 顺序执行到flash的最后然后返回到0地址上,相当于程序重新 上电一样的。。。

使用特权

评论回复
48
duyinqian1986| | 2012-6-29 14:36 | 只看该作者
很久很久以前,C语言上机课,某同学做不出来,他一拍电脑,说,电脑坏了。

使用特权

评论回复
49
291355171|  楼主 | 2012-6-29 14:39 | 只看该作者
LZ 你太自信了

虽然自信是好事

你的问题完全是你自己的程序问题

正确的解释 如 23L 所说的

并不是所谓的什么PC指针加满溢出的问题
而是 在你的代码的 剩余空间上都是0xFF(mov A,R7指令) 这样程序是 顺序执行 ...
yytdragon 发表于 2012-6-29 14:31


这样说俺就明白了。实在不好意思,是俺根基太差,让各位见笑了。
不如您老哥随便跟俺推荐本书吧。

使用特权

评论回复
50
sedatefire| | 2012-6-29 14:47 | 只看该作者
基础啊基础,哪本书如此误导楼主?
建议LZ用KEIL的DEBUG,观察汇编的结果,也许可以明白人家的答复。
vrgood 发表于 2012-6-29 11:46

没错
PC指针一直取指,执行诸如NOP之类的指令,直到溢出复位

使用特权

评论回复
51
sedatefire| | 2012-6-29 14:47 | 只看该作者
Keil果然如神一般的编译器!
一看到这个标题,我就想楼主要悲催了
抱怨编译器的人通常没有好下场

使用特权

评论回复
52
cool_coder| | 2012-6-29 15:06 | 只看该作者
学好基础还是有必要吧?

使用特权

评论回复
53
291355171|  楼主 | 2012-6-29 15:17 | 只看该作者
53# cool_coder [/这是我的错。

使用特权

评论回复
54
cjseng| | 2012-6-29 15:21 | 只看该作者
楼主没说清楚LED闪的频率是咋样的呢,建议用示波器看一下呗。
或者用proteus仿真一下也不错。
当然原因肯定是PC一直在递加造成的,你用proteus仿真可以看到程序实际的运行状态(在汇编模式下,你能看到程序执行完你的最后一条代码后往何处去了)。

使用特权

评论回复
55
291355171|  楼主 | 2012-6-29 15:45 | 只看该作者
Keil果然如神一般的编译器!
一看到这个标题,我就想楼主要悲催了
抱怨编译器的人通常没有好下场
sedatefire 发表于 2012-6-29 14:47


看来这兄弟很有经验呐,呵呵

使用特权

评论回复
56
sanwa_chen| | 2012-6-29 15:49 | 只看该作者
本帖最后由 sanwa_chen 于 2012-6-29 15:53 编辑

建议:
首先在你程序MS(100)后面加一个while(1);
另外:
1 . 看看是不是有那个地方设置看门狗,有些芯片是在烧录配置里面开启看门狗的,这时你程序如果没有相关的处理可能会不停复位
2. 把MS(100)换成 Delay(100)试试看。
3. 直接用 NOP 指令替换掉Delay(100)和MS(100),单步执行看看LED变化。
前面好多人都说了,不用怀疑编译器,不管多简单的程序都有你没想到的情况。

使用特权

评论回复
57
李冬发| | 2012-6-29 15:52 | 只看该作者
KC,至少在她刚出道时是非常糟的。不过今天的KC,长大了。
楼主的这个问题,是多数毛孩子容易出的错。
多看看书,多实践实践,会有心得的。

使用特权

评论回复
58
291355171|  楼主 | 2012-6-29 15:57 | 只看该作者
各位我是不是可以这样理解。

在我有指令的部分,他是按照我指令来动作。
但是我的指令执行完毕,那么他任然在执行,指针依然在加,然后从指针指到的地址,执行命令(在此没有命令就是空操作),等指针指到最后的一个地址的时候。(就溢出了)他就从入口部分重新开始执行程序,即0地址。继续着我上述的操作,然后无限循环的闪了。

那么假如说我的延时非常准100毫秒,那最后一个延时是肯定大于100毫秒的。因为我剩余的地址,指针也要指一遍然后执行相应的指令一遍(当然是空操作)。这段时间我们看到的就是加到了最后一个延时里面去了。

不知是否可以这样理解。

使用特权

评论回复
59
291355171|  楼主 | 2012-6-29 16:14 | 只看该作者
58# 李冬发
李哥,您是第一个称呼俺是小毛孩子,虽然我才19,第一次让我感觉我还小,还有时间。实践我做了很多。什么温度,时钟,1602.12864,AD,DA,拟合正弦波变频0.1(这个我是费了老大的精力啊),测频率,测电流,测电压。等等。奈何目前还是这个水平。。。

要不李哥你给俺推荐本书,我时常感觉自己欠缺的东西很多,特别是基础。但是又不知道哪些书说的有点系统。这些东西都是俺自己学的。天天逛二姨家(俺知道您是牛人,你不认识我我认识你:lol ),东一锤子,西一棒子的学,感觉没个系统。每天一到晚上看书的时候就开始纠结了。。。我是看模电好呢?还是写程序好呢?还是学习ARM好呢?
每天晚上很是纠结。结果纠结纠结就12点了要睡觉了还的上班。

李哥您就给俺推荐本书吧。有点系统性就行。目前俺只会C,关于模电方面稍微懂点的。PCB俺画过,PIC俺玩过。

给俺推荐本书吧。。。

使用特权

评论回复
60
coody| | 2012-6-29 16:59 | 只看该作者
LZ根本不了解KEIL

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则