无源节点上一种多任务内核的设计与实现

2018-09-29 02:38文豪高宏程思瑶赵旭
智能计算机与应用 2018年4期

文豪 高宏 程思瑶 赵旭

摘 要:物联网作为目前研究的热点问题之一,在长期泛在方面却存在问题,能源将成为制约其发展的关键因素之一,无源传感器网络应运而生。该网络中的无源节点不配备电池等电源设备,而是从周围的环境中捕获太阳能,射频能量,这样大大增加了传感器网络的生命周期。本文在现有的无源节点IEA上实现了一种多任务内核,结合MSP430微控制器体系结构特点,将中断和普通调度情形下任务上下文统一,以此提供了两阶段调度。任务上下文以栈的形式存在,解决了该微控制器嵌入式应用程序二进制接口关于栈平衡的问题。本文在多任务基础上实现了简单的异步信号处理、信号量两种任务间通信方式。实验结果表明该内核在无源节点上运行良好。

关键词:多任务管理; 嵌入式操作系统内核; 无源传感网

Abstract: As a hot research topic, IoT applications are hard to be deployed widely and work continuously. Power resource is one of the key factors that could impact. In such cases, energy harvesting wireless sensor network is on its duty. The nodes in EH-WSN aren't equipped with power supply, for example batteries, they harvest solar energy, RF energy and so on from the surrounding environment. And this prolongs the life of the sensors network. This paper designs and implements a multi-tasks kernel on the IEA EH-WSN node. According to the features of MSP430 ultra-low power micro controller unit's architecture, the paper unifies the schedule triggered by interrupts and ordinary function calls. The task context is the same and stored on stack. Based on that, the paper divides the schedule into two phases. Also the paper solves the problems with EABI of MSP430 about the stack balance. Furthermore, a simple asynchronized inter-task communication manner-signal and semaphore are implemented. The experiment results show the kernel works well on IEA nodes.

Key words: multi-tasks; embedded operating system; EH-WSN

引言

物联网作为感知互联系统向物理世界的延伸,极大地拓展了人类对物理世界的认知和控制能力,其广泛应用必将深刻地影响人类的生活方式。同时,这也堪称是下一个万亿级别的产业,国内外许多公司比如微软、阿里巴巴、华为等均已开始布局物联网。然而物联网的大范围部署却不得不面临着能源问题,电池等电源设备将会成为制约物联网发展的一个重要因素。物联网感知层,比如传感器节点有时需要部署在没有直接能量供应的地方,此时电源设备成为标配,电源设备会因为使用而消耗殆尽。为了使感知节点能够正常工作,必须要考虑更换电池或者给传感器节点充电,这将给维护等带来巨大的开销。而周围环境中存在着各种各样的能量,比如太阳能、RF射频能量(如WiFi)、机械能等,于是学者们就提出了从环境中捕获这些能量来给传感器节点供电[1]。这些不配备电源设备而直接使用环境中能量的节点便是无源节点,由其按照传统传感器网络可以组成无源传感器网络,相比之下将具有更长的生命周期[2]。

目前无源传感网的研究正处于起步阶段,从硬件到软件还有许多基础问题均亟待求取攻关方案。现如今,本论文署名的实验室设计出一款无源节点,能够捕获环境中的太阳能和射频能量[3]。相比华盛顿州立大学的Powercast[4],其运行功耗更低。并且提供能量测量的底层功能,使用数字电路而非MPTT等硬件方式来测量捕获和消耗的能量,测量误差在2%。要基于该硬件平台研究诸如网络通信协议、各种分布式调度算法、覆盖问题等传感器网络经典問题以及无源传感网面临的能量模型、间断计算等的特有问题[5-10],就需要在硬件和这些软件间寻求统领调控的信息运作模式。作为无源节点应用开发平台的一部分,本文实现了该节点上的多任务内核,并且支持多任务管理、调度以及任务之间的通信。需要涉及到无源节点微控制器的体系结构、外设、编译工具链、嵌入式应用二级制接口(EABI)等诸多细节。平台的工作就是向无源节点研究者提供方便的研究环境,使其专注于问题本身而非偏重在与研究无关的细节上,解决研究过程中需要遇到的常见问题。

