打印

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

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

wxj1952 技术问题尽管质疑

我收回“一只破宏,雕虫小技“,并再次为此事道歉。

我再次申明:请限于技术讨论,我几乎从不编辑我发过的帖子,请不要把我没说过的话强加到我头上,你可以再去查查我过去的帖子。关于宏问题,你如果认为所有公司的宏汇编都是以Intel为蓝本的,那么就是,如果你认为我写不出来,那么我写不出来,就此打住。

解答78楼的问题:
我不知道你没有看明白没有 中断驱动+状态机 这种结构运行原理。
1)timer interrupt 一般为5,10,20 ms,不会如此之长的240ms. 超过20 ms的task, 可以拆分成若干个状态。
2) call task2~call task8没有运行要求,每个task 仅仅消耗几条指令,对于使用了array, list,还可以直接把相应的函数指针清 0.
具体应用中,一般把state 0 作为直接返回的空状态,如果需要任务运行,只要简单的让 state = 1。

另外,wxj1952 你能否贴出一段你的程序,比如键盘处理,或是一些mcu 经常用到的模块,然后我可以给出 中断驱动+状态机 的做法,让大家比较一下不同结构的优点和不足。




使用特权

评论回复
82
IceAge| | 2008-6-27 01:06 | 只看该作者

另外,我很好奇

“书上就不会称这是最“逊”的模式“,能否告知是哪本书?在哪一页?

如果作者真的这么说了,那么说明作者思路很狭隘。不过,最好请你不要无中生有。 

使用特权

评论回复
83
wxj1952| | 2008-6-27 08:47 | 只看该作者

好 ,我接招!

记住这个标签,我去查查是第几页。当然就是那本85元的推荐书。   
    英国作者在你眼里思路当然很狭窄。他的书销遍全世界。您老人家不服气吧,“这根本是个错误。”这么差的书竟然卖85¥。我写的怎么一本也卖不出去,(有没有有啊)这是什么世道。
   有些话,你不用直接说出来别人也知道你是那么想的。因为你的言行就是那么表现出来的,所以算不上无中生有。

另外,作者留下了个人邮箱。“希望读者看过之后,能给我些意见。无论褒贬,我都将认真回复。”

你有什么看不起他的地方,尽可以写信和他交流。“无论褒贬,”您大概是只能褒不能贬的人。这就是人和人之间的差别。

下面认真谈纯粹技术问题,请像我一样接招。
“另外,wxj1952 你能否贴出一段你的程序,比如键盘处理,或是一些mcu 经常用到的模块,然后我可以给出 中断驱动+状态机 的做法,让大家比较一下不同结构的优点和不足。”

好 这个我绝对接招!
但是别像上次一样,跟我后面学就行,结果写出来的程序跟我一摸一样,(zlg那个,还有if那个,现在倒反而说是你送给我的。真是莫名其妙!先把这件事解释清楚好不好。我对这种行为除了哭笑不得还能怎么样?这次请版主、所长、LZ_d1d2一起做裁判好不好!)马上我就开始。

使用特权

评论回复
84
zhuhai2004| | 2008-6-27 09:15 | 只看该作者

支持所长的方法。

IceAge老师:
1、如果在时钟定时中断服务程序进行任务调度、用C语言写是否会产生大量的堆栈;其他中断又如何快速被响应,现在做产品估计都会有几个个其他的中断吧(是否要中断嵌套?)。

使用特权

评论回复
85
IceAge| | 2008-6-27 09:35 | 只看该作者

请帖出原文,或给出连接

最好把作者的 email 也贴出来,我会直接同作者讨论,并在 icbbs 上公开,希望不是你曲解作者的原意。

关于那个宏,我给出的连接 zlg51 技术说明里就有,TI 5x 也有,我不过copy 出来,总共几行,要称作“结果写出来的程序“,未免讲笑了. 你可以再回顾一次:
https://bbs.21ic.com/club/bbs/ShowAnnounce.asp?id=2993082

键盘的处理过程我已经贴出来了,所以不存在我跟你学的问题。只要你能把这个过程能够做得更清晰简洁,就行了, 你不会没有键盘的处理过程程序吧

使用特权

评论回复
86
IceAge| | 2008-6-27 10:22 | 只看该作者

to: zhuhai2004

