打印

老生常谈---一种裸奔多任务模型

[复制链接]
楼主: dld2
手机看帖
扫描二维码
随时随地手机跟帖
41
machunshui| | 2008-6-24 17:00 | 只看该作者 回帖奖励 |倒序浏览

实际上,hotpower的做法有点类似于

实际上,hotpower的做法有点类似于候捷.

把老外实现了的东西部分展示出来,仍然不是原创,当然比咱普通人高多了.

只能说比较好玩.

使用特权

评论回复
42
农民讲习所| | 2008-6-24 17:15 | 只看该作者

LS你这是把中国人民和全世界人民对立起来

除了中国,全世界都是老外。

使用特权

评论回复
43
machunshui| | 2008-6-24 17:24 | 只看该作者

老外当然指欧美等科学发达地区的老外

老外当然指欧美等科学发达地区的老外,

不会指的是索马里难民.

记得一位中国的数学家在一次电视讲演中,就提到要承认差距,努力缩小差距.

他的话是别看欧美普通的老外很"笨",找零钱都算的累.

但是老外的那些搞科学的真的很厉害,研究问题有深度,敬业,而且身体还特别好.

使用特权

评论回复
44
农民讲习所| | 2008-6-24 17:30 | 只看该作者

如果是M国的

也可以用LZ这样的话说的。
换任何一个国家都可以。

所以,LS的话有严重的语病:一个国家怎么也不能是世界力量比,M过也不例外。

如果打起仗了,M一个不能单挑全世界的。

也好象说一个人,和其它所有人比起来,绝对没有任何一点优点,换爱因斯坦也一样。

使用特权

评论回复
45
machunshui| | 2008-6-24 17:51 | 只看该作者

看的出来所长很生气

看的出来所长很生气,为了措辞改了又改.

国人最大的问题是现实,

古话云:
万般皆下品,唯有读书高.

读书能做官,做官啥都有.

从外部环境说:

国人要是发现个什么力学的定律,万有引力,有不能当饭吃,左邻右舍谁也不会绝对你这有什么了不起,比当县太爷差远了.

从内因讲:

真正比较自我的国人少(注意:不是自私),自己绝对有价值,不在乎别人的评价的人少.


所以从第二点讲,象hotpower,所长这样的比较自我人还是少了点.

使用特权

评论回复
46
IceAge| | 2008-6-24 20:27 | 只看该作者

又扯到文化劣根性上了

这个问题已经有太多的讨论,在技术论坛里讨论这些没有意义。

To 所长: 
我以前就说过,不要在意任务放在主循环还是中断里,本质是一样的。直接放在中断里,中断后复位stack(关键是这里), 开放中断,中断甚至不返回(可以运行背景任务),这种做法,中断不过是从背景或idle中推出启动任务运行,已经不是传统意义上的中断了。优点有很多,就不多说了。

To wxj1952
"如果从不看书,只独立思考,只顾自己的美感裸奔。那一定会认为",“千万别说,咱什么书都不屑一看“, 拜托,别把搞政治的一套带到技术论坛:先贴标签压低你,比如“从不看书“的自然没有“看书的“高明,呵呵,这样做不好吧。我不知道你看过或是学过计算机结构没有,不过我在读研究生时学过,你所说的离题太远,mcu 没有什么pipeline, cache,更没有保护/线性地址,把 windows 作为标准,极不妥当。

“这是可靠性设计大忌“,那么请说出什么地方,什么原因降低了可靠性,不要信口雌黄。

“中断程序是最高特权级0的系统程序,用户程序是低于任何系统程序的特权级3“,这里是讨论的是mcu, 不是x86。

使用特权

评论回复
47
IceAge| | 2008-6-24 20:37 | 只看该作者

To: yuchole

" 这里的的切片只指把每个task分成不同的时间片吗" , 是的。这种做法相当于非抢占时间片轮巡,比如说mcu 每 20 ms 中断一次,每次把所有任务执行一遍,由于任务被切片,实际上是把每个任务的一个时间片执行一遍,所以在一定时间内看上去像是同时在运行多个任务。

使用特权

评论回复
48
IceAge| | 2008-6-24 20:56 | 只看该作者

一个键盘处理的例子,看看state machine 的威力

假设 mcu 每20 ms 中断一次,每次执行 keyboard().

void keyboard() { (*functions[state])();}
 
FUNTION_POINTER functions[] = { state0, state1, state2, ... stateN }; 
struct StructKey { bool pressed; int value; } key; 

void state0() { key.pressed = false; state++; }
void state1() { if (ScanKeyboard() != 0) state++; } //如果有健按下则去下一状态,利用20ms 间隔去抖。

void state2() { 
  int temp = ScanKeyboard();  
  if (temp != 0) { 
    key.pressed = true;  //有健按下
    key.value = temp;
    state++;
  }
  else 
    state--;   //回 state1
}

