999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Protothreads在提高系統響應方面的應用*

2016-09-15 07:02:57楊一萌楊勇楊遠聰
單片機與嵌入式系統應用 2016年8期
關鍵詞:數據處理嵌入式程序

楊一萌,楊勇,楊遠聰

(中國地質大學 數學與物理學院,武漢 430074)

?

Protothreads在提高系統響應方面的應用*

楊一萌,楊勇,楊遠聰

(中國地質大學 數學與物理學院,武漢 430074)

采用基于Protothreads的輕量靈活的多任務編程方式,使資源緊張的小型微控制器可支持多任務,改善了系統綜合性能。測試證明,運用該技術后C51系統對按鍵響應的速度最高提高了10倍。該方法為在小型微控制器上運行多任務系統提供了一種新的思路。

Protothreads;多任務;低延遲;STC90C516RD+

引 言

基于微控制器的儀器設備在進行數據采集時,往往還需要支持通信、顯示和按鍵等,這要求微控制器能夠在短時間內處理多個任務,并且具有較好的實時性。Free RTOS和μC/OS II等完整的嵌入式操作系統,往往需要較多的硬件資源,對于小型微控制器來說,其過于龐大。許多應用既希望采用輕巧價廉的微控制器,又希望響應迅速,尤其是航天和交通等系統更是如此[1]。這種情況下,需根據任務和微控制器的特點來設計編寫控制程序,才能充分發揮微控制器的性能。在輕量級多任務框架中,由Protothreads衍生出了各具特點的修改版本[2],但對某些微控制器來說仍然有些復雜,使用受限。本文結合已有的采集系統,嘗試使用簡單的Protothreads框架來提升系統實時性能,并評估Protothreads框架在資源緊張的多任務嵌入式系統中的可行性。

1 Protothreads簡介

Protothreads由瑞典皇家理工學院的Adam Dunkels博士開發,在BSD許可證下發行[3]。它是一個非常輕量的協程庫,被應用到很多開源軟件中,例如嵌入式網絡操作系統Contiki、TCP/IP協議棧μIP和LwIP等。

1.1Protothreads特點及基本函數

Protothreads具有如下優點:①完全由C語言實現,沒有匯編代碼,不依賴任何庫和系統特性,在任何平臺都可移植;②極少的資源需求,每個Protothreads函數僅需要2個字節;③支持條件阻塞機制和協程間通信等功能;④不存在調用開銷,沒有棧切換,系統資源占用極少。

Protothreads十分輕量的特點使它非常適合用于內存受限系統、事件驅動協議棧、深度嵌入式系統和傳感器網絡節點等場景[4]。Protothreads進入阻塞狀態時,不保存堆棧和局部變量,這意味著,在使用Protothreads的系統中要謹慎對待本地變量,如果不確定是否可行,就使用全局變量[5]。

1.2用于定義協程的函數主體

Protothreads協程由4種基本操作組成,初始化:PT_INIT();執行:PT_BEGIN();條件阻塞:PT_WAIT_UNTIL(),PT_WAIT_WHILE();退出:PT_END()。

這4個基本操作函數均是宏,在代碼預編譯階段會展開為實際代碼。每一次發生調用時,Protothreads將一直運行,直到它主動進入阻塞狀態或退出。因此,由使用Protothreads的應用程序完成Protothreads的調度[5]。

Protothreads使用pt.lc記錄阻塞位置,協程剛初始化和任務結束時,pt.lc均等于0。

2 數據采集系統

該數據采集系統主要用于電流檢測,結構圖如圖1所示。

圖1 采樣系統基本結構

微控制器使用STC90C516RD+,系統主要任務有A/D轉換和數據處理、結果顯示、量程切換、PC通信、菜單處理、快捷按鍵處理和數據記錄。A/D轉換使用AD7710芯片,可以設置10 Hz或50 Hz陷波頻率。不同陷波頻率下的轉換速度不同,單片機對轉換結果進一步處理。菜單鍵按下會觸發外部中斷,中斷函數置位標志位,然后在主函數中處理該事件。

2.1存在的問題

經過后期測試發現,單片機大部分時間花費在A/D獲取數據及處理這個部分。在不同的設置下,花費的時間在20~4 000 ms。由于系統任務是順序執行,導致其他任務響應很慢,最壞的情況下,按下菜單鍵后幾秒鐘后屏幕才會顯示出來。

如圖2描述的情況,在任務A執行過程中,黑色標記處相繼發生了任務B、C對應的事件,發生事件后進入相應中斷,置位相應標志位,但是要等到任務A結束之后才會執行任務B、C。

圖2 CPU使用情況

2.2解決方法

A/D轉換和數據處理任務使用Protothreads協程,其他任務不變。A/D轉換和數據處理任務,下文均稱作任務A。任務A每運行200 ms就會主動進入阻塞狀態,讓出CPU使用權,然后檢查是否有事件需要處理,相關任務處理完成后,任務A獲得CPU使用權,繼續執行。任務A每次停留在阻塞狀態的時間是不固定的,例如,當把保存的數據從儀器發送到上位機時,任務A在發送完畢前將一直處于阻塞狀態。改善后的CPU的使用情況如圖3所示。

