0 唉,这么简单的问题搞这么复杂来忽悠菜鸟…… - 第4页 - 单片机论坛,单片机技术交流论坛 - 21ic电子技术开发论坛
打印

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

[复制链接]
楼主: 刘前辈
手机看帖
扫描二维码
随时随地手机跟帖
61
icecut| | 2011-8-28 10:42 | 只看该作者 回帖奖励 |倒序浏览
icecut大师越搅拌离题越远,俺怀疑您刘前辈的题目都没看完整,任何中断都要保存psw标记,除非有些低挡的如PIC之类芯片,保存累加器、psw标记等内容需要人工干涉,没有自动保存功能,中断返回当然自动恢复原psw标 ...
Cortex-M0 发表于 2011-8-28 09:42

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

使用特权

评论回复
62
刘前辈|  楼主 | 2011-8-28 11:09 | 只看该作者
本帖最后由 刘前辈 于 2011-8-28 12:22 编辑

48楼真的没看出45楼的忽悠?害的所长也跟着那么兴奋。

我认为:1、能看出别人的漏洞,是一个层次;2、能通过别人的漏洞看出别人想说什么,然后帮他补上漏洞把话说完整才是更高的层次。3、正如搞电子装置故障维修,一个故障有100种可能产生的原因,你知道故障大概在什么位置是一个层次,能够从100中可能中判断出只可能有一种原因,然后直达故障部位,几分钟修好,才是真正的高层次。

         题外话:前辈一个表兄在中科院物理研究所,复旦硕士,若干年前一次实验,一台美国贵重仪器坏在他做实验的时段,当然就认为是他给弄坏的,严重处分写进了档案,从此再不允许做高端实验,碰国外仪器。一个高才生,意味技术生命从此结束?——若干年后,听长辈讲,他自己研究多年,把那台美国设备修好了!单位撤消了处分,恢复所有职务,还派他出国进修。现在是博导了。
       —— 年龄没有所长高,层次可是高多了。


           LZ 忽悠的是初学者,基本思想是:既然SmartPower 能够测试出小概率(<1%)事件(M0所谓永远不可能事件)——数据读错误事件,那么丢弃一次错误数据比反复 关闭/打开 99 次无效中断保护,谁更聪明?我认为SmartPower 的测试程序更聪明:他实际只多了一条语句JC  &error ; 就达到了目的。

     45楼刘前辈这次忽悠的是自以为是的高手,像所长这样还没看清刘前辈的意思就过早兴奋了,“这次我可抓住刘公的漏洞了,一点水平都没有,裸奔到底比我差远了……”

         哈!所长连这点小伎俩都看不出来了:下面让54岁的老所长开开眼:

DPTR = count ;       // 所长是不是什么都要让刘前辈告诉你?一点都不长进。

if  ( DPTR > 250 )         // count = 251~260
        {
            __delay_cycles(2);       //   按理一定执行这句话
        }
        else
        {
            error++;            //      但实际上有一定的机率会执行这句话
        }


、、

使用特权

评论回复
63
刘前辈|  楼主 | 2011-8-28 11:57 | 只看该作者

高手有本事也写个不一样的出来才好……

本帖最后由 刘前辈 于 2011-8-28 12:33 编辑
LS
DPTR = count ;       // 所长是不是什么都要让刘前辈告诉你吧。一点都不长进。
if  ( DPTR > 250 )         // count = 251~260
   ……


还用往下教?没事,菜鸟喜欢关中断,关几个字节谁也不好说什么。上面一句:
EA=0;
DPTR=count;   //  能把高手设的临界区缩小到1 / 3 甚至更小,是件了不起的事。
EA=1;           //  只有一条语句,临界区已经最小了。

if  ( DPTR > 250 )         // count = 251~260
{……}

这也要刘前辈给所长讲课?
没事,所长若是除了关中断什么都不会,老刘再教你一点。别气出病来就行了:

do {
DPTR=count;
}while ( DPTR ^ count );


还要刘前辈写方法4吗? 所长还要练嘴皮子?写个别人没想到的才是正跟。……


//

使用特权

评论回复
64
冲动的蜗牛| | 2011-8-28 12:26 | 只看该作者
作为新人,学习中

使用特权

