文豪 高宏 程思瑤 趙旭


摘 要:物聯網作為目前研究的熱點問題之一,在長期泛在方面卻存在問題,能源將成為制約其發展的關鍵因素之一,無源傳感器網絡應運而生。該網絡中的無源節點不配備電池等電源設備,而是從周圍的環境中捕獲太陽能,射頻能量,這樣大大增加了傳感器網絡的生命周期。本文在現有的無源節點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.