圖3 改善后CPU使用情況

圖4描述了任務A的內部流程。任務A主要由采集數據和處理數據兩個子任務構成。這兩個子任務都不是一次性完成的,每次運行一小部分,然后阻塞任務A,讓出CPU使用權。如圖4所示,任務A運行后,首先根據pt.lc的值判斷運行狀態,如果是從阻塞態恢復,將回到上次結束位置繼續運行。當pt.lc值對應采集任務程序塊(行號在采集任務程序塊)時,進入采集任務;當pt.lc值對應數據處理程序塊(行號在數據處理程序塊)時,進入數據處理任務。采集數據和處理數據兩個子任務按順序先后運行,子任務運行超過200 ms后,阻塞任務A。當數據處理結束后,任務A結束。

圖4 任務A流程圖

系統中使用定時器計時,每10 ms觸發定時中斷,作為系統的TickClock,變量sclk記錄中斷次數。當sclk等于20時,表示至少已經過去了200 ms。程序如下:

void Timer0_ISR() interrupt 1{

sclk++;

}

使用PT_THREAD()宏聲明任務A的主體函數。當從A/D轉換器中讀出一個轉換結果后檢測sclk的值,當sclk大于等于20時,主動阻塞自己,讓出CPU使用權。程序如下:

PT_THREAD(dataobj_acquire(dataobj *dataobj, struct pt *pt)){

//變量聲明及初始化…

sclk=0;//重置計時

PT_BEGIN(pt);

if (dataobj->number_to_average >= 4){

for (i = dataobj_raw_data_start_addr; i < dataobj->raw_data_end_addr;){

AD7710Read();

/*如果已經運行至少200 ms,阻塞自己,退出本函數。當再進入本函數時,從當前位置繼續執行*/

PT_WAIT_WHILE(pt, (sclk > 20));

}

數據處理……

PT_END(pt);

}

在主函數中,通過pt.lc的值是否為0來判斷任務A是否已經執行完成。某些任務,比如顯示數據只有在任務A正常結束后才能刷新。某些任務執行后會改變系統當前設置,已經采集到的緩存數據需要重新開始采集,可以通過PT_INIT()宏重置任務A。程序如下:

void main(){

變量聲明及初始化…

PT_INIT(&data_acquire_pt);

模塊初始化…

while (1){

if (deviceobj->key_isr_happen){

KeyInterruptProc(dataobj, deviceobj, uartobj);

deviceobj->key_isr_happen = 0;

/*重置任務A,使其從頭開始執行*/

PT_INIT(&data_acquire_pt);

}

dataobj_acquire (dataobj, deviceobj, &data_acquire_pt);

if (data_acquire_pt.lc == 0){

RangeCheckProc(dataobj, deviceobj, uartobj);

}

if (deviceobj->range_changed){

deviceobj->range_changed = 0;

/*重置任務A,使其從頭開始執行*/

PT_INIT(&data_acquire_pt);

dataobj_acquire (dataobj, deviceobj, &data_acquire_pt);

}

if (deviceobj->over_range == 0 && data_acquire_pt.lc == 0){

LCDDisplay (dataobj);

}

if (deviceobj->autotest_run && data_acquire_pt.lc == 0){

AutoTestProc(&tmp_addr, &toi2c_num, dataobj, deviceobj, uartobj);

}

uart_loop:

if (uartobj->command_received){

EX0=0;

UARTProcessComm(dataobj, deviceobj, uartobj, &data_acquire_pt);

EX0=1;

}

if (uartobj->uartloop_flag){ goto uart_loop;}

if (QuicKeyProc(dataobj, deviceobj, uartobj)){

/*重置任務A,使其從頭開始執行*/

PT_INIT(&data_acquire_pt);

}

}

}

3 結果分析

根據不同的設置,在沒有事件發生時,任務A總的執行時間在20~4 000 ms之間,使用Protothreads之后總的執行時間并沒有明顯增加。在沒有使用Protothreads協程框架之前,按下按鍵使按鍵標志位置位后,要等待較長時間才能獲得響應。使用框架后,從最嚴重的延遲3 060 ms下降到270 ms。比較結果見表1。

表1 使用Protothreads前后結果比較

每個Protothreads協程僅需要2字節的存儲空間,使用協程的函數內的局部變量全部要改為靜態變量。任務A相比之前增加20字節的內存占用,程序大小增加1 KB左右。

結 語

本文分析了數據采集系統中存在任務響應不及時的問題,并根據其使用的微控制器資源緊缺和采集系統的特點,提出了使用Protothreads來實現多任務的編程方式;簡要介紹了Protothreads基本功能,詳細闡述了改進系統響應性能的實現方法。結合改進前后的數據,經過對比發現,該方法可以明顯提升系統性能,并且沒有明顯增加內存和程序空間占用,對于更復雜的系統需求,可以根據情況設計一個調度程序。本文對于其他嵌入式軟件開發具有較高的參考價值。

[1] 榮國平,劉天宇,謝明娟,等.嵌入式系統開發中敏捷方法的應用研究綜述[J].軟件學報,2014(2):267-283.

[2] 樓亮亮,周苗,鮑星合.一種適用于物聯網節點的高效輕量級嵌入式系統設計[J].單片機與嵌入式系統應用,2014(11):67-70.

[3] Dunkels A,Schmidt O,Voigt T,et al.Protothreads: Simplifying event-driven programming of memory-constrained embedded systems[C]//Proceedings of the Fourth ACM Conference on Embedded Networked Sensor Systems,2006:29-42.

[4] Dunkels A,Schmidt O.Protothreads-lightweight stackless threads in C [EB/OL].[2016-03].http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.60.2455&rep=repl&type=pdf.

[5] 閆石,馬潮.時間觸發模式下的Protothreads設計應用[J].單片機與嵌入式系統應用,2009(1):15-17.

楊一萌(研究生),研究方向為光電信號檢測與嵌入式系統應用;楊勇(教授),主要從事微弱信號檢測相關工作;楊遠聰(研究生),研究方向為光電信號檢測。

(責任編輯:薛士然收修改稿日期:2016-03-26)

Protothreads Application in Terms of Improving System Response

Yang Yimeng,Yang Yong,Yang Yuancong

(China University of Geosciences,Wuhan 430074,China)

The resource intensive small microcontroller can support multitasking by using the lightweight flexible multitask programming based on Protothreads,that improves the performance of the system.The experiment results show that the method can speed up 10 times maximum for the button response on a C51 system obviously.The method provides a new idea for running multitask on small microcontroller.

Protothreads;multitask;low-latency;STC90C516RD+

TP311

A

猜你喜歡
數據處理嵌入式程序
認知診斷缺失數據處理方法的比較:零替換、多重插補與極大似然估計法*
心理學報(2022年4期)2022-04-12 07:38:02
ILWT-EEMD數據處理的ELM滾動軸承故障診斷
水泵技術(2021年3期)2021-08-14 02:09:20
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
搭建基于Qt的嵌入式開發平臺
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
嵌入式軟PLC在電鍍生產流程控制系統中的應用
電鍍與環保(2016年3期)2017-01-20 08:15:32
基于希爾伯特- 黃變換的去噪法在外測數據處理中的應用
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
Altera加入嵌入式視覺聯盟
主站蜘蛛池模板: 四虎永久免费地址在线网站| 日韩人妻精品一区| 国产高清在线观看91精品| www.国产福利| 欧美一区二区人人喊爽| 国产色网站| 亚洲精品爱草草视频在线| 日韩专区第一页| 色综合婷婷| 国产女人喷水视频| 91蝌蚪视频在线观看| 日韩国产黄色网站| 久久精品日日躁夜夜躁欧美| 暴力调教一区二区三区| 91破解版在线亚洲| 18禁色诱爆乳网站| 国产又色又爽又黄| 99er精品视频| 亚洲日产2021三区在线| 亚洲av无码牛牛影视在线二区| 亚洲第一网站男人都懂| 日韩欧美综合在线制服| 亚洲第一区在线| 中美日韩在线网免费毛片视频| 在线国产毛片手机小视频| 98精品全国免费观看视频| 都市激情亚洲综合久久| 国内精品小视频在线| 亚洲男人的天堂网| 中文国产成人精品久久| 亚洲人成网站观看在线观看| 亚洲综合在线网| 亚洲成网站| 乱色熟女综合一区二区| 国内精品久久九九国产精品| 天堂久久久久久中文字幕| 国产精品免费p区| 91精品啪在线观看国产60岁| 国产亚洲精久久久久久无码AV| 亚洲首页国产精品丝袜| 国产导航在线| AV老司机AV天堂| 在线观看视频一区二区| 精品国产免费第一区二区三区日韩| 国产在线视频自拍| 国产成人精品一区二区| 国产午夜人做人免费视频中文| 美女潮喷出白浆在线观看视频| 久久国产亚洲欧美日韩精品| 亚洲精品视频网| 欧美日韩国产精品va| 亚洲欧美在线看片AI| 成人中文字幕在线| 亚洲激情99| 中文字幕在线永久在线视频2020| 日本精品αv中文字幕| 高清不卡一区二区三区香蕉| 成人精品在线观看| 国产精品综合久久久| 91国内在线观看| 日韩经典精品无码一区二区| 亚洲综合九九| 91精品国产91久久久久久三级| 日本欧美在线观看| 91免费国产在线观看尤物| 国产日韩欧美精品区性色| 亚洲综合18p| 久久影院一区二区h| 免费观看男人免费桶女人视频| 一级一毛片a级毛片| 亚洲女同欧美在线| 最近最新中文字幕免费的一页| 久久毛片免费基地| 伊人五月丁香综合AⅤ| 中文字幕 日韩 欧美| 日韩视频精品在线| 亚洲人精品亚洲人成在线| 99在线小视频| 亚洲天堂视频网| 久久99久久无码毛片一区二区| 国产精品浪潮Av| 一本久道久综合久久鬼色|