搜索
bottom↓
回复: 12

关于“51DIY超轻量操作系统”这篇帖子的疑问,求高人指点。

[复制链接]

出0入0汤圆

发表于 2011-6-3 19:56:15 | 显示全部楼层 |阅读模式
原帖地址:http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=1398508

其中365楼的网友gshuang1说道:
-----------------------------------------------------------------------------------------------------------------
楼主写的这个程序并不算什么操作系统,每个任务都是不可剥夺的,说白了就是每个任务轮流运行,实质跟以下的代码没有区别的
while(1)
{
     task1();  
     task2();
     task3();
} // 注:task里面的while(1)屏蔽掉
操作系统在宏观上看应该是并行执行的,而不是轮流执行,这种的话如果有个任务运行时间太长的话,其他任务等待时间就很长了
-----------------------------------------------------------------------------------------------------------------

我也是这个想法。因为真的看不出不同之处。比如使用 rainyss 的程序,我打算让两个LED灯 并行地 以不同频率 的闪烁。

比如task1();task2();三个函数里各有一个delay函数。即:

void task1()
{
        
        while
(1)
        {
  
                LED_1 = 1;
                delay1();
                LED_1 = 0;
                delay1();

                task_switch();
        }  
}

void
task2()
{
  
        while
(1)
        {
  
                LED_2 = 1;
                delay2();
                LED_2 = 0;
                delay2();

                task_switch();
        }  
}
  

为了避免覆盖和重入,我设置了两个延时函数。delay1与delay2。静态变量不同。延时不同。

我设想程序运行结果是不会如我所愿的。

下到板子上,果然不行。结果是,LED_1和LED_2交替闪烁。不会产生同时亮的情况。

做到这里,我感觉,从 实现效果 上来说。rainyss 的程序和 gshuang1 的程序没有任何不同的地方。

不知道这个想法对不对。求指点。

假如效果一样的话,rainyss 的程序究竟好在什么地方呢?

操作系统的菜鸟一只。希望得到高手指点。

出0入0汤圆

发表于 2011-6-3 22:26:10 | 显示全部楼层
协作式系统,并且无优先级区别的,运行起来就是这样的,类似while那种

出0入0汤圆

 楼主| 发表于 2011-6-3 22:32:35 | 显示全部楼层
回复【1楼】avr-arm 光芒电子
-----------------------------------------------------------------------

既然while可以实现,那为什么废功夫搞一个复杂的系统呢。优势在哪里呢?

出0入0汤圆

发表于 2011-6-3 22:35:56 | 显示全部楼层
关注一下

出0入0汤圆

发表于 2011-6-4 01:48:07 | 显示全部楼层
LZ你还没有理解task_switch();怎么用。
如果你的delay是
while(i--);
这种形式的话
依照你这么写肯定是顺序执行的,你的实验结果和你的代码是相符的。
因为那个delay语句,CPU还是在这里等着,无聊地等着,等到你这个任务的末尾,才切换,跟顺序执行当然是相同的。
你应该把delay改一下。

你还需要一个时基,用定时器来做,提供系统的绝对时间
比如你每1ms 定时器触发一次,然后累加 task1_Clock 这个变量

然后你的delay改成这样
delay1()
{
   while(task1_Clock < 500)task_switch();  //这句话得意义就是,在没达到你想要的延时之前,切换掉这个任务,让CPU去处理task2或者其他
   task1_Clock = 0;
}



时间长的任务应该在其中多加入 task_switch(); ,那个回复的人肯定没仔细看帖子,帖子里面已经明确的说明了,比如显示驱动这种耗时长的,分开几段,切换出去。
主要就是在你每个任务里面,多用几个task_switch();
不用的话,没意义。

你的这段程序,换上我的delay 就会变成这样,看注释

void task1()
{        
        while(1)
        {  
                LED_1 = 1;
                delay1();   //你原来会在这里等待delay结束,换上我的,就会不断地切换出去,直到达到delay里的设定时间,我的delay是0.5秒,你也可以用变量写
                LED_1 = 0;
                delay1();   //切换到其他任务

                task_switch(); //这句可以不要了,因为我的delay里面已经有了task_swicth
        }  
}
void task2()
{  
        while(1)
        {  
                LED_2 = 1;
                delay2();  //切换任务。不在这里死等
                LED_2 = 0;
                delay2();  //切换任务

                task_switch();
        }  
}

出0入0汤圆

发表于 2011-6-4 06:15:28 | 显示全部楼层
回复【2楼】chandler 钱德勒
-----------------------------------------------------------------------

