Chinaunix

标题: (求助)Linux下任务调度 [打印本页]

作者: xingfuhaitun    时间: 2011-08-02 10:57
标题: (求助)Linux下任务调度
之前在LPC3250裸机上实现的嵌入式程序,现在要上Linux操作系统,我想问的是裸机程序已经模拟的任务调度(自己定义了任务优先级、任务队列等等)在Linux系统中怎样处理, 一秒钟分成50份,每份20ms,在这20ms时间内处理任务,如果20ms没用完还可以处理其他

任务,到20ms就转去处理下一个任务,这样一种任务调度。
在Linux中任务调度怎样处理,是不是用多线程来处理,还是定时器什么的。之前的任务调度是否可以交给操作系统来调度,如果可以这一步怎么来做?
刚刚接触LINUX,高手们帮忙看看,提供一些思路?
作者: nazily2150    时间: 2011-08-02 13:20
你把你的裸机程序当作是单个程序来看,如果涉及到硬件操作那就相对复杂好多了(估计你要问的是这个吧?),LINUX不太允许你直接在应用层操作底层的东西。
LINUX就把你这个单个程序进行执行。

像说所说的这种分时间片的任务调度,如果单单是不涉及硬件,完全可以把它写在单个应用程序上,然后进行编译运行。
如果涉及到一些硬件的操作,不妨通过加载一层底层的驱动,把相关的寄存器remap到应用层上,这样用户程序就可以操作了。这是其中一个思路吧。

这是裸机和LINUX的最大区别之一。
作者: xingfuhaitun    时间: 2011-08-02 13:29
回复 2# nazily2150


    硬件操作都通过设备驱动,驱动程序涉及I2C,UART,定时器,什么的,象I2C,UART这些都是私有协议,驱动搞好以后,加载到内核,应用程序操作硬件不也是和文件操作一样,open,什么的,用这些驱动(/dev下),那些任务调度通过多线程或者什么实现,是不是移植到Linux系统中,不用考虑裸机下任务调度的问题,还是比裸机任务调度要方便。--
作者: xingfuhaitun    时间: 2011-08-02 15:34
回复 2# nazily2150


我现在的任务调度情况是这样的:
有20个任务需要在1s内按顺序执行,并且每两个任务之间有空闲时间来接收UART的数据并处理任务,这样一种任务调度。
在Linux中任务调度怎样处理,是不是用多线程来处理,还是定时器什么的。
作者: nazily2150    时间: 2011-08-02 16:51
回复 4# xingfuhaitun


你这样一种情况就把你单片机的整个任务调度写成一个多线程,一旦写成这个样子(单个程序,其实就是单个程序),LINUX就会对它进行调度。

而LINUX中的调度和你改写成单程序后的调度是不同的两个东西,LINUX的调度是在程序与程序之间,而你改写后的是一个多线程的东西,是线程和线程的切换,由LINUX进行管理,不需要你去考虑。而你所说的有足够时间去等待一些数据,这可以通过NEW几个线程,各个线程分配各自的功能模块(相当于是你裸机下的任务),它们之间是通过相关的信号量来进行通讯的。这样完全可以改写。

而且改写的时候不需要考虑切换的东西,只需要考虑上层的东西。例如:线程1:等待N个数据,线程2:从硬件接收N个数据。

这时,线程1如果没有接收到数据的话,则由LINUX自动管理去休眠
线程2从硬件收到N个数据,由LINUX发送给正在等待的线程

这就是你裸机下所做的任务了吧?
作者: xingfuhaitun    时间: 2011-08-02 17:21
回复 5# nazily2150


   1)这20个任务在1s内必须且只能执行一次,并且是按顺序执行的。如在1s内先执行了任务1、才能执行任务2。。。。
  2)当让每个任务不会超过20ms的执行时间;
  3)在每两个任务之间都需要有时间来处理串口的数据。
作者: nazily2150    时间: 2011-08-02 18:40
1)第一个问题归结于时钟(可软可硬)和进程之间的通讯
2)不会超过多少时间看你写的怎么样吧(你不要for()100000000000000000000这么多次就可以了),还有中断不会多就1000%都可以
3)这个不用担心,操作系统执行完你所说的任务,就不管,肯定有时间去做其它的事情。
作者: xingfuhaitun    时间: 2011-08-02 19:14
回复 7# nazily2150


    谢谢你呀。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2