打印

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

[复制链接]
楼主: 刘前辈
手机看帖
扫描二维码
随时随地手机跟帖
101
t.jm| | 2011-8-29 13:46 | 只看该作者 回帖奖励 |倒序浏览
顶100L。
万变不离其中,你总要对那个内存保护读取一次才会得到它的值,而后再对得到的值进行应用才是安全的。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
102
lxyppc| | 2011-8-29 14:01 | 只看该作者
你们都跑题了
楼主我来PK你,保证编译出的代码比你的还要简洁
你写的是
       if(count > 250||CY)         //count = 251~260
        {
            __delay_cycles(2);  //按理一定执行这句话
        }
        else
        {
            error++;            //但实际上有一定的机率会执行这句话
        }

count>250,汇编判定条件是 CY==0
后面跟的CY,判定条件是 CY != 0
你的意思就是
if( (CY == 0) || (CY!=0) )
{
  //我都要执行
}

我的代码是这样的

#define YOU_BELIEVE 1
#define YOU_DO_NOT_BELIEVE 0
if(YOU_BELIEVE || YOU_DO_NOT_BELIEVE)  // 不管你信不信
{
  //反正我是信了
  __delay_cycles(2);  //按理一定执行这句话
}
编译出的结果自己去看,比你的精简;P

使用特权

评论回复
评分
参与人数 2威望 +2 收起 理由
highgear + 1
Cortex-M0 + 1
103
t.jm| | 2011-8-29 14:04 | 只看该作者
102# lxyppc
说正经的,我也有个简单的测试:
if(count == 0)
{
   error++;
}

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
Cortex-M0 + 1
104
icecut| | 2011-8-29 14:05 | 只看该作者
为什么不是说多核处理器核心设计和编程方法就有考虑此问题呢?
对内存不做保护的操作不要说多核,就是单核都会出问题。
t.jm 发表于 2011-8-29 13:17


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

使用特权

评论回复
105
icecut| | 2011-8-29 14:06 | 只看该作者
唉。。。。。

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

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

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


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

使用特权

评论回复
106
lxyppc| | 2011-8-29 14:16 | 只看该作者
102# lxyppc  
说正经的,我也有个简单的测试:
if(count == 0)
{
   error++;
}
t.jm 发表于 2011-8-29 14:04

我也说正经的
你的系统能容忍这样的错误那就容忍
不能容忍就老老实实的关中断

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
107
t.jm| | 2011-8-29 14:21 | 只看该作者
多核单核都不是靠内存保护来完成这个功能的.而是靠软件设计..
icecut 发表于 2011-8-29 14:05

关中断算不算软件设计啊?
操作系统用到的技巧就更复杂了,实质也是由LZ所说的问题引申出来的。

使用特权

评论回复
108
刘前辈|  楼主 | 2011-8-29 16:15 | 只看该作者
本帖最后由 刘前辈 于 2011-8-29 17:01 编辑
#63楼
还用往下教?没事,菜鸟喜欢关中断,关几个字节谁也不好说什么。上面一句:
EA=0;
DPTR=count;   //  能把高手设的临界区缩小到1 / 3 甚至更小,是件了不起的事。
EA=1;           //  只有一条语句,临界区已经最小了。


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

这也要刘前辈讲课?


突然明白了一件事:M0看不懂什么叫临界区。所以,经常让前辈哭笑不得。……

M0和所长的水平大概仅限于#62楼下面所贴:再往下#63楼的内容看不懂了,更想不到了。什么叫临界区?把下面这2条关中断加上(这不用我教了吧),再看看实验结果,执行结果能相同么:看看谁是小儿科:
EA=0;
DPTR=count;   

EA=1;      

count 对 DPTR 的赋值过程中,万一当中发生中断,并且在中断过程中 ,count 变量中间有半进位发生,中断返回后,再继续执行 count 对 DPTR 赋的值就杯具了~~~

这个问题转了好大的一个圈,又回到了原地,再讨论下去又有神马意义?

至于本式中的 DPTR,可用任何 int变量代替,执行结果相同~~~




看清楚#63楼说的是什么!

建议M0版主以后把坛友说的是什么看清楚再下结论,别总自以为是地认为自己不懂的事,坛友一定也不懂。然后牛头不对马嘴地乱说一气。

icecut 一般讲的都是OS理论,——更广泛的知识背景下的概念语言,M0也来和他辩论?评论icecut 的对与错? M0学过Linux 吗?知道陈莉君是谁?M0敢去北大方正吗?……所长就更没资格了,除了骂几句就走,让学生们耻笑。……



、、

使用特权

评论回复
109
ayb_ice| | 2011-8-29 16:23 | 只看该作者
至于你们信不信,我反正...

使用特权

评论回复
110
Cortex-M0| | 2011-8-29 17:03 | 只看该作者
唉。。。。。

刘前辈确实牛X,乃超人也~~~

这无轨电车开得让人佩服,主题是讨论“ || CY ”  ,  开到后来直接抄 流行音乐 的第一种方法 ------- 关中断!

简单又省事,俺怎么没想到哪~~~