不会。对于mcu 来说,调度一词太沉重,因为mcu 程序量一般比较小,任务并不多,基本上不会采用相当消耗资源的 “调度“,多数情况下,固定顺序,顶多使用函数指针数组就能处理。如果确实需要"调度“,那么建议使用 os. 

使用特权

评论回复
87
wxj1952| | 2008-6-27 10:23 | 只看该作者

纯粹技术问题

老师对armnew写的程序果然让人服气,老师难得出手,一出手就见真功夫。我把它完善如下:

Timer_Interrup:
  JBC task_busy, _taskbusy ;   wxj1952修改
   reti   ;  (;wxj1952修改)   //正常返回到中断点

_taskbusy:
;Timer_Interrupt:
   mov SP, #TOP_OF_STACK;    reset stack
   acall _reti;         enable re-enter
   acall setup_timer;
   
acall task1;
   acall task2;
   ...
   acall taskN;
   SETB  task_busy    ;  (wxj1952添加)
 
wait:
   __IDLE;        sleep
   ajmp wait;
   
_reti: reti;


意思没错吧。确认一下,有什么不对可以修正。

我先替老师讲解一下这个程序的功能:由于如78L所说的那样,这种模式的tick不好计算和设置,若按每任务最坏执行时间设置tick ,系统实时响应太慢。

    于是,可以把tick设置的小一点。例如,可以取一个最快与最坏执行时间的中间值,假定20ms。
    这又带来新的问题,正如armnew所质疑的:

“请问IceAge,所有任务每次运行的时间必须远远小于mcu的中断间隔吗,如果每20ms来次中断,所有的运行时间应该在多少以内才安全呢?如果这时其他的中断比较频繁,有些任务会不会执行不到啊?”


tick太小,节拍中断频繁,每次中断都重置SP为初值,导致系统从头task1开始运行,会不会使后面的任务taskN-1/taskN总是运行不到?

to armnew: (老师答复)
“中断比较频繁,有些任务会不会执行不到" 会的,这是没有os所要付出的代价之一。解决方案之一是,设置一个task busy 标志, 让中断正常返回。”

Timer_Interrup:
   jnb task_busy, _taskbusy
   reti    //正常返回到中断点
_taskbusy

********************************************************************

这段改进程序设置了一个“所有任务运行完标志task_busy,  “当超循环最后一个任务taskN执行完毕后,设置task_busy 标志有效,通知节拍中断可以修改SP从头开始一轮新的循环。如果tick中断发生时,系统还没进行到最后任务taskN,标志task_busy为“0”,节拍中断总是正常返回到中断点继续运行。

我说得对么?老师确认一下,有什么不对可以指正、修正。

使用特权

评论回复
88
IceAge| | 2008-6-27 10:37 | 只看该作者

没错

不过,在实际应用中,我尽量不这么做,因为会丢失节拍,可能会对其他依赖节拍的任务产生干扰。这时,需要程序员自己合理的把长时间任务分成若干个小任务,虽然不容易,但总能做到

使用特权

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

此外,这么做会失掉一个极大的优点

就是能从死循环中退出,这点对于没有 watchdog 的mcu 及其重要。

使用特权

评论回复
90
wxj1952| | 2008-6-27 10:50 | 只看该作者

老师请看好日期,谁先发表!

https://bbs.21ic.com/club/bbs/list.asp?Page=&boardid=11&t=2985643&p=5&tp=%B8%F8%B4%F3%BC%D2%B3%F6%B5%C0%CC%E2%B0%C9

还有一个IF,正在找。

wxj1952 发表于 2008-6-8 10:08 侃单片机 ←返回版面    


97楼: xwj说俺瞎嚷嚷,能不能再嚷嚷一个与别人不一样的出来?

这里跟优化没有任何关系。而且适用各类宏汇编器。

#pragma small src

#pragma asm
NOPX  MACRO NUM
    REPT NUM
    NOP
    ENDM
ENDM
#pragma endasm


void main(void)
{
__asm NOPX 5   // 输出5个NOP.

while(1);
}

有没有和我一样的?那是我的悲哀。那就再写一个。




* - 本贴最后修改时间:2008-6-8 20:31:10 修改者:wxj1952

使用特权

评论回复
91
农民讲习所| | 2008-6-27 10:52 | 只看该作者

如果是这样,为什么不直接放到主循环中?

