14510|15

4996

帖子

19

TA的资源

裸片初长成(初级)

楼主
 

时间片轮询法的应用 [复制链接]

 

        上次发帖《浅谈单片机应用程序架构》后,很多网友都希望有下午,详细说明3中架构的具体应用。而在这一段时间以来本人一直在考虑写这样一个帖子,但是由于工作的原因基本上没有时间写这样一个贴。今天有点空余时间,就这里谈谈,本人在最近几个项目中使用《时间片轮询法》的一些心得。至于网友希望获取3中架构的应用实例,只能看以后有时间后来编写了,希望大家支持与理解。

 

       对于时间片轮询法的具体架构在这里就不在阐述了,需要了解的网友可以去看上次发的架构贴,里边已经说的很详细了,不明白的地方请留意,本人会尽量说明白。

 

       在发架构贴之前本人也从来没有使用过时间片轮询法,一直都只是知道这个概念。所以上次发的架构贴也是本人的一种摸索,但是架构一定的正确可行的,而且它的优势也是很明显的。

 

       自从发了架构贴以后,本人的项目开发均使用了时间片轮询法进行开发,刚开始遇到了不少问题。让我对此法有些怀疑了,觉得还是需要操作系统才能实现真正的任务级编程。大家都知道操作系统中,并不需要我们去了解任务之间的切换。而我们只有划分好任务,以及任务之间的通讯就可以了。但是时间片轮询法中所以的任务之间的通讯,任务之间的切换等等都必须是程序员来实现,那么在使用此法时应该注意些什么才能实现真正的任务级编程呢?

 

      在说明注意事项之前,本人要特别说明,你要相信操作系统能实现的时间片轮询法一定能实现。同样能让人感受到多任务的快感,只是这些都直接考验了一个编程人员的技巧以及思维(需要的是多任务的思维方式)。

 

注意事项:

 

    1. 任务的划分:任务一定要划分的非常合理,尽量做到任务的相对独立;

    2. 任务的优先:一定要注意任务优先级的设计,把需要及时处理的任务排到任务的最前面;

    3. 任务的执行:任务的执行一定要尽量的快,一定要保证在毫秒级,否则任务还没执行完,其他任务都再等,就到不到实时系统的要求,也谈不上多任务了;

    4. 时间的划分:时间片的划分是整个系统的关键,一定要保证任务在需要执行的时候能够进入该执行的任务中,否则就不能实现真正的时间片轮询了。

[ 本帖最后由 zhaojun_xf 于 2012-3-4 08:15 编辑 ]
此帖出自NXP MCU论坛

最新回复

  详情 回复 发表于 2018-6-11 14:22
点赞(2) 关注(5)
个人签名我的博客
 

回复
举报

4996

帖子

19

TA的资源

裸片初长成(初级)

推荐
 

通过以上的介绍,我想大家多觉得特别抽象吧。下面就针对以下几点举例说明:

 

    1. 任务的划分:

    

任务的划分并不难,你需要先全面的了解你的项目是要实现什么功能,把其划分成多个功能模块,每一个模块就是一个任务,每一个任务对应一个函数。

 

例如一个时钟产品,一般由:按键、显示、时间、闹铃、菜单(设置/查询等)等组成。那么我们可以把其划分成5个任务。

 

    2. 任务的优先:

 

同样通过以上事例来说明任务优先级,可能划分的方法有很多种,而且看不出很大的区别,这里只是本人认为最为合理的方式:

   

    A. 时间,这里的时间就是从时钟芯片中获取时间;

    B. 闹铃,获取时间后应该首先判断是否是设置的闹铃时间,如果是就进行闹铃提示,否则,退出执行下一个任务;

    C. 显示,显示时间,如果有闹铃,则显示闹铃标志;

    D. 按键,判断是否有按键,如果有就进入相应的操作;
    E. 菜单,通过按键进入相应的菜单,如果没有按键,就不执行菜单任务直接退出。

 

