搜索
bottom↓
回复: 16

djyos的可移植性(四)

[复制链接]

出0入0汤圆

发表于 2012-8-11 16:30:25 | 显示全部楼层 |阅读模式
    设计操作系统,有一个要求,就是不管操作系统内部怎么实现,怎么调整,都不能影响应用程序的运行结果。
    许多操作系统,延时函数所用的时间单位,都是tick间隔,笔者亲见过的一个系统,使用的是VxWorks,其taskDelay函数,就是用tick间隔为单位的。当年把tick间隔设置为1/60秒,而现在,由于cpu速度提高,产品要求也提高了,想1/60秒的tick间隔,不能满足要求了。因此,想提高新产品的tick间隔到1ms,但是,老产品上有数十万行代码需要移植到新产品上,而这些代码,跟tick间隔密切相关,花了很多时间和精力去修改代码和测试代码。在移植时,长了记性了,给taskDelay及其他所有需要OS定时的函数,写了个外壳,把时间单位改为毫秒。
    这也是一个可移植性的问题,操作系统的tick间隔,可以看做是软件的运行环境的一个参数。它使得应用程序不能tick间隔改变了的运行环境中正确地运行。而且,这是操作系统本身的设计造成的。
    遗憾的是,大多数RTOS提供的跟时间相关的函数,都是tick间隔。从面向对象的角度,这是严重错误的,tick间隔是OS运行的内部参数,而且是非常核心的内部参数,国之利器,岂能轻易示人?因此,djyos所有与事件相关的函数,单位都是微秒,例如:
    u32 djy_event_delay(u32 u32l_uS);
    这个函数让事件阻塞,延时u32l_uS后恢复运行。
    bool_t semp_pend(struct semaphore_LCB *semp,u32 timeout);
    这个函数,请求一个信号量,请求不到则阻塞,最长阻塞时间是timeout,单位也是微秒。
    这样,无论OS的tick间隔是多少,这些函数总是能正确地运行,运行结果最多只有微小的差异。这种微小差异,是tick间隔四舍五入造成的。

出0入0汤圆

发表于 2012-8-11 16:47:09 | 显示全部楼层
一般操作系统都有以ms/us/ns为单位的延时函数的,VxWords的nanosleep,UCOS的OSTimeDlyHMSM,windows的sleep,android的sleep。
只是有些操作系统除了绝对时间的延时外,还提供tick的延时,这2种方法都提供而已,并不表示它们没有绝对延时的功能。

出0入0汤圆

 楼主| 发表于 2012-8-11 17:01:20 | 显示全部楼层
jpchen 发表于 2012-8-11 16:47
一般操作系统都有以ms/us/ns为单位的延时函数的,VxWords的nanosleep,UCOS的OSTimeDlyHMSM,windows的slee ...

是的,vxworks是有绝对时间的延时函数的,我说的是那个应用程序,使用了tick间隔。
以tick为间隔的api,只要提供出来,用户就可能这样用,就存在潜在的危险。
而使用这种api,几乎得不到多少额外的好处,最好的方法是,不提供这种api。
还是那句话,api不是越多越丰富越好。

出0入0汤圆

发表于 2012-8-11 18:06:05 | 显示全部楼层
使用tick的延时函数,用处是不大的,为何它存在,是历史遗留问题,因为有些老程序需要它,新程序一般都提倡用绝对延时的。但是不能因为有些函数不够好就马上砍掉,你看windows,里面就保留了好多的旧函数,微软在文档里就说明不提倡使用,建议用另一个函数来替代,但是微软不会马上取消它,因为要和老程序兼容。所以一个操作系统存在某些过时函数并不奇怪,并不是设计者的疏忽,而是为了兼容性的考虑,是有现实的意义的。

出0入0汤圆

 楼主| 发表于 2012-8-11 18:18:41 | 显示全部楼层
jpchen 发表于 2012-8-11 18:06
使用tick的延时函数,用处是不大的,为何它存在,是历史遗留问题,因为有些老程序需要它,新程序一般都提倡 ...

只能说,这些OS,开始时并没有设计好。而djyos因为优先考虑应用程序的可移植性,所以一开始就注意到这个问题了。

出0入0汤圆

发表于 2012-8-11 18:53:20 | 显示全部楼层
djyos 发表于 2012-8-11 18:18
只能说,这些OS,开始时并没有设计好。而djyos因为优先考虑应用程序的可移植性,所以一开始就注意到这个 ...

看您这话说的,要知道VxWorks是在1983年设计开发的,在这么早的系统中有这种问题是很正常的,你的djyos比它晚多了吧,站在巨人的肩膀上,去挑剔巨人的缺点,这有点不大好吧,要这么说,千年虫问题早就不该存在。
系统都是在不断发展的,如果你是VxWorks的总经理,那么在版本的不断升级中,是应该保留这种tick延时函数,还是毅然决然地将它取消呢?就不怕造成用户的损失吗?
我认为保留老函数的做法是有一定道理的,你可以提示用户尽量不用用老函数,但是函数需要保留,这样用户的老程序就不需要去修改了。
向前兼容、向后兼容,这2个特性都需要考虑的。