既然是复杂系统,那不可能用while(1)就解决问题的。
复杂系统涉及到了优先级,还有抢占机制,就你的问题,让两个灯同时亮同时灭(看起来),是没问题的,复杂系统也不需要自己去调用switch什么的。
可以看看我写的全抢占os,支持51.avr。stm8三种平台,适合学习,51指的是at的51,不是s——t——c,

出0入0汤圆

 楼主| 发表于 2011-6-4 10:14:00 | 显示全部楼层
回复【4楼】majianjia 阿嘉^_^
-----------------------------------------------------------------------

非常感谢您的耐心回答,说的非常明白。解决了我的所有疑问。感激!

出0入0汤圆

 楼主| 发表于 2011-6-4 10:15:38 | 显示全部楼层
回复【5楼】avr-arm 光芒电子
-----------------------------------------------------------------------

的确是这样,我才刚刚开始接触操作系统这块,也没系统看过书,很多常识性的东西不懂。见笑了。

出0入0汤圆

发表于 2011-6-4 10:21:41 | 显示全部楼层
这种是 每个任务分配一个独立的堆栈吧? 有没有什么更好的办法呢?是不是uosii也是这个样子

有没有其他的方式来处理堆栈呢

我自己想的是,能不能这个样子:就是在系统的heap区动态建立堆栈,而不是建立为每个任务建立静态数组

每个任务申请时就malloc一块空间做其堆栈,在任务结束的时候free掉这块空间

这样的话是不是RAM利用率会高一点,只是简单的一个想法,没有深入琢磨

请教一下大家 是否可行

出0入0汤圆

发表于 2011-6-5 07:41:32 | 显示全部楼层
回复【8楼】Icyan  
-----------------------------------------------------------------------

这才就是操作系统...你说大部分操作系统都是这样管理ram的,小到你说的UCOS RTT FreeRTOS,大到你现在用的windows ,你打开任务管理器看内存就知道了。
只是一些申请空间,释放空间上各自的操作步骤或者方式有不同,结果都是一样的。
但是在原作者的这几行代码里,实现这个不太可能。作者的本意也不是释放空间,因为51里开不了多少任务,多一个少一个意义不大。
要放在现实里看,比如你的51里开了4个task,其中有两个长期运行,另外两个间息运行,如果要释放RAM,也只是在这两个间隙运行的task里有用处。但是如果这两个task有可能同时运行,你释放那些ram来有什么用?还因此消耗了更多的代码空间和建立任务需要的时间

内存管理在真正的多任务系统里才有实际意义,任务太少了的话,反而是拖慢了整个系统,越复杂越不能做到实时。

出0入0汤圆

发表于 2011-6-9 23:58:55 | 显示全部楼层
回复【4楼】majianjia 阿嘉^_^
-----------------------------------------------------------------------

请问一下 如果LED1灯亮0.5s 灭0.5s的话,当任务切换到第二个时这段时间LED1是不做事的,那么假如LED2也是delay0.5秒,任务切换会不会导致delay1在实际显示时的delay变成一秒呢,在下也是初学者,对这方面不是很懂,还请多多指教啊

出0入0汤圆

发表于 2011-6-10 00:08:57 | 显示全部楼层
那篇帖子介绍的最小os根本就不是os,任务切换时的任务管理根本没有保存寄存器,只要程序切换一次就能跑飞。
这也是ucos必须有asm文件的原因,c语言无法进行寄存器堆栈。
堆栈管理才是os的核心。
欢迎看看俺的MKOS。。。。。。
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4767418&bbs_page_no=1&search_mode=3&search_text=hzr0071&bbs_id=9999

出0入0汤圆

发表于 2012-2-13 23:23:49 | 显示全部楼层
原文里的任务切换本来就不应该在任务里控制,这样长时间的任务本身就堵塞了短时任务的执行时间(说白了根本就不是什么实时多任务系统),应该用定时器做简单的系统节拍并在里面进行任务切换,而任务本身要放弃执行时间时应该只传递一个信号给系统表示要放弃多少个系统节拍就可以,系统就根据这些信号来切换(如果每个信号量都为0,就按顺序来切换,如果信号量不为0就递减并跳到下一个任务)。其实RTX-tiny51就是这样切换的,不过这样的系统的实时性并不高,就像接收红外线,再用LED显示出来就不行了,因为解码过程无法避免中任务切换造成的丢码问题(毕竟解码过程是有时序要求的,时机一旦错过就无法挽回)。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 20:08

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表