時間片輪詢法,在很多書籍中有提到,而且有很多時候都是與操作系統(tǒng)一起出現(xiàn),也就是說很多時候是操作系統(tǒng)中使用了這一方法。不過我們這里要說的這個時間片輪詢法并不是掛在操作系統(tǒng)下,而是在前后臺程序中使用此法。也是本貼要詳細說明和介紹的方法。
對于時間片輪詢法,雖然有不少書籍都有介紹,但大多說得并不系統(tǒng),只是提提概念而已。下面本人將詳細介紹本人模式,并參考別人的代碼建立的一個時間片輪詢架構(gòu)程序的方法,我想將給初學(xué)者有一定的借鑒性。
記得在前不久本人發(fā)帖《1個定時器多處復(fù)用的問題》,由于時間的問題,并沒有詳細說明怎樣實現(xiàn)1個定時器多處復(fù)用。在這里我們先介紹一下定時器的復(fù)用功能。。。
使用1個定時器,可以是任意的定時器,這里不做特殊說明,下面假設(shè)有3個任務(wù),那么我們應(yīng)該做如下工作:
1. 初始化定時器,這里假設(shè)定時器的定時中斷為1ms(當(dāng)然你可以改成10ms,這個和操作系統(tǒng)一樣,中斷過于頻繁效率就低,中斷太長,實時性差)。
2. 定義一個數(shù)值:
復(fù)制內(nèi)容到剪貼板
代碼:
#define TASK_NUM (3) // 這里定義的任務(wù)數(shù)為3,表示有三個任務(wù)會使用此定時器定時。
uint16 TaskCount[TASK_NUM] ; // 這里為三個任務(wù)定義三個變量來存放定時值
uint8 TaskMark[TASK_NUM]; // 同樣對應(yīng)三個標(biāo)志位,為0表示時間沒到,為1表示定時時間到。
3. 在定時器中斷服務(wù)函數(shù)中添加:
復(fù)制內(nèi)容到剪貼板
代碼:
void TimerInterrupt(void)
{
uint8 i;
for (i=0; i
{
if (TaskCount[i])
{
TaskCount[i]--;
if (TaskCount[i] == 0)
{
TaskMark[i] = 0x01;
}
}
}
}
代碼解釋:定時中斷服務(wù)函數(shù),在中斷中逐個判斷,如果定時值為0了,表示沒有使用此定時器或此定時器已經(jīng)完成定時,不著處理。否則定時器減一,知道為零時,相應(yīng)標(biāo)志位值1,表示此任務(wù)的定時值到了。
4. 在我們的應(yīng)用程序中,在需要的應(yīng)用定時的地方添加如下代碼,下面就以任務(wù)1為例:
復(fù)制內(nèi)容到剪貼板
代碼:
TaskCount[0] = 20; // 延時20ms
TaskMark[0] = 0x00; // 啟動此任務(wù)的定時器
到此我們只需要在任務(wù)中判斷TaskMark[0] 是否為0x01即可。其他任務(wù)添加相同,至此一個定時器的復(fù)用問題就實現(xiàn)了。用需要的朋友可以試試,效果不錯哦。。。。。。。。。。。
通過上面對1個定時器的復(fù)用我們可以看出,在等待一個定時的到來的同時我們可以循環(huán)判斷標(biāo)志位,同時也可以去執(zhí)行其他函數(shù)。
循環(huán)判斷標(biāo)志位:
那么我們可以想想,如果循環(huán)判斷標(biāo)志位,是不是就和上面介紹的順序執(zhí)行程序是一樣的呢?一個大循環(huán),只是這個延時比普通的for循環(huán)精確一些,可以實現(xiàn)精確延時。
執(zhí)行其他函數(shù):
那么如果我們在一個函數(shù)延時的時候去執(zhí)行其他函數(shù),充分利用CPU時間,是不是和操作系統(tǒng)有些類似了呢?但是操作系統(tǒng)的任務(wù)管理和切換是非常復(fù)雜的。下面我們就將利用此方法架構(gòu)一直新的應(yīng)用程序。
時間片輪詢法的架構(gòu):
1.設(shè)計一個結(jié)構(gòu)體:
代碼:
// 任務(wù)結(jié)構(gòu)
typedef struct _TASK_COMPONENTS
{
uint8 Run; // 程序運行標(biāo)記:0-不運行,1運行
uint8 Timer; // 計時器
uint8 ItvTime; // 任務(wù)運行間隔時間
void (*TaskHook)(void); // 要運行的任務(wù)函數(shù)
} TASK_COMPONENTS; // 任務(wù)定義
這個結(jié)構(gòu)體的設(shè)計非常重要,一個用4個參數(shù),注釋說的非常詳細,這里不在描述。
2. 任務(wù)運行標(biāo)志出來,此函數(shù)就相當(dāng)于中斷服務(wù)函數(shù),需要在定時器的中斷服務(wù)函數(shù)中調(diào)用此函數(shù),這里獨立出來,并于移植和理解。
代碼:
void TaskRemarks(void)
{
uint8 i;
for (i=0; i// 逐個任務(wù)時間處理
{
if (TaskComps[i].Timer) // 時間不為0
{
TaskComps[i].Timer--; // 減去一個節(jié)拍
if (TaskComps[i].Timer == 0) // 時間減完了
{
TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢復(fù)計時器值,從新下一次
TaskComps[i].Run = 1; // 任務(wù)可以運行
}
}
}
}
大家認(rèn)真對比一下次函數(shù),和上面定時復(fù)用的函數(shù)是不是一樣的呢?
3. 任務(wù)處理
代碼:
void TaskProcess(void)
{
uint8 i;
for (i=0; i// 逐個任務(wù)時間處理
{
if (TaskComps[i].Run) // 時間不為0
{
TaskComps[i].TaskHook(); // 運行任務(wù)
TaskComps[i].Run = 0; // 標(biāo)志清0
}
}
}
此函數(shù)就是判斷什么時候該執(zhí)行那一個任務(wù)了,實現(xiàn)任務(wù)的管理操作,應(yīng)用者只需要在main()函數(shù)中調(diào)用此函數(shù)就可以了,并不需要去分別調(diào)用和處理任務(wù)函數(shù)。
到此,一個時間片輪詢應(yīng)用程序的架構(gòu)就建好了,大家看看是不是非常簡單呢?此架構(gòu)只需要兩個函數(shù),一個結(jié)構(gòu)體,為了應(yīng)用方面下面將再建立一個枚舉型變量。
下面我就就說說怎樣應(yīng)用吧,假設(shè)我們有三個任務(wù):時鐘顯示,按鍵掃描,和工作狀態(tài)顯示。
1. 定義一個上面定義的那種結(jié)構(gòu)體變量
代碼:
static TASK_COMPONENTS TaskComps[] =
{
{0, 60, 60, TaskDisplayClock}, // 顯示時鐘
{0, 20, 20, TaskKeySan}, // 按鍵掃描
{0, 30, 30, TaskDispStatus}, // 顯示工作狀態(tài)
// 這里添加你的任務(wù)。。。。
};
在定義變量時,我們已經(jīng)初始化了值,這些值的初始化,非常重要,跟具體的執(zhí)行時間優(yōu)先級等都有關(guān)系,這個需要自己掌握。
①大概意思是,我們有三個任務(wù),沒1s執(zhí)行以下時鐘顯示,因為我們的時鐘最小單位是1s,所以在秒變化后才顯示一次就夠了。
②由于按鍵在按下時會參數(shù)抖動,而我們知道一般按鍵的抖動大概是20ms,那么我們在順序執(zhí)行的函數(shù)中一般是延伸20ms,而這里我們每20ms掃描一次,是非常不錯的出來,即達到了消抖的目的,也不會漏掉按鍵輸入。
③為了能夠顯示按鍵后的其他提示和工作界面,我們這里設(shè)計每30ms顯示一次,如果你覺得反應(yīng)慢了,你可以讓這些值小一點。后面的名稱是對應(yīng)的函數(shù)名,你必須在應(yīng)用程序中編寫這函數(shù)名稱和這三個一樣的任務(wù)。
2. 任務(wù)列表
代碼:
// 任務(wù)清單
typedef enum _TASK_LIST
{
TAST_DISP_CLOCK, // 顯示時鐘
TAST_KEY_SAN, // 按鍵掃描
TASK_DISP_WS, // 工作狀態(tài)顯示
// 這里添加你的任務(wù)。。。。
TASKS_MAX // 總的可供分配的定時任務(wù)數(shù)目
} TASK_LIST;
好好看看,我們這里定義這個任務(wù)清單的目的其實就是參數(shù)TASKS_MAX的值,其他值是沒有具體的意義的,只是為了清晰的表面任務(wù)的關(guān)系而已。
3. 編寫任務(wù)函數(shù)
// 任務(wù)清單
typedef enum _TASK_LIST
{
TAST_DISP_CLOCK, // 顯示時鐘
TAST_KEY_SAN, // 按鍵掃描
TASK_DISP_WS, // 工作狀態(tài)顯示
// 這里添加你的任務(wù)。。。。
TASKS_MAX // 總的可供分配的定時任務(wù)數(shù)目
} TASK_LIST;
代碼:
void TaskDisplayClock(void)
{
}
void TaskKeySan(void)
{
}
void TaskDispStatus(void)
{
}
// 這里添加其他任務(wù)。。。。。。。。。
現(xiàn)在你就可以根據(jù)自己的需要編寫任務(wù)了。
4. 主函數(shù)
代碼:
int main(void)
{
InitSys(); // 初始化
while (1)
{
TaskProcess(); // 任務(wù)處理
}
}
到此我們的時間片輪詢這個應(yīng)用程序的架構(gòu)就完成了,你只需要在我們提示的地方添加你自己的任務(wù)函數(shù)就可以了。是不是很簡單啊,有沒有點操作系統(tǒng)的感覺在里面?
上一篇:你不知道的單片機編程器分類
下一篇:PLC控制與單片機控制的區(qū)別
推薦閱讀
史海拾趣
為了進一步提升研發(fā)實力和市場競爭力,微芯生物開始了并購之路。他們先后收購了多家在生物醫(yī)藥領(lǐng)域具有優(yōu)勢的企業(yè),包括專注于生物制品生產(chǎn)和銷售的企業(yè)、創(chuàng)新藥物研發(fā)企業(yè)以及提供全方位生物醫(yī)藥研發(fā)生產(chǎn)外包服務(wù)的企業(yè)等。通過并購整合,微芯生物不僅增強了自身的研發(fā)實力和市場占有率,還進一步完善了公司的產(chǎn)業(yè)鏈和戰(zhàn)略布局。
面對電子行業(yè)日益多樣化的市場需求,F(xiàn)lexiPanel推出了定制化RF模塊解決方案服務(wù)。公司擁有一支專業(yè)的技術(shù)團隊,能夠根據(jù)客戶的具體需求,提供從需求分析、方案設(shè)計、樣品制作到批量生產(chǎn)的全流程服務(wù)。這種靈活多樣的服務(wù)模式不僅滿足了客戶對于個性化產(chǎn)品的需求,還幫助FlexiPanel在市場中建立了良好的口碑和品牌形象。
隨著國內(nèi)市場的不斷飽和,ATP公司開始將目光投向國際市場。他們制定了國際化發(fā)展戰(zhàn)略,通過設(shè)立海外分支機構(gòu)、參加國際展會等方式拓展海外市場。同時,公司積極與國際知名企業(yè)合作,共同開發(fā)新產(chǎn)品、新技術(shù),實現(xiàn)了互利共贏。這些舉措為ATP公司的全球化發(fā)展奠定了堅實基礎(chǔ)。
請注意,上述故事僅為虛構(gòu)內(nèi)容,不代表Advanced Thermal Products Inc公司的真實發(fā)展歷程。如需了解該公司的真實情況,建議查閱相關(guān)資料或訪問其官方網(wǎng)站。
在競爭激烈的電子行業(yè)中,DATEL Inc.始終保持著持續(xù)創(chuàng)新的動力。公司不斷投入研發(fā)資源,推出了一系列具有創(chuàng)新性和競爭力的新產(chǎn)品。同時,DATEL Inc.還注重人才培養(yǎng)和團隊建設(shè),積極引進優(yōu)秀人才,打造了一支高素質(zhì)的研發(fā)團隊。這支團隊不斷創(chuàng)新、追求卓越,為DATEL Inc.的持續(xù)發(fā)展提供了強有力的支撐。
以上五個故事概要旨在反映DATEL Inc.公司在不同領(lǐng)域的發(fā)展情況,但請注意這些故事是基于假設(shè)構(gòu)建的,并非真實事件。如需了解更多關(guān)于DATEL Inc.公司的真實故事和發(fā)展歷程,建議查閱公司官方網(wǎng)站或相關(guān)新聞報道。
隨著技術(shù)的不斷進步,DATEL Inc.的數(shù)據(jù)采集產(chǎn)品逐漸在軍事領(lǐng)域找到了用武之地。公司接到一項為軍方開發(fā)高精度數(shù)據(jù)采集系統(tǒng)的訂單。經(jīng)過深入研究和反復(fù)測試,DATEL Inc.成功交付了一套滿足軍方嚴(yán)苛要求的數(shù)據(jù)采集系統(tǒng),為軍方提供了準(zhǔn)確、可靠的數(shù)據(jù)支持。這一突破不僅為DATEL Inc.贏得了軍方的高度認(rèn)可,也進一步擴大了公司在軍事領(lǐng)域的影響力。
ce 5.0, 在platform settings->locale相應(yīng)地方選中阿拉伯語,并添加阿拉伯字體。可編譯出來的系統(tǒng)是英文,為什么呢?… 查看全部問答∨ |
哪位高手能用操作系統(tǒng)里的線程調(diào)用等等知識來解釋一下Ctrl+A,Ctrl+c,Ctrl+V的原理啊?? 反正我是一點頭緒都沒有,這操作系統(tǒng)也太難學(xué)了吧.......我不知道該往哪個地方發(fā)帖,就發(fā)這里了,有想法的就說說,咱都給分!!!… 查看全部問答∨ |
2011年9月29日8:30:26 1、assign一般多用于組合邏輯,其后變量必須為wire類型;對于輸入和輸出變量,如不聲明其類型,默認(rèn)為wire類型。 2、always多用于時序邏輯。 2011年9月30日 3、modelsim ...… 查看全部問答∨ |
|
本科僧求助。。。LM324構(gòu)成的RC正弦波振蕩器,頻帶不夠?qū)捲趺崔k? 模電課設(shè),LM324運放構(gòu)成的RC正弦波振蕩電路,用的文氏橋電路。可是老師要求頻率達到100KHz,說需要引入負(fù)反饋來拓寬頻帶,加上了一個運放構(gòu)成的負(fù)反饋后情況似乎沒有改觀,求教...… 查看全部問答∨ |
|
創(chuàng)業(yè)合作-歡迎人在上海放入志同道合的朋友一同創(chuàng)業(yè) 朋友您好! 我們創(chuàng)業(yè)團隊現(xiàn)在在做的項目是健康與移動物聯(lián)相結(jié)合的產(chǎn)品,分硬件和軟件的兩部分; 硬件部分具有感知人體的健康程度,智能感知,智能監(jiān)護。軟件部分是一個平臺系統(tǒng)根據(jù)這個健康程度分析出結(jié)果和建議呈現(xiàn)給用戶。 我們現(xiàn)在創(chuàng)業(yè)團隊有 ...… 查看全部問答∨ |
|
如下是 DS1302的 讀時鐘或ram的 子代碼。scl為clock。 sda為data(I/0)。 en為RST信號。uchar read(uchar a2) //a2 為地址{uchar j,d2=0x00;en=0;scl=0;en=1;for(j=0;j<8;j++) //發(fā)送地址{scl=0;sda=(a2 ...… 查看全部問答∨ |
由于產(chǎn)品需要,我先后接觸了STM32和STM8S兩種芯片。考慮到功能的可擴展性,我先選擇使用STM32F103芯片,該芯片編程以及硬件設(shè)計都很方便,可以負(fù)責(zé)任的說該芯片很強大而且價位合適。但,考慮到功耗以及版圖面積的原因,該芯片還是存在不足,我們實 ...… 查看全部問答∨ |
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦
- iTOP-i.MX6開發(fā)板設(shè)備數(shù)驅(qū)動Menuconfig的用法
- 迅為IMX6ULL開發(fā)板Qt for Android搭建開發(fā)環(huán)境
- 迅為i.MX8M mini開發(fā)板Windots QT系統(tǒng)開發(fā)環(huán)境搭建
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)使用Gstarwmra(一)
- 迅為IMX8M mini開發(fā)板Linix系統(tǒng)修改默認(rèn)屏幕
- iTOP-4412開發(fā)板支持4G以上文件系統(tǒng)擴展
- 迅為IMX8MM開發(fā)板Yocto系統(tǒng)設(shè)置開機自啟動
- 迅為IMX6Q開發(fā)板 Buildroot文件系統(tǒng)mqtt測試
- 迅為IMX8MM開發(fā)板Linux系統(tǒng)修改默認(rèn)屏幕
- 英特爾攜海信發(fā)布端側(cè)會議領(lǐng)域垂域模型解決方案,讓商務(wù)會議更安全更智能
- 英特爾攜手MAXHUB聯(lián)合發(fā)布企業(yè)級AI PC, 加速AI大模型在端側(cè)落地
- 助力低碳數(shù)字未來 英飛凌攜多款創(chuàng)新成果亮相2025慕尼黑上海電子展
- ?日清紡微電子科技賦能產(chǎn)業(yè)升級,亮相慕尼黑上海電子展
- 泰克閃耀 2025 慕尼黑上海電子展,引領(lǐng)測試技術(shù)新變革
- 破局AI眼鏡性能、續(xù)航、成本“不可能三角”:芯原推出高集成度參考設(shè)計方案
- 人形機器人成下一風(fēng)口,各大車企紛紛入局,比智能汽車潛力更大?
- 業(yè)績最高 TDK為汽車應(yīng)用推出電容值達100V的MLCC
- 微型柔性機器人:開啟智能救援與精準(zhǔn)醫(yī)療新紀(jì)元
- 人工智能加速芯片設(shè)計:動態(tài)自適應(yīng)流程引領(lǐng)高效創(chuàng)新
- 自動巡航車采用2D泛光LiDAR技術(shù)來消除盲點和確保安全
- 從智能座艙到數(shù)字化轉(zhuǎn)型 | 上海車展
- 院外心電監(jiān)護市場被看好,「粒恩醫(yī)療」通過設(shè)備+專職醫(yī)療服務(wù)入局
- 2019上海車展:舍弗勒展示用于自動駕駛的Space Drive線控技術(shù)
- 佛吉亞押注氫燃料電池技術(shù) 推零排放出行解決方案
- 驅(qū)動IC需求巨大,芯片國產(chǎn)化迫在眉睫
- 中端市場爭奪戰(zhàn)!三星透露將調(diào)整戰(zhàn)略,搶占中端市場
- ABB中國新工廠落“滬”,投資10億元建設(shè)其全球最大機器人工
- 聯(lián)想Z5 Pro嘲諷技能全開,小米MIX3躺槍無數(shù)
- 終于支持eSIM了,iOS 12.1或?qū)⒂?0月30日發(fā)布