评论回复
65
刘前辈|  楼主 | 2011-8-28 12:42 | 只看该作者
本帖最后由 刘前辈 于 2011-8-28 12:46 编辑
do {
DPTR=count;
}while ( DPTR ^ count );


这次可谁都没忽悠,还能想出点什么?

测试一下,究竟丢弃的数据(偶然发生的异常事件)和正确的数据(所谓永远不可能发生的事件)之比是多少。

        我用上式测的大约0.008 。环境不同(delay参数),概率不同。


、、

使用特权

评论回复
66
Cortex-M0| | 2011-8-28 13:04 | 只看该作者
这个问题,前面已经有人解决了。就是volatile。这个问题,51有,8086肯定有。但是这么多年,只有这里第一次讨论啊。。。。并且,读取是先读低位在读高位,就算溢出,错的也不是丢进位啊。 ...
icecut 发表于 2011-8-28 10:42


volatile类型本质上就是告诉编译器,这个变量可能要被其他程序改变,不能用优化后的暂存内容顶之,程序每调用一次都要刷新,但无法防止中断打断读该变量!如该变量能一次读完则没事,如不能一次读完,被中断打断,并且该变量在中断中被改变,而且还有进位发生,则中断返回后,程序执行读剩下的一半,则读入的数据是错误的,只不过出现的概率极低~~~

使用特权

评论回复
67
Cortex-M0| | 2011-8-28 13:18 | 只看该作者
do {
DPTR=count;
}while ( DPTR ^ count );
...
刘前辈 发表于 2011-8-28 12:42


刘前辈,您也算得上是位大师了,何必在这芝麻小事上比高低呢?

说实说,俺尽管菜,但对这“超**技术”也没兴趣,上述方法只不过是网友流行音乐 总结的 方法2:smartpower 提出的在中断外循环读 count,当连续两次读的值相同才作为有效数据来处理。之变种! 有啥好争之?

您用此法去读 16位定时器内容 试试~~~
读到老死都读不出两次相同的内容。

使用特权

评论回复
68
流行音乐| | 2011-8-28 15:01 | 只看该作者
既然已经用了循环读取 count 的方法,就没必要用 DPTR 了。

使用特权

评论回复
69
Cortex-M0| | 2011-8-28 15:44 | 只看该作者
既然已经用了循环读取 count 的方法,就没必要用 DPTR 了。
流行音乐 发表于 2011-8-28 15:01


流行音乐 正解!
这里面的DPTR纯粹当一int型变量使用,写DPTR是为了吸引眼球,显示“红杏出墙”之“非典”应用~~~

使用特权

评论回复
70
HORSE7812| | 2011-8-28 16:40 | 只看该作者
volatile类型本质上就是告诉编译器,这个变量可能要被其他程序改变,不能用优化后的暂存内容顶之,程序每调用一次都要刷新,但无法防止中断打断读该变量!如该变量能一次读完则没事,如不能一次读完,被中断打断,并且该变量在中断中被改变,而且还有进位发生,则中断返回后,程序执行读剩下的一半,则读入的数据是错误的,只不过出现的概率极低~~~

很多人以为中断里面发生变化的变量加上volatile就万事大吉了。

使用特权

评论回复
71
Cortex-M0| | 2011-8-28 17:39 | 只看该作者
...

很多人以为中断里面发生变化的变量加上volatile就万事大吉了。 ...
HORSE7812 发表于 2011-8-28 16:40



只有高手才敢这么用,中断里面发生变化的变量加上volatile就万事大吉了。

咱们低手还是一步一个脚印,老老实实一笔一划写点满大街都有的烂程序吧,不懂就求个保险 ...

使用特权

评论回复
72
icecut| | 2011-8-28 18:09 | 只看该作者
这种程序,实际应用很难用。

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
73
Cortex-M0| | 2011-8-28 18:14 | 只看该作者
icecut老师正解~~~

这也是一种比较常用的方法~~~

使用特权

评论回复
74
huangqi412| | 2011-8-28 19:03 | 只看该作者
哈哈

使用特权

评论回复
75
刘前辈|  楼主 | 2011-8-28 19:06 | 只看该作者
本帖最后由 刘前辈 于 2011-8-28 19:09 编辑
67楼M0
    ……上述方法只不过是网友流行音乐 总结的 方法2:smartpower 提出的在中断外循环读 count,当连续两次读的值相同才作为有效数据来处理。之变种! 有啥好争之?


