嵌入式操作系统的多线程机制研究与实现 |
|
|
睡眠的时间(在内核,一般用嘀嗒数来表示),ThreadCnt用于保存进入睡眠时系统的嘀嗒数。系统嘀嗒数的使用比较普遍。比如,在linux中用jiffies来表示系统嘀嗒数[4]在线程调度器中,之所以只关心ESP寄存器,是因为我们要把所有寄存器的内容都存在堆栈中。对于Cortex-M3内核,当发生中断时,MCU首先会自动将xPSR,PC,LR,R12,R3-R0压入堆栈[5]。对于操作系统而言,这些显然不够,因为我们不能保证应用程序在进入中断时会用到哪些寄存器。所以为了安全考虑我们需要把所有的寄存器压入堆栈。当线程(进程)恢复时,只要把所有的寄存器依次弹出就可以。所以,ESP寄存器非常关键,因而在进程TCB和线程TCB中都要使用一个变量来保存这个寄存器的值。而在调度器返回后,操作系统内核不必去关心它要运行的是进程还是线程,它只会根据ESP,依次弹出堆栈的内容到寄存器。因而与无线程的操作系统相比,我们增加的调度开销几乎只是对线程队列查找的开销。对于ucos系统,采用了一种比特位映像的方法来查找下一个运行的进程,这种方法对于小型操作系统的调度具有很高的效率[6]。
中国论文联盟*编辑。 3 多线程在用户级的实现 除了线程调度,对于应用程序,还需要更多的其它功能来管理线程。为了减少内核的复杂度,对内核实现模块化设计,需要将一些要求不高的功能放到内核之外。在linux系统中,对线程的处理就全部放在用户级。为了便于应用程序对线程的管理,嵌入式操作系统提供了一系列的接口函数供应用程序调用,比如线程创建,线程删除,线程切换,线程延时等。对于这些接口函数,要满足安全,稳定,高效的要求。 3.1 线程的创建 多个线程之间可以共享进程资源,因而线程没有必要设计得象进程那样庞大。一个线程创建函数的例子为int ThreadCreate(void *stack, unsigned int dwStackSize, void *StartAddress, unsigned int Parameter, unsigned int ThreadId)。参数stack指向调用时申请的线程堆栈空间,dwStackSize是线程堆栈的大小,StartAddress是线程运行函数的地址,Paramete 上一页 [1] [2] [3] [4] [5] [6] [7] 下一页 |
|
|
|
上一个论文: 谈操作系统中的死锁问题 下一个论文: 操作系统教学方法研究 |
|