首页 理论教育 Contiki物联网操作系统的多线程应用及状态详解

Contiki物联网操作系统的多线程应用及状态详解

时间:2023-11-20 理论教育 版权反馈
【摘要】:mt 库函数被分成结构无关部分和结构相关部分,应用程序仅需要考虑多线程库中结构无关的部分,多线程库函数在文件夹core/sys中的文件mt.h中声明。MT_STATE_RUNNING 状态表示当前正在执行的线程状态。图3-4线程状态转换图struct mtarch_thread 类型的变量thread 为结构化状态设计,结构化状态通常包括线程执行的上下文。目前多线程库的所有实现都没有使用变量evptr和dataptr。用函数mt_start()启动一个线程后,线程将继续执行直到被系统抢占或主动退出。图3-5多线程举例

Contiki物联网操作系统的多线程应用及状态详解

Contiki 操作系统通过它的mt库支持抢占式线程,mt线程有专用的堆栈段和程序计数器,当切换线程上下文时会保存堆栈和程序计数器内容。mt 库函数被分成结构无关部分和结构相关部分,应用程序仅需要考虑多线程库中结构无关的部分,多线程库函数在文件夹core/sys中的文件mt.h中声明。

每个线程都由一个struct mt_thread类型的对象表示,其定义如下:

线程状态转换图如图3-4 所示。可以看出,线程在整个生命周期中有三种不同的状态。一旦应用函数mt_start()启动线程,mt 库将设置线程状态为就绪MT_STATE_READY,这种状态表示线程准备执行,也就是可以通过在线程上应用mt_exec()函数运行线程。一旦通过使用函数mt_yield()让出了控制权,进程状态重置为就绪状态。MT_STATE_RUNNING 状态表示当前正在执行的线程状态。MT_STATE_WAITING 和MT_STATE_PEEK 是目前未使用的状态。MT_STATE_EXITED是线程的最终状态,表示不可能再执行的线程。

图3-4 线程状态转换图

struct mtarch_thread 类型的变量thread 为结构化状态设计,结构化状态通常包括线程执行的上下文。例如,在msp430的libmt端口中,结构化上下文存储专用栈以及指向专用栈顶部的指针。目前多线程库的所有实现都没有使用变量evptr和dataptr。多线程API函数如下所示:上面列出了多线程API 函数,函数mt_init()初始化线程库。如果不再需要线程库,调用函数mt_remove()允许线程库释放内部状态后被卸载。调用函数mt_start()启动线程,该函数的第一个参数thread是一个指向已分配但未初始化空间的指针,mt_start()函数将在该空间存放用于线程函数的内部状态;该函数的第二个参数是类型为void(*)(void*)的函数指针,当开始执行线程时将调用该函数;第三个和最后一个参数是指向数据的指针,线程执行时数据将被传递给函数。如果调用线程时不需要传递数据,data 参数可以指向NULL 值,调用的函数可以忽略该参数。(www.xing528.com)

Contiki 操作系统进程可以调用函数mt_stop()停止线程,该函数以指向要停止线程的指针作为参数,这样可以确保停止线程并且清除与线程相关的内部信息。执行该函数后,不再使用struct mt_thread 对象的内容,并且也可以通过调用的进程删除struct mt_thread对象的内容。

用函数mt_start()启动一个线程后,线程将继续执行直到被系统抢占或主动退出。抢占式执行由系统控制,因此超出了API 编程内容的范畴。主动退出(yielding)是由线程本身引起的行为,通过这种方式,线程释放线程的系统控制权,并且允许系统执行主系统线程,线程调用函数mt_yield()完成“主动退出”操作,该函数没有任何参数。当首次对线程调用mt_exec()函数时,它调用由mt_start()函数的第二个参数指向的函数,对函数mt_exec()的调用将恢复线程上下文,并且继续从线程上次主动退出或抢占的位置开始执行。下面的例子说明了如何建立一个进程,进而创建一个线程,运行结果如图3-5所示。

图3-5 多线程举例

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