本文的主要贡献如下:

(1)实现了无源节点上的多任务内核,能够支持多任务管理和自定义调度,同时包含任务间通信以及同步功能。

(2)该内核提出了基于栈的进程上下文保护方法,将中断产生的任务调度和用户主动放弃CPU执行而产生的任务调度统一起来。

(3)该内核与硬件相关的部分集中在中断处理函数、任务栈初始化和任务切换上,这些是与体系结构有关,只需少量修改便可以移植到其它微控制器上。

1 物联网操作系统研究

现有的比较知名的物联网操作系统有TinyOS[11]、ContikiOS[12]。其中,TinyOS是加州大学伯克利分析提出的基于MicaZ、TelosB等传统无线传感网节点的操作系统,是基于组件的,系统内核是基于事件驱动的。执行模型由中断和任务构成,中断执行的优先级高于任务,能够抢占任务的执行。任务间以先进先出的方式调度,对于每一个任务,TinyOS采用的策略是执行直到结束,即不能自挂起,也不能被其它任务抢占。所以IO操作需要分阶段达成,先发起IO请求,系统响应后调用回调函数。由于该模型具有较高的抽象层次,其抽象方式和通用的任务调度模型存在很大不同,对于复杂系统就要事无巨细地详加设计,给用户的编程带来了不便。TinyOS使用了nesC语言进行开发,提供了诸如组件、接口等抽象描述,将任务同步等信息隐藏在TinyOS发布的抽象层次之后。虽然nesC和C语言具有一定的相似性,但由于建立的许多高层次抽象给研究人员增加了额外学习编程语言的负担。另外经过本实验室先前做过的应用实际测试,TinyOS在TelosB节点上运行简单的感知任务功耗相当巨大,使用一对1.5 V电池供电的TelosB节点在正常工作情况下电源仅能维持2~3天。这显然并不符合无源传感网节点对低功耗的要求。Contiki采用基于进程的事件驱动单线程调度体系,进程之间不可以抢占,但可以被中断抢占。Contiki内核维护了一个进程链表,进程之间拥有优先级,根据优先级来决定进程在链表中的位置。Contiki中所有的事件均由一个叫做事件派发器的模块进行动态处理,事件产生之后由事件派发器检测事件所携带的标志信息,再轮询进程队列中的进程,直至找到与事件相匹配的进程,将事件交给进程展开处理[13-14]。综上可知,基于事件驱动的模型简化了内核的构建逻辑,但是增加了复杂应用的设计。并且2种操作系统主要面向传统的无线传感网,设计时并未考虑到能量问题。而新的无源传感网一切设计都要以能量为中心。

2 多任务模型

2.1 基本原理

内核对任务的管理是通过TCB这种数据结构实现的,其中保存了关于任务运行的基本信息以及用于任务调度的信息。内核使用数组存储TCB,数组大小即为支持的最大任务数。这里,给出的多任务基本模型的研发设计可如图1所示。为了方便任务生命周期管理,将TCB分成2个双向链表,其中一个表示使用中的TCB链,另外一个表示空闲TCB链。

当创建任务时,内核首先从空闲TCB链表中获得一个可用的TCB块,将其加入任务链表中。然后从内存管理单元动态分配一块固定大小的堆栈,并根据体系结构、内核自定义保护现场及编译器函数调用约定来初始化堆栈,再将堆栈指针指向栈顶。初始化堆栈在不同的微控制器及对应的编译器上可能会存在不同,这一部分将在实现的时候具体阐释解析。接下来就设置任务调度有关的参数,包括将任务设置为就绪态,该任务就可以参与调度了。系统有一个空闲任务,就赋予其最低优先级。该任务唯一指派操作就是切换到低功耗状态,以降低系统能量开销。