这就是整个时钟产品需要实现的整个过程,任务之间的通讯已经任务之间的相互制约都是通过全局变量实现的,例如进入时间设置等时,就没有有必要实现时间的读取,闹铃的判断,以及时间的显示。这时只需要执行按键任务以及菜单任务即可,直至退出为止。这里需要说明的是不执行的任务是在判断任务执行情况后不具体执行任务代码,并不是一直在菜单程序中死等等,直至菜单退出。因为那样的话就不是真正的多任务级了,也谈不上时间片了。

 

    3. 任务的执行:

 

       任务的执行一定要尽量的快,一定不能因为某个任务需要等等特殊的东西,而影响的其他任务,也不能在任务中调用大的延时函数,一定要保证任务的运行速度,要知道每一个任务的具体执行时间。例如上例中,绝对不能因为等等按键的释放而导致其他任务的不运行。那么怎么消抖呢?这个方法有很多,你可要通过利用两次按键任务是时间实现消抖,例如第一按键后,你做个标志,表示有键,但是不执行菜单,可要通过第二次进入按键任务判断,是否是按键的按键,还是误按,这种情况下就必须要保证按键任务的运行时间在消抖也许的时间内容,例如20ms。

 

      再例如:在应用GPRS时,由于GPRS发送指令到接收到应答的时间都是秒级的,所以一定不能发完指令后,一定要等到应答才执行下一个任务,而是通过双线程的思想,把GPRS的发送和接收分为两条线,一条发,一条接,而这两条线之间都是同样全局变量来连线。每次进入GPRS任务时都判断是否由发送和接收,如果有发送就发送,有接收就判断是否为上次发送的应答,如果是就可以继续发送了,否则继续等待应答的接收,以最快的速度实现任务的执行。

 

    4. 时间的划分:

 

     时间片的划分尤为重要,需要保证每一任务都能在该执行的时间内运行。就以时钟事例来说,显示和获取时钟一般一秒一次就可以了,如果你有时钟冒号“:”的显示,那么1秒必须执行两次以上才能保证显示的正常。当然在系统允许的情况下可以尽量多允许几次,但一定最低的允许次数。像按键可以使用20ms作为任务的时间片,因为一般按键的消抖时间为20ms,那么时间片划分为20ms完全可以保证即不漏掉按键,也不会误读按键。

[ 本帖最后由 zhaojun_xf 于 2012-3-4 08:56 编辑 ]
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

5

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
不错,学习了,但是我还是想问问,一般的系统你们编程下来多少K,我的程序量好多,特别怀疑是自己的算法问题
此帖出自NXP MCU论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

4
 

回复 板凳 yesiqi 的帖子

这个没法回答,不同项目不同
此帖出自NXP MCU论坛

点评

。。。 版主,您好,有看了下您时间片轮询的架构,恨棒 但是我有一点不理解,望您指点迷津:就是您的时间片分成,20,30,60MS 分别对应的是按键,屏幕状态,和读取时钟,定时器没进一次,时间递减,您这个递减  详情 回复 发表于 2013-7-13 17:36
 
个人签名我的博客
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

5
 

。。。

版主,您好,有看了下您时间片轮询的架构,恨棒

但是我有一点不理解,望您指点迷津:就是您的时间片分成,20,30,60MS 分别对应的是按键,屏幕状态,和读取时钟,定时器没进一次,时间递减,您这个递减是每个任务的时间都递减,那么在第二轮递减的时候就出现按键,屏幕状态和读取时钟的标志位都运行,那么这样子的确没问题,因为在下一次进入任务前,有20MS的时间让单片机跑完这3次任务没问题,可是我有一丝丝疑问就是如果任务多的话,时间片不管怎么划分,都会出现2个或者多个任务在一个片内执行,那这样的话,就失去时间片的意义了,我的问题就是,如果有5个或者以上的任务的话,时间片具体划分的时间是多少?谢谢
此帖出自NXP MCU论坛
 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

6
 

回复 4楼zhaojun_xf 的帖子

。。。

版主,您好,有看了下您时间片轮询的架构,恨棒

