免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2143 | 回复: 2
打印 上一主题 下一主题

关于Linux内核定时器,求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-12 14:25 |只看该作者 |倒序浏览
关于Linux内核定时器的基本原理在这一片文章里面讲的比较清楚http://simohayha.iteye.com/blog/507576
我现在是要做这么一个应用编程(在应用层实现)在应用层做一个模拟的内核的定时队列,然后调用内核的时钟函数,每隔一段时间对定时队列中挂载的各个任务函数进行移动,时钟到期后则调用执行,要实现内核定时器的状态显示报告,挂载任务和卸载任务的接口,以及内部的定时管理过程
我是菜鸟,现在在vc++6.0里面做,不知道怎么下手,时间比较紧迫,希望各位可以指点指点.

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
2 [报告]
发表于 2011-12-12 15:14 |只看该作者
回复 1# 范特乔

你的这个项目不难, 这样做:
假定你有5个tasks, task0~task4. task0 是后台,只要没有其他任务运行它就运行,task1 是每10ms运行一次, task2是每50ms task3 每100ms运行一次; task4每1000 ms 运行一次;task0优先级最低。 每个task代码大致这样

task0(void)
{
    while(TRUE){  
// 运行后台任务
}
}

task1(void)
{
    while(TRUE){  
   PEND(10_MS_EVENT);
    //接着运行task1的任务
}
}

task2(void)
{
    while(TRUE){  
   PEND(50_MS_EVENT);
    //接着运行task2的任务
  }
}

task3(void)
{
   while(TRUE){  
    PEND(100_MS_EVENT);
    //接着运行task3的任务
  }
}

task4(void)
{
   while(TRUE){  
    PEND(1000_MS_EVENT);
    //接着运行task4的任务

  }
}


用一个标准timer, 来post event唤醒各个task. 在标准timer的ISR里
timer_isr()
{
   每10ms, POST(10_MS_EVENT);
  每50ms, POST(50_MS_EVENT)&POST(10_MS_EVENT) ;
  每100ms, POST(100_MS_EVENT)& POST(50_MS_EVENT)& POST(10_MS_EVENT);
  每1000ms, POST(1000_MS_EVENT)& POST(100_MS_EVENT)& POST(50_MS_EVENT)& POST(10_MS_EVENT);
}

这样你的系统里所有的任务都按你指定的周期跑起来;CPU空闲的时候就运行task0.
你可以改变系统里task数目和周期。但优先级有讲究;跑得快的任务优先级要高。

论坛徽章:
0
3 [报告]
发表于 2011-12-12 15:27 |只看该作者
回复 2# linuxfellow

回答的很好,很细心,非常感谢,我可以+你qq么?可能还会出现一些问题,需要你们的指导.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP