打印

唉,这么简单的问题搞这么复杂来忽悠菜鸟……

[复制链接]
楼主: 刘前辈
手机看帖
扫描二维码
随时随地手机跟帖
楼主
icecut| | 2011-8-26 13:49 | 显示全部楼层 回帖奖励 |倒序浏览
这个是问题吗?建议你好好分析一下.

那两个前辈左手画圆右手画方然后说能出错你就信???

count++如果<250,你想想啥原因?如果连个int ++都搞不好,编译器就不用混了.

你那情况是有进位却没加到高位时才出现.你想想这时候中断能退出吗?

使用特权

评论回复
沙发
icecut| | 2011-8-26 20:27 | 显示全部楼层
如果编译器连int都搞不定。还是回家找骂吃饭吧

使用特权

评论回复
板凳
icecut| | 2011-8-27 01:25 | 显示全部楼层
30楼挺好。虽然 51没有cache。但是reg可以缓存变量。。。。
至于他的结果,俺还是不相信

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
地板
icecut| | 2011-8-27 19:51 | 显示全部楼层
LS总结的《方法1》 常用,《方法2》有点局限性,当count处于高速计数状态时,每次读出的值都不同,根本无法连续两次读到相同值,程序进入死循环。
因此,解决此问题的方法是,将int类型分成2个char型变量读,先读 ...
Cortex-M0 发表于 2011-8-27 17:04

《方法2》有点局限性
这个方法是正确的,多线程同步的时候肯定是一种方法。。。中断的时候标志寄存器竟然不保存。。。。

下面引用8086的处理方法
中断时,为保证中断服务程序正确返回原来的程序,要把被中断程序的断点处逻辑地址CS : IP压入堆栈保存,还要保存反映现场状态的标志寄存器FLAGS。然后,将中断服务程序的入口地址送CS和IP寄存器转去执行中断服务程序。
我特别的搜索一些单片机汇编语言的中断处理程序,的确是写了保存psw的指令,如果keil不保存。那我没办法了。。。这个问题解决办法就是嵌入汇编,增加psw的保存。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
5
icecut| | 2011-8-28 08:55 | 显示全部楼层
icecut大师就别用您那超高挡的MCU来搅拌了,这里刘前辈用的是AVR, 51低挡8位机,连个int类型都要分两次读写~~~  :L
Cortex-M0 发表于 2011-8-27 20:36


8086也是16bit总线,一个32bit的int也表示不出来啊。。。
拼int的时候中断不要紧,关键是保存psw就不会标记错误。不要把x86看得太神圣。
要走正统的路。不要曲线救数

使用特权

评论回复
6
icecut| | 2011-8-28 10:42 | 显示全部楼层
icecut大师越搅拌离题越远,俺怀疑您刘前辈的题目都没看完整,任何中断都要保存psw标记,除非有些低挡的如PIC之类芯片,保存累加器、psw标记等内容需要人工干涉,没有自动保存功能,中断返回当然自动恢复原psw标 ...
Cortex-M0 发表于 2011-8-28 09:42

这个问题,前面已经有人解决了。就是volatile。这个问题,51有,8086肯定有。但是这么多年,只有这里第一次讨论啊。。。。并且,读取是先读低位在读高位,就算溢出,错的也不是丢进位啊。

使用特权

评论回复
7
icecut| | 2011-8-28 18:09 | 显示全部楼层
这种程序,实际应用很难用。

最常用的是粗粒度同步。所以,还是概率小一些。
lz的程序可以很容易的改,把小数计数放在中断内,主程序循环做大数计数循环。。。。
避免就可以了。不要为了这种错误的架构去改中断屏蔽。。。。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
8
icecut| | 2011-8-28 19:42 | 显示全部楼层
75# 刘前辈
刘,你还是造出车来了。建议你看一本书
《多处理器编程的艺术》

这本书有很多种数学算法,来解决多处理器同步。
循环是提到的是最简单的一种。

看你是个爱学习的人,那就看看吧。《60元×8折

使用特权

评论回复
9
icecut| | 2011-8-28 22:52 | 显示全部楼层
77# 刘前辈
又是一个研究所的人。。。。。怪不得你这么闲

俺本科。进不了研究所,就在外面玩玩。争取点高薪

计算机发展很快,多核并行马上的事情,只不过出论文很难。

只要未来能帮助我的技术我都会去看的。呵呵。

使用特权

评论回复
10
icecut| | 2011-8-28 22:53 | 显示全部楼层
研究所不是不想挑战,,,,曙光招聘20w以下的人,可是俺出身不好。。。四六级都没过。。。去干嘛?

使用特权

评论回复
11
icecut| | 2011-8-29 11:52 | 显示全部楼层
91# Cortex-M0
俺要用大数,1024bit计数,你给来个影子寄存器吧....

使用特权

评论回复
12
icecut| | 2011-8-29 11:52 | 显示全部楼层
我说的影子寄存器是指对应你说的高速计数器的,有了影子寄存器不关中断就能正确读取高速计数器的数值,而且现在的一些MCU硬件上已采用这种东西了,读写寄存器分开,写入时先对影子寄存器操作等等。
对内存的操作, ...
t.jm 发表于 2011-8-29 11:29

如果都有bug,那就不用多核处理器了.

使用特权

评论回复
13
icecut| | 2011-8-29 12:19 | 显示全部楼层
96# Cortex-M0
不管什么局限都叫bug....

现在的多核,这种问题更多....但只能算同步问题.不是bug了

使用特权

评论回复
14
icecut| | 2011-8-29 14:05 | 显示全部楼层
为什么不是说多核处理器核心设计和编程方法就有考虑此问题呢?
对内存不做保护的操作不要说多核,就是单核都会出问题。
t.jm 发表于 2011-8-29 13:17


多核单核都不是靠内存保护来完成这个功能的.而是靠软件设计..

使用特权

评论回复
15
icecut| | 2011-8-29 14:06 | 显示全部楼层
唉。。。。。

刘前辈辛苦啦,码了这么多字来教俺,谢谢~~~

只是,程序运行中出错的地方不在

if ( DPTR>250 ) {  }  中的DPTR是一个私有变量,是一种避免与ISR共享变量的解决方法。根本无法取消的(当然可以定义另 ...
Cortex-M0 发表于 2011-8-29 13:20


不要把这些东西推给硬件,推给指令集.软件就能解决

使用特权

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

本版积分规则