出0入0汤圆

发表于 2012-8-11 21:22:23 | 显示全部楼层
jpchen 发表于 2012-8-11 18:53
看您这话说的,要知道VxWorks是在1983年设计开发的,在这么早的系统中有这种问题是很正常的,你的djyos比 ...

面向对象的设计思想,应该是60~70年代就成熟了吧,从这个角度讲,vxworks也是站在巨人肩膀上的。
90年代才出的ucosii,一样没考虑这个问题。
那是远的,近的呢?就拿国内这些年新出的OS吧,哪个考虑到这个问题了?目前最出名的,恐怕是rt-thread了,也没有考虑这个问题。
djyos能考虑这个问题,难能可贵的。
虽然都说站在巨人的肩膀上,但站上去后,往哪里看,还是很考验人的。

出0入0汤圆

发表于 2012-8-11 21:46:27 | 显示全部楼层
substation 发表于 2012-8-11 21:22
面向对象的设计思想,应该是60~70年代就成熟了吧,从这个角度讲,vxworks也是站在巨人肩膀上的。
90年代 ...

上面的帖子并不是讨论面向对象这个问题,楼主是觉得应该将那些老旧的函数去掉,不提供给用户,这点我觉得是需要商榷的,因为那些操作系统在提供新函数的同时保留了旧函数接口,是为了兼容性,为了用户的程序能在新版本的操作系统上直接运行。

出0入0汤圆

 楼主| 发表于 2012-8-11 22:01:42 | 显示全部楼层
jpchen 发表于 2012-8-11 21:46
上面的帖子并不是讨论面向对象这个问题,楼主是觉得应该将那些老旧的函数去掉,不提供给用户,这点我觉得 ...

我的意思是,这些api函数根本不该有,而不是要把已经有的去掉。

出0入0汤圆

发表于 2012-8-11 22:05:27 | 显示全部楼层
djyos 发表于 2012-8-11 22:01
我的意思是,这些api函数根本不该有,而不是要把已经有的去掉。

当然这些旧函数最好是没有,但是毕竟它是30年前出生的,那时没考虑这么长远,而且有部分用户用了这个API,那就只好保留了。

出0入0汤圆

 楼主| 发表于 2012-8-11 23:12:52 | 显示全部楼层
本帖最后由 djyos 于 2012-8-11 23:25 编辑
jpchen 发表于 2012-8-11 22:05
当然这些旧函数最好是没有,但是毕竟它是30年前出生的,那时没考虑这么长远,而且有部分用户用了这个API ...


遗憾的是,就如substation兄弟说的,国内最近出的操作系统,这些函数还在。

在他的提醒下,我还特别找了两个国内非常著名的实时操作系统,都是这几年才出来的,居然没有提供绝对时间的延时函数,只有按tick为单位延时的。

出0入0汤圆

发表于 2012-8-11 23:37:14 | 显示全部楼层
考虑到可移植性最好遵守poxis标准,提供poxis标准的接口,这么看似乎以上几个都不满足,至少没有全面遵守。

出0入0汤圆

发表于 2012-8-12 08:09:16 | 显示全部楼层
djyos 发表于 2012-8-11 23:12
遗憾的是,就如substation兄弟说的,国内最近出的操作系统,这些函数还在。

在他的提醒下,我还特别找了 ...

最近几年出的两个国内非常著名的实时操作系统?那是有点问题,不知道是哪两个?怎么会不提供绝对延时函数呢,好奇怪

出0入0汤圆

发表于 2012-8-12 08:13:55 | 显示全部楼层
s200661524 发表于 2012-8-11 23:37
考虑到可移植性最好遵守poxis标准,提供poxis标准的接口,这么看似乎以上几个都不满足,至少没有全面遵守。 ...

能遵守posix最好了,不知道djyos在这方面如何。不过不同的实时操作系统有不同考虑,能遵守posix最好,没遵守posix也没关系。

出0入0汤圆

 楼主| 发表于 2012-8-12 08:53:01 | 显示全部楼层
jpchen 发表于 2012-8-12 08:09
最近几年出的两个国内非常著名的实时操作系统?那是有点问题,不知道是哪两个?怎么会不提供绝对延时函数 ...

你自己找找吧,还是不提名字好一些,当初被人恶意诋毁攻击的事件还记忆犹新。

出0入0汤圆

 楼主| 发表于 2012-8-12 08:55:05 | 显示全部楼层
jpchen 发表于 2012-8-12 08:13
能遵守posix最好了,不知道djyos在这方面如何。不过不同的实时操作系统有不同考虑,能遵守posix最好,没 ...

posix定义了许多线程标准,但djyos不是线程调度,根本没有任何直接操控线程的函数,难以支持posix。

出0入0汤圆

发表于 2012-8-12 16:55:36 | 显示全部楼层
posix不光指线程方面的标准!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-18 22:45

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

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