2.2 任务生命周期管理

一个任务完整的生命周期包括创建、执行和结束。执行过程中任务处于何种状态可以用状态机进行抽象。内核中定义任务的状态有4种,分别是:运行态、就绪态、中断等待状态、信号等待状态。状态的转移变换即如图2所示。

在任务创建后,当前系统的总任务数记录在全局变量中。由于任务创建函数以及生命周期管理函数需要在多任务环境中执行,而相互之间需要共享一些变量,因此在执行过程中需要用到原子语义,这可通过开关中断来启动完成。任务的唯一标识即tid是该任务占用的TCB数组的下标,如此即通过保存一个整数就可以方便地引用到TCB。相比连续分配tid而言,减少了一次从tid到TCB映射的查找过程。

任务进入就绪态后,就能随时转至可供调度的生命周期。在参与调度后,处于任何状态的任务都可以通过内核提供的接口来结束任一任务。实际上这一部分并未配置安全性检查,而是假设用户知道自己在做什么。任务结束的接口可以被主动调用,也可以在任务执行返回语句后被默认调用。默认调用的发生是通过在任务创建时设置堆栈来做到的。任务结束时,首先需要关闭中断阻止任务调度,慎防被结束的任务处于不一致的状态。接着释放栈对应的内存块等资源,并且将该任务TCB从任务链中删除,放入空闲任务链中,再根据释放的是否为当前任务而最终决定是否调用调度函数。

2.3 任务调度

目前任务调度采用的方法是时间片轮转调度,这是为了保证所有的任务都能够被执行到。任务之间具有优先级,并且优先级可以利用内核接口动态调整。系统每次调度时,总是选择执行具有最大时间片值的任务,如果该任务即是当前任务,则不切换任务。任务调度分为2个阶段完成。第一阶段是产生下一个任务,即任务选举阶段。第二阶段是任务上下文环境切换,在本文设计的基于栈的任务上下文中,任務切换只需要切换栈指针,并平衡栈结构即可。

任务切换阶段实现与具体的体系结构具有紧密关系,将在第三节中探讨叙述。任务选举阶段的算法可表述如下:

该算法使用了和初期版本Linux内核类似的任务选举策略。算法中首先遍历任务链表,找到处于就绪态任务最大的时间片以及对应的任务TCB。如果所有就绪态任务的时间片数值都为0,则将所有任务的时间片都增加一定数值。这样会使得处于等待状态的任务时间片不断累加,当其变成就绪态后,由于具有较大的时间片数值会在下一轮任务选举时被选中,这样就保证了所有任务均可正常执行,又让等待过久的任务优先执行,而使低优先级的任务不致获得失效轮空的后果。

按照该算法设置的时间片数值不会超过任务优先级的2倍,令an表示第n次设置的任务时间片的值,c表示任务的优先级。时间片上取值上限的证明过程如下所示:

通项公式为: an+1=[SX(]an[]2[SX)]+c

即: an+1-2c=[SX(]an-2c[]2[SX)]

可得:an=2c+[SX(]1[]2n[SX)](a0-2c)

[HS1*1] 故而lim[DD(;][]n∞[DD)]an=2c

内核任务调度采用两阶段处理使得内核调度算法具有拓展性,可以通过变换任务选举策略很容易地修改调度算法。

2.4 信号处理

内核可运行简单的信号处理机制,并不符合POSIX标准。TCB中包含16位变量signal表示该任务的信号,其中每一位表示一个信号,共支持16种信号。16位的blocked变量表示要屏蔽的信号以及一个以16位变量为参数的函数指针,即信号处理函数。信号处理函数由任务自定义,并通过内核的安装信号函数的接口注册到TCB中。当每一次任务被调度到开始执行之前,先处理该任务的信号,即在中断关闭的情形下,让signal和blocked变量的非之间逻辑与,判断最终的结果是否为零,如果不为零则从不为零的最高位开始处理信号。实际上应该为每一个信号都建立一个处理函数,而本文在研发时采用了所有信号都由一个函数处理的原因是为了减少TCB中存储过多的数据,也简化了信号处理的设计与实现。