惭愧了,原来早有网友想到了。老刘原来是剽窃了流行音乐的思想?不知道呀,幸亏流行音乐没写具体例程?否则老刘无地自容啦;还有,老刘实际程序如下,相信绝无和第二者雷同:

do {
DPTR=count;

flag1++;

}while ( DPTR ^ count );

flag1--;
测试出大约 0.0004 (万分之4)的概率。

整着玩而已,同意 icecut 的说法,实际应用根本不可能这么用!为了万分之4的小概率事件,加那么多冗余代码。不可能。

IBM 大型计算机最早发现了这样的小概率事件,很紧张,找来数学家一算:十年可能出现一次!IBM 高管讨论结果:根本不要管它,小概率事件爱怎么出现就怎么出现吧,总不能为了10年一遇的事件去动几百万行的代码吧。——更不可能用关中断或者再加多少冗余测试程序的方法去保护那些原本就读取正常的数据。

    简单情况下可以,正如书上所说:关中断几个字节可以,之所以合理,就是因为它短。

EA=0;
DPTR=count;   //就是因为它短。
EA=1;

前辈是孤独地走向目标,从没有和谁比较的意思。是所长总追着前辈PK,都成了心理疾病了。回来陪他玩玩而已。

、、

使用特权

评论回复
76
icecut| | 2011-8-28 19:42 | 只看该作者
75# 刘前辈
刘,你还是造出车来了。建议你看一本书
《多处理器编程的艺术》

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

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

使用特权

评论回复
77
刘前辈|  楼主 | 2011-8-28 22:26 | 只看该作者
本帖最后由 刘前辈 于 2011-8-28 22:32 编辑

LS
我连单处理器多进程交互还没学好,而且计划下一步是分布式OS,再下一步是国家……现场总线项目。因为我有源代码。又与工作课题挂钩(收入直接挂钩)。
     ——理论早就有了,就是做不出来。你行吗?你若行到我们所里应聘来,来了就有房子有课题经费。还研究那种空理论?浪费青春时光。
     多处理器没有源代码和硬件条件,也无课题目标支撑,空头理论害了我10年了。学了也没用。

     你说的书网上有下的,免费版,我们所里看过的人多了去了,我从不看别人看过的书。博士生在学校搞理论研究差不多。20年了也没见中国有什么动静。我耗不起年华。现场总线我们所搞了10年了,笨吧?谁不笨来我们所试试?别光凭嘴说,“挑战的欲望?”这里很简单的课题挑战,知道怎样做,就是做不出来……盼望你呀,icecut……

   到我们所应聘的岂止学过《多处理器编程艺术》?什么人才都有,什么书都看过。理论一套一套,就可惜连读写者问题用在哪都搞不清,例如SmartPower这道题目,让谁写个解决程序,谁都不会写。关中断?马上请你走人。刘前辈虽然差劲,但是那么多人讨论,也就前辈写了几个“差劲的”不关中断的程序,比那什么也写不出来的强多了。所里的国家投资项目不是靠理论吹牛的,这里博士生成堆。有什么用?


、、

使用特权

评论回复
78
icecut| | 2011-8-28 22:52 | 只看该作者
77# 刘前辈
又是一个研究所的人。。。。。怪不得你这么闲

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

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

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

使用特权

评论回复
79
icecut| | 2011-8-28 22:53 | 只看该作者
研究所不是不想挑战,,,,曙光招聘20w以下的人,可是俺出身不好。。。四六级都没过。。。去干嘛?

使用特权

评论回复
80
highgear| | 2011-8-28 23:28 | 只看该作者
本帖最后由 highgear 于 2011-8-29 00:01 编辑

如果刘公公前面没有这么多的唧唧歪歪,自鸣得意气风发fen涂墻,那主楼就只是一个技术失误,不足为奇。可刘公公前辈硬生生把这个帖子变成一个笑话,如同哪个“填补空白”的结构copy一样。

这个问题本不是一个问题,正如123姐姐所说,“像这种底层编程------汇编,缺少硬件的基础,很难玩的深,像菜农整天玩“红杏出墙”,在于菜农硬件底子较深厚,因此不容易出差错~~~”,这种强烈地依赖编译器行为和硬件特性的技巧,是软件大忌,即便菜农,玩“红杏出墙“,在我公司也是会被踢出去的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则