关于时间片轮转法的疑问

[复制链接]
6401|13
 楼主| happystar 发表于 2007-2-28 18:23 | 显示全部楼层 |阅读模式
大家好啊,我的单片机有好几个任务,想实现他们之间实时问题。考虑用时间片轮转法来调度他们。因为我不考虑移植别的OS了,所以只好自己写调度程序了。但是问题是:要想实时,选用的时间片不能保证每个任务都能执行完毕。比如:任务1和任务2在这个时间片内都没有完成,那么怎么来保护它们的上下文呢?在网上看大家写的一些51小调度系统也没有怎么明白。
希望各位前辈指导,谢谢拉。
谈的元 发表于 2007-2-28 19:30 | 显示全部楼层

将任务撤成更小的呀

 楼主| happystar 发表于 2007-2-28 20:51 | 显示全部楼层

to 谈的元

这样不好啊,失去了时间片调度的意义了。在我这个程序里也不好实现呢。
sharpxcb 发表于 2007-2-28 21:59 | 显示全部楼层

不妨试试

  把你的整个程序做成几个MS内一个周期的实时循环,各任务的时间片以累加计数器的方式判断时间到否,那样更短时间内的实时循环运行!
 楼主| happystar 发表于 2007-2-28 22:37 | 显示全部楼层

to sharpxcb

哦,有点明白了。比如我目前本来有2个任务。
task1:键盘扫描,完成时间大概需要30ms。
task2:采集处理数据,完成时间大概需要100ms。
那么我把时间片定为35ms,则task1能在一个时间片完成任务。而把task2分成3个任务(task2,task3,task4),time=0是全局变量,taskn_flag为任务执行的标志
在定时器T0中断里中,每35ms中断一次
void time0_isr()interrupt1{
......
++time;
if(time==1)task1_flag=1;
else if(time==2)task2_flag=1;
else if(time==3)task3_flag=1;
else if(time==4)task4_flag=1;
else time=0;
.......

void main(){
  if(task1_flag){
  ....
  }
  if(task1_flag2).....

但是如果先前的task2执行时间是500ms呢?这样是不是要分成好多任务呀?而且这样键盘扫描频率也太低了。
但是可以在这些分成的小任务里加上扫描任务如if(time==20)task1_flag=1; 
我想这样行不通呀/
forthlab 发表于 2007-3-1 10:16 | 显示全部楼层

采用状态机的原理,状态细分一下

用状态机,键盘扫描只要很CPU短的时间。
fsaok 发表于 2007-3-2 05:50 | 显示全部楼层

.

键盘扫描根本就用不着一个时间片去处理它
xwj 发表于 2007-3-2 08:21 | 显示全部楼层

是的,应该采用状态机

以尽量释放CPU时间

键盘扫描都要30mS???
感觉LZ还没掌握方法哦
eagle758 发表于 2007-3-2 08:30 | 显示全部楼层

状态机的原理

大虾们:
   解释下什么是状态机的原理?
工控秀才 发表于 2007-3-2 08:48 | 显示全部楼层

会用就行了,管它什么机

我用过非抢占式和抢占式的操作系统,现在写小程序一般也用分时调用,感觉处理起来方便多了!
computer00 发表于 2007-3-2 09:27 | 显示全部楼层

任务切换保护上下文会需要很多内存开销的

键盘扫描可以使用定时器中断去处理。

IC1008 发表于 2007-3-2 09:52 | 显示全部楼层

按键扫描30MS 你不是把等待也做进去吧

那么时间片还有什么意义 呵呵
1dqmoon 发表于 2007-3-2 22:27 | 显示全部楼层

键盘扫描不算一个单独的进程

用其他方法实现键盘功能吧,没必要使用时间片来轮转
 楼主| happystar 发表于 2007-3-2 22:45 | 显示全部楼层

谢谢楼上各位指教

我是拿键盘扫描打个比方的,意思是一个30MS的任务。我里边的键盘和数码管扫描都是放在T0中断里的,键盘消陡的20MS延时也是用于扫描那些数码管,而数码管的延时用于主程序执行时间片的。还有一些别的中断,置位了一些标志。在主程序里我参照了一些状态机的概念。但是老树写的那片**实在是难以理解啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

409

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部