2.5 信号量

多任务环境下全局变量需要锁来避免临界区竞态的发生。锁的基本功能的实现可以通过信号量,信号量是锁的基础。每一个信号量结构即如图3所示。其中包含信号量的名字、一个信号量的唯一标识、信号量的等待队列、包含等待该信号量的任务、信号量当前值以及一个标识该信号量是否被占用的标志。

信号量的open操作就是从信号量数组中找到一个occupied标志为0的信号量,将名字写入,并设置信号量值,初始化任务队列。信号量的unlink操作就是将occupied标志位置0。信号量的PV操作中,P操作就是将信号量的值减1,如果值小于0,则任务等待。V操作就是将信号量的值加1,如果值小于等于0,说明之前等待队列上有任务,则将其唤醒。PV操作的设计代码内容可见如下。

3 硬件与实现

3.1 微控制器体系结构

无源节点IEA使用的是MSP430FR6979微控制器,这是RISC结构,内存和IO统一编址,并且具有16位数据总线和20位地址总线,可寻址1 MB内存地址空间。内存数据采用小端顺序,栈向下生长。具有15个20位寄存器和1个16位寄存器。R0~R2是专用寄存器,分别为PC、SP、SR。其中,SR是16位。R3~R15是通用寄存器。同时,还具有7种寻址方式,可详见表1。不同寻址方式在不同指令集中数据位数不同,可以支持字节寻址、字寻址以及地址字寻址,分别为8位、16位、20位。

操作数的大小根据指令类别及后缀确定,比如MOVX.B表示8位操作数大小,MOVX.W表示16位操作数大小,MOVX.A表示20位操作数大小。默认操作数大小是16位。同时为了减少生成的指令字大小,将一些指令的寻址方式做出限制,可得一类地址字指令,比如MOVA同樣是20位操作数大小,但是生成的指令只有2字节,而MOVX.A一般需要4~5字节。更多的指令集详情可参见芯片手册。

该微控制器具有8种操作模式,不同操作模式具有不同的功耗,经测试LPM3实际功耗相当低,电流只有几微安。操作模式通过SR寄存器的4个位进行控制,内核使用的操作模式说明可见

该微控制器具有丰富的片内外设,支持多种中断,中断之间设有优先级,同样支持中断嵌套,但是内核中并未对中断嵌套给出定义。中断的开关可以通过外设独立的控制位来设计决定,同时SR寄存器配备全局中断开关控制位GIE。中断处理的过程可分析如下:

(1)等待当前指令执行完毕。

(2)PC入栈,SR入栈,栈的布局如图4所示。

(3)如果最后一条指令执行期间有多个中断源等待服务,选择优先级最高的中断。

(4)单源中断的中断标志位自动清除,多源中断的标志位保持不变,以便中断服务程序判断中断源。

(5)SR寄存器除了SCG0位之外全部清除,因此也结束低功耗模式进入正常操作模式。GIE位也被清除,中断嵌套被禁止。

(6)中断向量的内容将加载到PC中,PC执行中断服务程序。

[JP3]中断直接使用RETI指令即可,返回的过程如下:

(1)SR寄存器的值从栈上弹出,所有之前的设置包括操作模式、中断控制都恢复原样。

(2)PC的值从栈上弹出,从被中断处恢复执行。

3.2 基于栈的任务上下文及任务切换

为了满足应用主动发起的调度和被中断产生的调度任务上下文是一致的,需要将2种情况统一起来。因为进入中断PC和SR寄存器压栈是硬件决定的,所以依据硬件机理安排,同时也将通用寄存器的内容压栈。这样形成的布局则如图5所示。由此可知,16个寄存器只有SR寄存器的值不在栈上而是保持于TCB中。