但是我有一点不理解,望您指点迷津:就是您的时间片分成,20,30,60MS 分别对应的是按键,屏幕状态,和读取时钟,定时器没进一次,时间递减,您这个递减是每个任务的时间都递减,那么在第二轮递减的时候就出现按键,屏幕状态和读取时钟的标志位都运行,那么这样子的确没问题,因为在下一次进入任务前,有20MS的时间让单片机跑完这3次任务没问题,可是我有一丝丝疑问就是如果任务多的话,时间片不管怎么划分,都会出现2个或者多个任务在一个片内执行,那这样的话,就失去时间片的意义了,我的问题就是,如果有5个或者以上的任务的话,时间片具体划分的时间是多少?谢谢
此帖出自NXP MCU论坛

点评

这个是没有问题的,所以要保证每个任务能够尽快完成,千万别再任务里边调用死循环延时,而且任务的划分一定要合理,不能划分太多,就是操作系统也是一样的。  详情 回复 发表于 2013-7-13 19:39
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

7
 

回复 6楼jiangdu 的帖子

这个是没有问题的,所以要保证每个任务能够尽快完成,千万别再任务里边调用死循环延时,而且任务的划分一定要合理,不能划分太多,就是操作系统也是一样的。
此帖出自NXP MCU论坛

点评

您能给我列举下除了20,30,60之外的时间片吗?谢谢  详情 回复 发表于 2013-7-13 19:47
 
个人签名我的博客
 
 

回复

3

帖子

0

TA的资源

一粒金砂(中级)

8
 

回复 7楼zhaojun_xf 的帖子

您能给我列举下除了20,30,60之外的时间片吗?谢谢
此帖出自NXP MCU论坛

点评

这个完全根据需要设置,值完全可以是10的任何倍数,例如GPS解码时间可以设置为1s一次。  详情 回复 发表于 2013-7-14 06:58
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

9
 

回复 8楼jiangdu 的帖子

这个完全根据需要设置,值完全可以是10的任何倍数,例如GPS解码时间可以设置为1s一次。
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

10
 
感觉楼主的语句不太通顺的
此帖出自NXP MCU论坛
 
 
 

回复

133

帖子

0

TA的资源

一粒金砂(中级)

11
 
《时间触发嵌入式系统设计模式》
此帖出自NXP MCU论坛
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(初级)

12
 
时间片轮询的应用,MARK
此帖出自NXP MCU论坛
 
 
 

回复

23

帖子

0

TA的资源

一粒金砂(中级)

13
 
版主你好,我看了你的《时间片轮询法》的帖子,感觉很好,也特别希望自己可以用这种方法去编写程序。可是看完你上次写的架构之后,一直以来有一个疑问,就是所谓的时间片轮询法,是不是设置的是每个任务执行需要的时间片段,该任务在设定的时间片段内去完成要完成的任务。还是任务和任务之间切换所需的时间片段,比如你上次写到的按键消抖需要20ms,现在有个任务执行完毕,需要扫描按键状态,就设置一个时间片断20ms,然后在去执行按键扫描。不知道我的这两种想法应该是哪个,他们应该是不一样的吧!一直想不明白,所以麻烦帮忙解答,谢谢!
此帖出自NXP MCU论坛
 
 
 

回复

4996

帖子

19

TA的资源

裸片初长成(初级)

14
 
一定要理解时间片轮询的意思,是每个人每隔一定的时间去轮询执行一次,执行的时间理想为极小,按键消抖假如为20ms,你可以第一次读取到按键时标记一下,在过20ms再次执行这个按键任务时,再读按键确定按键是否按下,通过两次读取,间隔20ms,获取按键消抖,单片机不用等待20ms,按键任务的时间片设为20ms就可以了。
此帖出自NXP MCU论坛
 
个人签名我的博客
 
 

回复

23

帖子

0

TA的资源

一粒金砂(中级)

15
 
哦,明白了。谢谢!
此帖出自NXP MCU论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

16
 
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表