至于你们信不信,俺不管,反正我是信了 ------- 刘前辈本年度一定拿诺贝尔奖。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
highgear + 1
111
Cortex-M0| | 2011-8-29 17:13 | 只看该作者
不要把这些东西推给硬件,推给指令集.软件就能解决
icecut 发表于 2011-8-29 14:06



MCU要正常工作,必须依靠软硬件,缺一不可,这是一个集合体,不是所有的问题都能用软件能解决的(如高速计数),也不是所有的问题都能用硬件能解决的(如您说的1024bit计数),应该是综合考虑,均情使用。

使用特权

评论回复
112
lxyppc| | 2011-8-29 17:33 | 只看该作者
晕,又顶上来了
看来看去,楼主位的代码就是102楼的意思
至于你们信不信,反正我是信了

使用特权

评论回复
113
刘前辈|  楼主 | 2011-8-29 18:24 | 只看该作者
本帖最后由 刘前辈 于 2011-8-29 18:39 编辑
#100楼 M0版主
DPTR = count ;     // 所长是不是什么都要让刘前辈告诉你?一点都不长进。   

count 对 DPTR 的赋值过程中,万一当中发生中断,并且在中断过程中 ,count 变量中间有半进位发生,中断返回后,再继续执行 count 对 DPTR 赋的值就杯具了~~~

这个问题转了好大的一个圈,又回到了原地,再讨论下去又有神马意义?至于本式中的 DPTR,可用任何 int变量代替,执行结果相同~~~


唉!M0到底是不懂还是故意?!我实验结果都有了,你还在这“执行结果相同……”?
把你的执行结果贴出来给众人看看?我这先贴了:
         开中断时:错误记录大约10万分之37 。



关中断时:错误记录=0 。




这么明显的实验结果,还要狡出点什么……

        再讲讲理论:初始错误是因为读者数据读到一半,写者(ISR是写者——这也要教?)优先修改了数据,结果造成读者后一半数据读错误。——这是因为读者和写者在同时读写同一本书(共享了同一变量)时造成的时间错误。 而DPTR=count; 的教育意义是使读者和写者在同一时间不共同读一本书;举例:
        假定 读者在读司汤达的《红与黑》,写者在修改雨果的《笑面人》。——或者说读者正在读《笑面人》的一副拷贝,算你理解深刻了。——2者没有共享变量;   ISR愿意怎么中断,随便怎么修改《笑面人》都不会影响主函数读者读《红与黑》/《笑面人》的拷贝。 这就是DPTR=count; 或者 count_back=count; 的教育意义。
           难道还要前辈告诉你,count_back 代表私有变量《红与黑》/《笑面人》复制品,count  代表全局变量《笑面人》原版正在即时修改版?——连私有变量和共享变量的性质都没搞清?太累了……

          这么简单的OS理论,一天就懂了吧。用不了三年。



//

使用特权

评论回复
114
Cortex-M0| | 2011-8-29 18:35 | 只看该作者
累不累啊?

累累累累累累累累累累累累……

俺服了你~~~

使用特权

评论回复
115
xlsbz| | 2011-8-29 20:40 | 只看该作者
现在似乎是一边倒啊 ! 不论怎样 从这帖子里面 能学到不少东西 可惜我现在天天搞应用了

使用特权

评论回复
116
Cortex-M0| | 2011-8-29 20:52 | 只看该作者
最新流行“一边倒门”~~~

又名“牛X门”~~~

或曰:“诺贝尔奖非我莫属门”~~~

使用特权

评论回复
117
highgear| | 2011-8-29 21:04 | 只看该作者
唉~~~

俺真笨,今天才明白,刘前辈的小儿科问题,为什么这么有市场~~~

因为,懂的都笑笑,打酱油路过,不值的回答~~~

不懂的总有一大堆理由,答非所问的解释一件很简单的小儿科问题~~~

所以,刘前辈的小儿科问题,才能在二姨家所向披靡~~~
123姐姐果然敏锐,看到问题的本质,俺这根粉丝心悦诚服。
井蛙不可语海,与一个把极其简单的问题说成“第一”“填补空白”,把挂一幅画的家政公司称为“巨人”却愚顽不化的人,看看笑话就可以了,不必过于认真。

使用特权

评论回复
118
流行音乐| | 2011-8-29 21:07 | 只看该作者
关中断的方法大家都知道。
我想知道的的是除了关中断和循环读,还有没有其它方法。

使用特权

评论回复
119
highgear| | 2011-8-29 21:17 | 只看该作者
关中断就说关中断,还什么“临界区”,刘公公脑袋进水了?

玩弄术语,好吧:多线程自旋锁迫使进程进入临界区从而解决临界区非原子操作所导致的资源冲突问题,是八维宇宙交变场由于熵减造成黑洞嬗变在第四维空间所产生的异常波动。

使用特权

评论回复
120
Cortex-M0| | 2011-8-30 06:36 | 只看该作者
多线程自旋锁迫使进程进入临界区从而解决临界区非原子操作所导致的资源冲突问题,是八维宇宙交变场由于熵减造成黑洞嬗变在第四维空间所产生的异常波动。...
highgear 发表于 2011-8-29 21:17



这个牛X,学习了,可惜俺这辈子学不会,还要靠子孙后代继续学习~~~

使用特权

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

本版积分规则