整个系统的节拍是由定时器按照10 ms来产生的,一个节拍触发一次定时器中断,将当前任务的时间片值减1,如果当前任务的时间片值为0,则调度到下一个任务。在时钟中断服务程序中,研究使用汇编实现了如图5所示的当前任务的上下文保存,主要是入栈操作和保存SR寄存器的值到TCB结构体中,接着将待执行任务的栈平衡,即恢复通用寄存器内容,利用RETI模拟中断返回来切换任务,这样在5个微控制器时钟周期便可完成任务切换。而任务切换的过程就是SR寄存器的赋值过程。

MSP430应用程序二进制接口并未定义帧指针,而是规定R11~R15是调用函数需要保存的寄存器,R4~R10是被调用函数需要保存的寄存器,而编译器通常将变量用寄存器保存,当局部变量过多时,需要在栈上为局部变量分配空间,而研究时难以预先知道被调用函数实际使用了多少局部变量,这样给栈平衡带来了极大的挑战,甚至无法完成。所以研究中使用汇编语言而不是C语言来实现核心的系统节拍中断函数。编译器所提供的功能并不能满足预设的要求。受限于硬件,中断的入栈与普通函数调用的入栈方式存在差别(见图6),为了让任务调度和中断的栈形成的任务上下文统一,就需要将任务调度时函数调用的栈转换为中断的栈,并利用中断返回指令完成任务切换。

4 實验结果与分析

通过在无源节点上建立3个任务,一个任务控制红色LED闪烁,一个任务控制绿色LED闪烁,另外一个为空闲任务,且只是将MCU置入低功耗LPM3模式。在单纯的多任务调度时,发现2个灯几乎同时闪烁。随着时间片的增大,2个LED的闪烁区分越来越明显,这是因为产生任务调度的时间变长。为了测试信号,在任务1中给任务2发送任务暂停信号,并隔一段时间后发送恢复信号,任务2的信号处理程序调用内核提供的任务暂停和恢复接口,实验结果显示任务2对应的绿色LED先闪烁很短时间,然后只有任务1的绿色LED闪烁,过了一段时间任务2恢复执行,2个LED同时闪烁,结果符合预期。此后,又测试了利用信号量控制2个LED的闪烁顺序,结果也符合预期。

5 结束语

本文通过在无源节点上实现了多任务内核,提供了无源节点多任务应用程序开发的接口,结果符合预期,同时本文提出的基于栈的任务上下文使得任务切换更加简单。实验结果显示该内核运行良好。

该多任务内核属于无源应用开发平台的操作系统抽象层课题,该课题来源于哈尔滨工业大学和中国科学技术大学联合的国家自然科学基金重点项目《无源传输网络理论与关键技术》。

参考文献

[1] KANSAL A, HSU J, ZAHEDI S, et al. Power management in energy harvesting sensor Networks[J]. ACM Transactions on Embedded Computing Systems (TECS), 2007,6(4):32.

[2] SUDEVALAYAM S, KULKARNI P. Energy harvesting sensor nodes: Survey and implications[J]. IEEE Communications Surveys & Tutorials, 2011, 13(3): 443-461.

[3]ZHANG Yang, GAO Hong, CHENG Siyao,et al. IEA: An intermittent energy aware platform for ultra-low powered energy harvesting WSN[C]// Wireless Algorithms, Systems, and Applications(WASA). Guilin, China:dblp, 2017:185-197.

[4] SAMPLE A P, YEAGER D J, POWLEDGE P S, et al. Design of an RFID-based battery-free programmable sensing platform[J]. IEEE Trans. on Instrumentation and Measurement, 2008,57(11):2608-2615.

[5]SUN Yanjun, GUREWITZ O,JOHNSON D B. RI-MAC: A receiver-initiated asynchronous duty cycle MAC protocol for dynamic traffic loads in wireless sensor networks[C]//Proc. 6th ACM Conference on Embedded Network Sensor Systems. Raleigh, NC, USA: ACM, 2008:1-14.