張東杰,王俊璞
(上海交通大學(xué) 儀器科學(xué)與工程系,上海 200240)
?
嵌入式框架QP_nano的51單片機移植與應(yīng)用
張東杰,王俊璞
(上海交通大學(xué) 儀器科學(xué)與工程系,上海 200240)
摘要:本文旨在為單片機開發(fā)引入一套輕量級軟件框架QPnano。首先以簡易數(shù)字時鐘設(shè)計為例,展示了使用QPnano的開發(fā)過程,然后詳述了QPnano到Keil C51的移植,通過使用QPnano,將一些經(jīng)典的軟件思想和技術(shù),如面向?qū)ο蟆⑹录?qū)動、狀態(tài)機等,很自然地引入到單片機的軟件開發(fā)中。
關(guān)鍵詞:QPnano;事件驅(qū)動;狀態(tài)機;軟件框架;MCU
引言
在計算機軟件開發(fā)方面,面向?qū)ο笤O(shè)計、UML、測試驅(qū)動開發(fā)、基于框架開發(fā)等,是比較成熟的開發(fā)方式,但它們很少被引入到傳統(tǒng)的單片機開發(fā)領(lǐng)域。究其原因,除了嵌入式芯片廠家眾多、軟件開發(fā)與硬件耦合度過高、硬件資源有限等因素外,缺少相關(guān)領(lǐng)域的研究和推廣也是一個主要原因。傳統(tǒng)的中低端單片機,如8051、PIC、AVR等,因其價格低廉、結(jié)構(gòu)簡單、已有大批用戶使用等因素,在工業(yè)、消費類電子等領(lǐng)域,仍占有很大的市場份額,因此提高這些單片機的開發(fā)效率和軟件質(zhì)量,對提高產(chǎn)業(yè)效率和產(chǎn)品質(zhì)量有重要意義。
相對于傳統(tǒng)的單片機開發(fā)使用前后臺系統(tǒng)和多任務(wù)系統(tǒng),基于框架開發(fā)在代碼重用、設(shè)計簡易性等方面有很大優(yōu)勢。作為為數(shù)不多的嵌入式軟件框架,QP_nano基于UML狀態(tài)機和事件驅(qū)動[1],用C語言實現(xiàn),具備輕量級、便于移植等優(yōu)勢,特別適合嵌入式應(yīng)用。
本文首先通過使用QP_nano設(shè)計數(shù)字時鐘的全過程,展示QP_nano的面向?qū)ο?、狀態(tài)設(shè)計等應(yīng)用特征給設(shè)計帶來的簡易性,之后詳述QP_nano移植到Keil C51平臺需要做的配置、代碼調(diào)整以及平臺相關(guān)函數(shù)的實現(xiàn)。
1基于QP_nano設(shè)計簡易數(shù)字時鐘
1.1設(shè)計方案
設(shè)計一個簡易數(shù)字時鐘,實現(xiàn)時鐘的運行和設(shè)置功能設(shè)計方案如下:
① 采用24小時制,用4個數(shù)碼管分別顯示小時和分鐘。
② 使用SET(設(shè)置鍵)、UP(加鍵)和DOWN(減鍵),調(diào)整時鐘。
③ 數(shù)字時鐘上電的時候,進入時鐘運行狀態(tài);從12:00開始計時,每隔1分鐘,分鐘數(shù)加1;分鐘數(shù)計滿60后,小時數(shù)加1,分鐘數(shù)清零并重新開始計時;小時數(shù)計到24時,小時數(shù)清零并重新開始計時。
④ 在時鐘運行狀態(tài),按SET,進入小時設(shè)置狀態(tài),小時顯示開始閃爍。
⑤ 在小時設(shè)置狀態(tài),按SET,小時數(shù)確認(rèn)并進入分鐘設(shè)置狀態(tài),分鐘顯示開始閃爍。
⑥ 在分鐘設(shè)置狀態(tài),按SET,分鐘數(shù)確認(rèn),并進入時鐘運行狀態(tài)。
⑦ 在小時或分鐘設(shè)置狀態(tài),按UP或DOWN,對應(yīng)的小時或分鐘加1或減1,小時變化范圍是0~23,分鐘變化范圍是0~59。
1.2硬件設(shè)計
① 搭建一個51單片機的最小系統(tǒng),具體方案請參照所選芯片的數(shù)據(jù)手冊。
② 添加4個數(shù)碼管及相應(yīng)的驅(qū)動電路到系統(tǒng),采用動態(tài)刷新方式,分配4個單片機I/O口連接到數(shù)碼管片選,分配8個I/O口連接到數(shù)碼管段碼。
③ 添加3個按鍵及相應(yīng)的電路到系統(tǒng),分配單片機3個I/O口連接到按鍵輸入。
1.3軟件設(shè)計
使用QP_nano,最重要的是劃分活動對象[1],不同的活動對象負責(zé)不同的處理功能。每個活動對象都是一個狀態(tài)機[1],某一時刻只能處在一個狀態(tài)?;顒訉ο蠛突顒訉ο笾g通過事件[1]通信,活動對象可以發(fā)送或處理事件。處理事件包括改變狀態(tài)、調(diào)用一些硬件驅(qū)動函數(shù)等。使用QP_nano開發(fā)單片機應(yīng)用的過程一般包括劃分活動對象、定義事件信號和編寫活動的狀態(tài)處理函數(shù)等。
1.3.1劃分活動對象
根據(jù)系統(tǒng)功能分解出3個活動對象:Display、Counter和Keyboard。其中,Display負責(zé)刷新數(shù)碼管顯示,Counter負責(zé)時鐘計時和設(shè)置,Keyboard負責(zé)掃描鍵盤。
在動態(tài)刷新方式下,Display每隔一個Tick(系統(tǒng)嘀嗒)都要刷新一次,而Counter僅需要一個慢速時鐘驅(qū)動,且與Display有共享顯示緩沖區(qū)的需求,為簡化實現(xiàn),將Counter活動嵌套到Display內(nèi)部,構(gòu)成層次嵌套關(guān)系。因此,定義Display和Keyboard兩個活動即可,代碼如下:
typedef struct Display {
QActive super;
uint32_t counter;
uint16_t refreshingCtr;
uint16_t countingCtr;
uint8_t buf[4];
} Display;
typedef struct Keyboard {
QActive super;
} Keyboard;
其中,super表示活動,Display和Keyboard擴展(繼承)了活動,因此可以使用向下轉(zhuǎn)型(down_cast)的方式,擁有活動的響應(yīng)事件等功能;counter為時鐘的秒計數(shù)變量;refreshingCtr對刷新次數(shù)進行計數(shù),每隔250個計數(shù)周期給Display活動發(fā)送計數(shù)信號;countingCtr用于對計數(shù)信號進行統(tǒng)計,計滿4個counter加1,表示時鐘前進1 s;buf表示時鐘顯示的緩沖區(qū)。
1.3.2定義用戶信號
用戶信號用來標(biāo)記事件的類型,即確定事件的含義。數(shù)字時鐘共定義了4個信號,代碼如下:
enum ClockSignals {
CLOCK_COUNT_SIG = Q_USER_SIG, //計數(shù)信號
CLOCK_SET_SIG, //設(shè)置信號
CLOCK_UP_SIG, //加信號
CLOCK_DOWN_SIG, //減信號
};
1.3.3活動順序圖
QP_nano活動之間的通信關(guān)系,用UML順序圖描述。數(shù)字時鐘的順序圖如圖1所示,QP_nano每隔一個Tick(配置為1 ms)發(fā)送一個TIME_OUT事件(系統(tǒng)保留)給Keyboard和Display;Keyboard每計滿10個TIME_OUT,掃描一次鍵盤,連續(xù)兩次發(fā)現(xiàn)有鍵按下就發(fā)送對應(yīng)的鍵盤事件給Display;Display每收到一個TIME_OUT就刷新一次數(shù)碼管,并同時對該事件計數(shù),計滿250個后給自身發(fā)送CLOCK_COUNT事件,并更新一次顯示緩沖區(qū),如果在計時狀態(tài),累加4次后,時鐘變量加1 s;如果在設(shè)置狀態(tài),則切換消隱(清空顯示緩沖區(qū))和正常顯示,實現(xiàn)閃爍功能(為簡便起見,信號末尾未加_SIG,下同)。
圖1 活動順序圖
1.3.4活動狀態(tài)圖
活動和活動之間的通信關(guān)系由活動順序圖展現(xiàn),而活動內(nèi)部的狀態(tài)及運行情況則通過UML狀態(tài)圖描述。
圖2 Keyboard狀態(tài)圖
活動Keyboard的狀態(tài)圖如圖2所示,Scanning狀態(tài)用于掃描鍵盤,Keyboard由初始狀態(tài)轉(zhuǎn)換到該狀態(tài)后,一直運行于該狀態(tài)。
圖3 Display狀態(tài)圖
活動Display的狀態(tài)圖如圖3所示,Refreshing狀態(tài)用于刷新數(shù)碼管,Counting狀態(tài)用于時鐘計數(shù),Set_Hour狀態(tài)用于調(diào)整小時,Set_Min狀態(tài)用于調(diào)整分鐘;Display從初始狀態(tài)進入Refreshing狀態(tài),又繼續(xù)進入Counting狀態(tài);在Counting狀態(tài)、Set_Hour狀態(tài)和Set_Min狀態(tài)下,若收到TIME_OUT事件,則自動返回到Refreshing狀態(tài)處理。
1.3.5編寫活動的狀態(tài)處理函數(shù)和硬件驅(qū)動函數(shù)
活動狀態(tài)圖中的每一個狀態(tài)都對應(yīng)一個狀態(tài)處理函數(shù)處理事件,如Keyboard的Scanning狀態(tài)響應(yīng)TIME_OUT事件(計數(shù)滿10個,調(diào)用鍵盤掃描函數(shù)),Display的Counting狀態(tài)響應(yīng)CLOCK_SET事件(轉(zhuǎn)換到Set_Hour狀態(tài))。
硬件驅(qū)動函數(shù)用來初始化和控制外設(shè),本測試中定義了bsp_init()、bsp_keyboard()和bsp_display()三個硬件相關(guān)函數(shù)。其中,bsp_init()用于初始化芯片時鐘、鍵盤和顯示I/O口狀態(tài),在啟動QP_nano運行前調(diào)用;bsp_keyboard()用于鍵盤掃描,即讀取鍵盤I/O口的狀態(tài),在Keyboard的Scanning狀態(tài)調(diào)用;bsp_display()用于刷新一位數(shù)碼管,在Display的Refreshing狀態(tài)調(diào)用。
1.3.6主程序
基于QP_nano的主程序簡單,只需調(diào)用活動的構(gòu)造函數(shù)及硬件初始化函數(shù),然后啟動QP_nano內(nèi)核即可。數(shù)字時鐘的主程序如下:
intmain(void) {
Display_ctor();
Keyboard_ctor();
bsp_init();
return QF_run();
while(1);
}
1.3.7文件部署
數(shù)字時鐘的文件部署如下(.表示項目路徑,main()函數(shù)在clock.c定義):
./boot/startup.a51
./bsp/bsp.c,bsp_display.c,bsp_keyboard.c,bsp.h,bsp_display.h,bsp_keyboard.h
./nano_51/qepn.c,qfn.c,qepn.h,qfn.h,qassert.h
./obj
./usr/clock.uvproj,qpn_port.h,clock.c,display.c,keyboard.c,clock.h,display.h,keyboard.h
最后編譯結(jié)果顯示,ROM空間使用約11 KB,RAM空間使用約170 B。
2移植QP_nano到Keil C51
2.1獲取QP_nano的代碼文件
訪問網(wǎng)站http://www.state-machine.com/psicc2/,點擊 QP_nano的資源鏈接,轉(zhuǎn)到sourceforge網(wǎng)站下載安裝文件或壓縮包(本文使用的是2014年發(fā)布的5.3.0版),安裝或解壓的默認(rèn)路徑是c:qp。需要移植的文件包括:
① qpn_port.h:QP_nano和平臺相關(guān)的聲明,都要在此文件聲明(如QP_nano使用的數(shù)據(jù)類型,typedef int int16_t)或包含(如#include "qassert.h")。在安裝例程位置拷貝一個做模版,比如C:qpqpnexamplesmsp430iarlinky_eZ430qpn_port.h。
② qp_nano的實現(xiàn)頭文件:QP_nano的實現(xiàn)聲明,位于C:qpqpninclude目錄下,包括qassert.h、qepn.h、qfn.h、和qkn.h。
③ qp_nano的實現(xiàn)文件:QP_nano的實現(xiàn)代碼,位于C:qpqpnsource目錄下,包括qepn.c、qfn.c、qfn_init.c和qkn.c。
2.2Keil配置
2.2.1修改啟動文件STARTUP.A51
本文測試使用外部RAM作為可重入堆棧,需對啟動文件做如下配置:
① XDATALEN:外部RAM的尺寸,與所選芯片匹配,如果是1 KB, 則為3FFH;
② XBPSTACK:設(shè)為1,標(biāo)記外部RAM作為可重入堆棧;
③ XBPSTACKLEN:配置堆棧棧頂,與芯片匹配,如果是1 KB,則為3FFH+1;
2.2.2菜單配置
① 在目標(biāo)配置窗口目標(biāo)選項卡(Flash->Configure-Target)選擇內(nèi)存模型為大模式。
② 在目標(biāo)配置窗口C51選項卡,添加包含文件的路徑(根據(jù)文件部署添加)。
2.3QP_nano文件調(diào)整
由于部分函數(shù)傳遞參數(shù)較多,必須加reentrant關(guān)鍵字,告訴編譯器要使用堆棧傳遞參數(shù)。為了減輕工作量,本文測試中所有函數(shù)的聲明和定義都添加了reentrant關(guān)鍵字。
2.4實現(xiàn)QP_nano平臺相關(guān)函數(shù)
QP_nano只需要平臺提供幾個函數(shù)就可以工作了,本文測試創(chuàng)建了一個 bsp.c文件來實現(xiàn)這些函數(shù),內(nèi)容包括:
① 定時器中斷函數(shù):用來調(diào)用QP_nano的Tick函數(shù)QF_tickXISR(0),驅(qū)動QP_nano工作。
② 啟動QP_nano框架的函數(shù)void QF_onStartup(void):在該函數(shù)中啟動定時器。
③ 空閑函數(shù)void QF_onIdle(void):沒有事件發(fā)生時被框架調(diào)用。
④ QP_nano的斷言函數(shù) void Q_onAssert():打印出錯信息,并停止程序運行。
2.5demo的文件部署
本文仿照qpn提供的一個demo例程blinky(模擬發(fā)光二極管以1 Hz頻率閃爍),移植到Keil C51后的文件部署如下所示(.表示項目路徑,main()函數(shù)位于blinky.c):
./nano/qepn.c, qfn.c
./include/qassert.h,qepn.h,qfn.h,qkn.h
./user/blinky.uvproj, blinky.c,bsp.c,startup.a51, blinky.h, bsp.h, qpn_port.h
./obj
2.6編譯結(jié)果
blinky移植成功后,編譯結(jié)果顯示,ROM空間使用約9 KB,RAM約120 B。
結(jié)語
參考文獻
[1] Miro Samek.Practical UML STATECHARTS in C/C++,Event-Driven Programming for Embedded Systems[M].Second Edition.Amstel dam:Elsevier Inc,2008.
張東杰(工程碩士),研究方向為智能儀器;王俊璞(助理研究員),研究方向為導(dǎo)航制導(dǎo)與控制。
Atmel攜手Intel 提升物聯(lián)網(wǎng)應(yīng)用安全水平
Atmel公司與英特爾公司合作,推出更加安全的物聯(lián)網(wǎng)(IoT)應(yīng)用。通過此次合作,Atmel將在所有Atmel SmartConnect無線解決方案中支持英特爾增強隱私身份(Intel EPID)技術(shù)。隨著物聯(lián)網(wǎng)市場的迅猛發(fā)展,智能聯(lián)網(wǎng)設(shè)備數(shù)量不斷增加,在物聯(lián)網(wǎng)節(jié)點與云之間實現(xiàn)相互身份驗證,提升云部署的安全性變得日益重要。
到2020年,全球聯(lián)網(wǎng)設(shè)備數(shù)量將達到數(shù)百億臺。為了在邊緣節(jié)點與云之間達成無縫連接,安全成為其中一項關(guān)鍵因素。為此,Atmel提供了完整的物聯(lián)網(wǎng)解決方案,整合了Atmel|SMART微控制器(MCU),支持Wi-Fi、802.15.4和藍牙的Atmel SmartConnect無線技術(shù)以及Atmel的安全產(chǎn)品。與英特爾的攜手合作,使得采用Atmel無線解決方案的開發(fā)者可以在自己的解決方案當(dāng)中應(yīng)用值得信任的英特爾EPID身份識別標(biāo)準(zhǔn)。Atmel公司副總裁兼無線解決方案部門總經(jīng)理Kaivan Karimi表示:“英特爾EPID技術(shù)的應(yīng)用,為物聯(lián)網(wǎng)設(shè)計者提供了一個真正無縫的邊緣節(jié)點對云物聯(lián)網(wǎng)平臺。該平臺具有值得信賴的安全性能,并且擁有Atmel廣泛的物聯(lián)網(wǎng)產(chǎn)品組合。Atmel的SmartConnect無線和物聯(lián)網(wǎng)解決方案從現(xiàn)在起可以支持英特爾EPID技術(shù),該技術(shù)的安全性已經(jīng)在過去5年得到了充分驗證?!?/p>
英特爾EPID是一項用于身份驗證和隱私保護的ISO標(biāo)準(zhǔn),該標(biāo)準(zhǔn)自2011年以來一直運用于英特爾平臺。這項技術(shù)能夠提供硬件可信根,并兼容公鑰基礎(chǔ)設(shè)施(PKI)。采用英特爾EPID技術(shù),設(shè)備身份將可得到驗證,并在經(jīng)過驗證的設(shè)備之間建立安全的通信鏈路。并且,可在避免暴露具體平臺身份的條件下確定設(shè)備組成員身份,再添一層安全保護。同時,英特爾EPID技術(shù)還可以動態(tài)分配取消單個組成員身份,且符合內(nèi)容和數(shù)據(jù)保護協(xié)議對保護密鑰傳送的最新要求。
Porting and Application of Embedded Frame QP_nano on 51 MCU
Zhang Dongjie,Wang Junpu
(Department of Instrument Science and Engineering,Shanghai Jiao Tong University,Shanghai 200240,China)
Abstract:This article introduces QPnano to MCU,which is a light weight software framework.Firstly,taking a simple digital clock design as an example,the process of develement using QPnano is described,then the porting QPnano to Keil C51 is described in detail.So some classic software concepts and technologies such as object oriented programming,event driven and state machine are brought into the software development of MCU naturally.
Key words:QPnano;event driven;state machine;software framework;MCU
收稿日期:(責(zé)任編輯:薛士然2015-05-12)
中圖分類號:TP368
文獻標(biāo)識碼:A