void state3() { if (ScanKeyboard() == 0) state++; } //waiting for key releasing.

void state4() { 
  if (ScanKeyboard() != 0) 
    state--; 
  else 
   state = 0; 
}
     
 

使用特权

评论回复
49
农民讲习所| | 2008-6-24 20:59 | 只看该作者

怎么可能不在意?

如IceAge说,为什么不放在主循环中?“中断后复位stack(关键是这里), 开放中断,中断甚至不返回(可以运行背景任务”实际中很多MCU是实现不了的,俺的方法才具有真正意义的普遍性,任何MCU都能轻易实现。

使用特权

评论回复
50
农民讲习所| | 2008-6-24 21:04 | 只看该作者

俺提过任务的实时处理有三个层次

非实时、弱实时、强实时,要保证实时的实时处理,当然是尽可能的利用低一个层次的处理方法。能用非实时处理的不要用弱实时处理。

以前大家争执:按键处理放在主循环中还是中断中?这个答案俺在培训教材中已经给出了:都可以,随着程序规模的减少,尽量用查询,放在主循环中;随着规模的扩大,尽量用中断,查询方式已经不能满足。

使用特权

评论回复
51
IceAge| | 2008-6-24 21:30 | 只看该作者

中断驱动的方法除了没有中断的cpu,任何MCU都能实现

我做过的唯一没有实现的是任天堂的8位机,居然没有中断!

当然了,这种方法在 c 下不太容易,主要是针对汇编。 
中断驱动多任务的方法,你仔细推敲就会发现,这个中断可以被认为立刻就返回了,因为:stack 被复位了,中断被开放了--- 中断返回也就是出栈,开中断等等。

关于可靠性,我特意做过验证,在恶劣环境下,主程序查询方式一天会死一两次,而中断驱动则一个月不到一次。

使用特权

评论回复
52
dld2|  楼主 | 2008-6-24 22:10 | 只看该作者

没有理解楼上的秘技,望详解

使用特权

评论回复
53
kelecola| | 2008-6-24 22:25 | 只看该作者

stack复位是什么意思?

stack复位怎么理解,开中断就是中断可以嵌套是吧?
对IceAge的方法很感兴趣,还望指点一下。

使用特权

评论回复
54
IceAge| | 2008-6-24 22:44 | 只看该作者

stack复位意味着中断不打算回到中断点

一般最后直接进入低功耗 idle 状态。

stack复位就是将stack 指针重置到栈顶,也就是说stack 是全空。这样即便先前stack 有死循环的遗体,那么中断来临时,也会被清理干净。

中断结构如下:

Timer_Interrupt:
   mov SP, #TOP_OF_STACK;    reset stack
   acall _reti;         enable re-enter
   acall setup_timer;
   
   acall task1;
   acall task2;
   ...
   acall taskN;
wait:
   __IDLE;           sleep
   ajmp wait;
   
_reti: reti;


使用特权

评论回复
55
农民讲习所| | 2008-6-24 23:00 | 只看该作者

不好,大大的不好

放着主循环可以实现的,非用用中断去实现。你这和OS的中断调度本质是一样的,没什么特别的含义,标准前后台更容易实现,而且实时处理效率更好,规模扩大时要处理的结构问题更少。

使用特权

评论回复
56
农民讲习所| | 2008-6-24 23:02 | 只看该作者

大概你这样的出发点是要实现OS下的IDLE?

使用特权

评论回复
57
IceAge| | 2008-6-24 23:22 | 只看该作者

所长:这个问题,仁者见仁。

这里的 __IDLE 只是: orl PCON, #01. 

54楼的程序相当简洁。都是在等待定时中断,为何要分开两处,而不是合二为一呢?

使用特权

评论回复
58
hotpower| | 2008-6-24 23:45 | 只看该作者

哈哈~~~终于完成真正的零耗时任务切换,以后和裸奔说拜拜了~

哈哈~~~各位继续论述,俺不打搅了~~~

使用特权

评论回复
59
fsaok| | 2008-6-25 11:01 | 只看该作者

抛一块小砖

希望能引些玉来。

看了一下,猜想IceAge的中断秘诀是中断后,重设环境,然后运行实际的主程序。

感觉我不支持这种做法,因为一个系统本身可能有好几个中断,比如51可能有外部中断,串口中断和时钟中断,概括性不好。

所以,这个问题顶所长。

另一个问题是,为什么要分为几个文件去写。我写我的做法是一个工程如果有可能,我会尽量分多几个文件去写。多个文件,意味着将来要修改的一个文件的长度可能会更少,出错的机会就少。对于我来说,每次写程序就准备着下一次的修改和拿来(所谓重用性),所以,第一次写程序的工作量不怕大,最怕是修改的程序工作量大。

使用特权

评论回复
60
yewuyi| | 2008-6-25 11:14 | 只看该作者

晕,PIC的STACK是不能动的……

使用特权

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

本版积分规则