差别就是时钟节拍而已,主循环的节拍是极小,不是固定的而已。

使用特权

评论回复
92
wxj1952| | 2008-6-27 11:06 | 只看该作者

89楼肯定语气说一下,有缺陷可以改。别模棱两可。

“我个人喜欢全部放在定时中断里,主程序仅仅是一条休眠指令,好处是:1)低功耗 2)高可靠性,只要定时中断不被关闭,那么即便一个task 进入死循环,也能退出。要注意的仅仅是reset stack, 开放中断(对51,必须调用一次 reti) ”

*******************************************************************


这是您推荐给armnew的程序,怎么老改口。说模棱两可的话。

到底对不对,可不可行?不行,您马上修改,否则,就是这种模式的缺陷。
“应用中我一般不这么做。”你到底怎么做的,你不是说这种模式好处多么?不是低功耗,高可靠性么。怎么又不这么用了?我现在认真和你讨论问题呢,还请了版主、LZ、所长。


使用特权

评论回复
93
zyok| | 2008-6-27 11:32 | 只看该作者

又干起了,作个记号好学习

使用特权

评论回复
94
wxj1952| | 2008-6-27 11:49 | 只看该作者

老师再请看好日期,谁先发表!

wxj1952 发表于 2008-6-12 13:39 侃单片机 ←返回版面    

33楼: “我要面对的问题比这复杂一千倍!” 

“种种宏问题,本来就不是什么问题。”

“只要你能把任何,我说的是任何,宏汇编的技术说明发上来,我可以在看过说明后两分钟能写出这个宏。”

“雕虫小技,不值一提。”
*********************************************************************

吹牛吹了快20个小时了,连点动静都没有。竟然连程序看都没看懂。到兰州大学咨询教授去了吧。
我不可能500元等您咨询这个那个。等到现在已经没劲了,知道您什么水平就行了。
嘴皮子上的功夫。“我要面对的问题比这复杂一千倍。”

“我给11楼一个建议,您如果用循坏语句,那肯定没劲,别人都用了2 次了。
跟别人一样最没劲。来点新鲜的,比如说for、if....等等跟人不一样的。让大家学习学习。”

结果又等了快20小时了。算了吧,西北高手,别再吹了吧。
还是我自己提示您一个:让您再做一回“二”。

NOPX MACRO num
   PARM SET num
       IF PARM>0
    NOP
    PARM SET PARM-1
    NOPX PARM
    ENDIF
ENDM

高手又要开始表演了,“这种雕虫小技也要拿来自以为是?早知道我10个都写出来了。”哈哈...当老二难受吧,给你20小时的机会做第一,可惜现在又得跟我后边学着照抄啦。...





 
 

使用特权

评论回复
95
dsn0327| | 2008-6-27 12:56 | 只看该作者

可靠性是很重要

做产品嘛,可靠性是很重要的.
到目前没看到这方面的具体讨论.
写程序时想到了可能会崩溃,可想不出好方法来避免.

使用特权

评论回复
96
wxj1952| | 2008-6-27 19:19 | 只看该作者

89楼少写了一个字。

此外,这么做会失掉一个极大的优点 

就是“不”能从死循环中退出,这点对于没有 watchdog 的mcu 及其重要。

***********************************************************

老师不好办了:
程序缺陷很明显,当某任务出现故障(或干扰或崩溃)时,程序运行不到taskN,也就不能置位task_busy,于是节拍中断总是返回到故障循环点——死机。

那么,tick设大了240ms是瞎扯蛋,设小了又失掉了老师最为得意的模式所具有的自恢复能力、可靠性。还有第三种方法吗?

我们都是思维狭窄的笨蛋。

使用特权

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

wxj1952, 我只能说你确实是个 笨蛋

我不是你的老师,也不会再给你这个人品卑劣的人讲解技术,你没有这个理解能力只能怪你爹妈。

使用特权

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

什么叫无耻,都在这个帖子里:

使用特权

评论回复
99
jack.king| | 2008-6-28 00:58 | 只看该作者

怎么吵起来了?

使用特权

评论回复
100
aihe| | 2008-6-28 01:28 | 只看该作者

运气,100楼

http://www.autooo.net/autooo/DCS/jishu/2007-09-14/12947.html
上面地址是虚拟令牌网的应用

图是IBM令牌网卡

使用特权

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

本版积分规则