中斷驅(qū)動多任務(wù)--- 單片機(jī)(MCU) 下的一種軟件設(shè)計結(jié)構(gòu)資料下載
2021-04-22 |
pdf |
139.12KB |
次下載 |
2積分
資料介紹
MCU由于內(nèi)部資源的限制,軟件設(shè)計有其特殊性,程序一般沒有復(fù)雜的算法以及數(shù)據(jù)結(jié)構(gòu),代碼量也不大, 通常不會使用 OS (Operating System), 因為對于一個只有若干K ROM、一百多byte RAM 的MCU來說,一個簡單OS 也會吃掉大部分的資源。
對于無OS的系統(tǒng),流行的設(shè)計是主程序(主循環(huán) )+(定時)中斷,這種結(jié)構(gòu)雖然符合自然想法,不過卻有很多不利之處,首先是中斷可以在主程序的任何地方發(fā)生,隨意打斷主程序。其次主程序與中斷之間的耦合性(關(guān)聯(lián)度)較大,這種做法 使得主程序與中斷纏繞在一起,必須仔細(xì)處理以防不測。
那么換一種思路,如果把主程序全部放入(定時)中斷中會怎么樣?這么做至少可以立即看到幾個好處:系統(tǒng)可以處于低功耗的休眠狀態(tài),將由中斷喚醒進(jìn)入主程序;如果程序跑飛,則中斷可以拉回;沒有了主從之分(其他中斷另計),程序易于模塊化。
為了把主程序全部放入(定時)中斷中,必須把程序化分成一個個的模塊,即任務(wù),每個任務(wù)完成一個特定的功能,例如掃描鍵盤并檢測按鍵。 設(shè)定一個合理的時基 (tick),例如 5、10 或 20 ms,每次定時中斷,把所有任務(wù)執(zhí)行一遍,為減少復(fù)雜性,一般不做動態(tài)調(diào)度(最多使用固定數(shù)組以簡化設(shè)計,做動態(tài)調(diào)度就接近 OS了),這實際上是一種無優(yōu)先級時間片輪循的變種。來看看主程序的構(gòu)成:
void main()
{
…. // Initialize
while (true) {
IDLE; //sleep
}
}
這里的 IDLE 是一條sleep 指令,讓MCU進(jìn)入低功耗模式。中斷程序的構(gòu)成:
void Timer_Interrupt()
{
SetTimer();
ResetStack();
Enable_Timer_Interrupt;
….
進(jìn)入中斷后,首先重置Timer,這主要針對8051、8051 自動重裝分頻器只有 8-bit,難以做到長時間定時;復(fù)位 stack ,即把stack指針賦值為棧頂或棧底,用以表示與過去決裂,而且不準(zhǔn)備返回到中斷點(diǎn),保證不會保留程序在跑飛時stack 中的遺體。Enable_Timer_Interrupt 也主要是針對8051。8051 由于中斷控制較弱,只有兩級中斷優(yōu)先級,而且使用了如果中斷程序不用 reti 返回,則不能響應(yīng)同級中斷這種偷懶方法,所以對于 8051,必須調(diào)用一次 reti 來開放中斷:
_Enable_Timer_Interrupt:
acall _reti
_reti: reti
下面就是任務(wù)的執(zhí)行了,這里有幾種方法。第一種是采用固定順序,由于MCU程序復(fù)雜度不高,多數(shù)情況下可以采用這種方法:
…
Enable_Timer_Interrupt;
ProcessKey();
RunTask2();
…
RunTaskN();
while (1) IDLE;
可以看到中斷把所有任務(wù)調(diào)用一遍,至于任務(wù)是否需要運(yùn)行,由程序員自己控制。另一種做法是通過函數(shù)指針數(shù)組:
#define CountOfArray(x) (sizeof(x)/sizeof(x[0]))
typedef void (*FUNCTIONPTR)();
const FUNCTIONPTR[] tasks = {
ProcessKey,
RunTask2,
…
RunTaskN
};
void Timer_Interrupt()
{
SetTimer();
ResetStack();
Enable_Timer_Interrupt;
for (i=0; i (*tasks[i])();
while (1) IDLE;
}
使用const 是讓數(shù)組內(nèi)容位于 code segment (ROM) 而非 data segment (RAM) 中,8051 中使用 code 作為 const 的替代品。
(題外話:關(guān)于函數(shù)指針賦值時是否需要取地址操作符 & 的問題,與數(shù)組名一樣,取決于 compiler. 對于熟悉匯編的人來說,函數(shù)名和數(shù)組名都是常數(shù)地址,無需也不能取地址。對于不熟悉匯編的人來說,用 & 取地址是理所當(dāng)然的事情。Visual C++ 2005對此兩者都支持)
這種方法在匯編下表現(xiàn)為散轉(zhuǎn),一個小技巧是利用 stack 獲取跳轉(zhuǎn)表入口:
下載該資料的人也在下載
下載該資料的人還在閱讀
更多 >
- 單片機(jī)多任務(wù)事件驅(qū)動C源碼
- 單片機(jī)與上位機(jī)軟件設(shè)計pdf(下) 0次下載
- 單片機(jī)與上位機(jī)軟件設(shè)計pdf(上) 0次下載
- 實時多任務(wù)機(jī)制在低功耗單片機(jī)系統(tǒng)中的最小實現(xiàn) 27次下載
- 單片機(jī)USB串口驅(qū)動軟件CH340下載 30次下載
- 使用RTX51進(jìn)行單片機(jī)軟件設(shè)計的資料說明
- 51單片機(jī)中斷的簡單學(xué)習(xí)資料免費(fèi)下載
- 如何使用51單片機(jī)實現(xiàn)多任務(wù)機(jī)制的策略詳細(xì)資料說明
- 使用單片機(jī)進(jìn)行中斷的應(yīng)用資料和程序免費(fèi)下載
- 如何使用51單片機(jī)進(jìn)行多任務(wù)機(jī)制及應(yīng)用
- 8051單片機(jī)C語言軟件設(shè)計8051單片機(jī)C語言軟件設(shè)計 92次下載
- 單片機(jī)系統(tǒng)多任務(wù)實現(xiàn)方法 751次下載
- 51單片機(jī)多任務(wù)機(jī)制的實現(xiàn)策略研究 159次下載
- 基于VxWorks的實時多任務(wù)軟件設(shè)計
- 基于VxWorks的實時多任務(wù)軟件設(shè)計
- 什么是中斷?單片機(jī)中斷處理過程詳解 7k次閱讀
- 單片機(jī)外部中斷的好處 3.2k次閱讀
- 一份單片機(jī)多任務(wù)事件驅(qū)動C源碼 1.5k次閱讀
- 基于M16C62單片機(jī)實現(xiàn)實時多任務(wù)系統(tǒng)的設(shè)計方案 1.3k次閱讀
- 單片機(jī)的中斷程序如何運(yùn)行 1.2w次閱讀
- PIC單片機(jī)的命名規(guī)則詳細(xì)介紹 4.8k次閱讀
- 51單片機(jī)和STM32單片機(jī)的結(jié)構(gòu)有什么不同 7.9k次閱讀
- PIC單片機(jī)的基本程序設(shè)計方法解析 2.4k次閱讀
- 單片機(jī)多任務(wù)處理方案 1w次閱讀
- 8051單片機(jī)中斷系統(tǒng)結(jié)構(gòu)及中斷控制原理 1.1w次閱讀
- 淺析單片機(jī)C語言函數(shù)之中斷函數(shù) 1.2w次閱讀
- 基于51單片機(jī)的串口中斷發(fā)送數(shù)據(jù)幀 1.1w次閱讀
- 51單片機(jī)的中斷體系結(jié)構(gòu)_中斷的響應(yīng)過程 2.1w次閱讀
- 單片機(jī)中斷系統(tǒng)介紹_51單片機(jī)中斷系統(tǒng)結(jié)構(gòu) 1.3w次閱讀
- 一種基于STM32單片機(jī)的視頻遙控小車的設(shè)計 1.4w次閱讀
下載排行
本周
- 1冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 2安川A1000變頻器中文版說明書
- 20.16 MB | 3次下載 | 3 積分
- 3直流電路的組成和基本定律
- 1.67 MB | 2次下載 | 免費(fèi)
- 4丹佛斯2800系列變頻器說明書
- 8.00 MB | 1次下載 | 5 積分
- 5PC8011同步開關(guān)型降壓3.5A單節(jié)鋰電池充電管理電路技術(shù)手冊
- 0.74 MB | 1次下載 | 免費(fèi)
- 6ES7243E+ES8311音頻錄制與播放電路資料
- 0.06 MB | 1次下載 | 5 積分
- 7SDM02 激光測距模塊產(chǎn)品手冊
- 0.43 MB | 1次下載 | 免費(fèi)
- 8SDFM 激光測距模塊模組手冊
- 0.54 MB | 1次下載 | 免費(fèi)
本月
- 1CH341編程器軟件NeoProgrammer_2.2.0.10
- 20.47 MB | 170次下載 | 1 積分
- 22025智能家居傳感器市場分析及創(chuàng)新應(yīng)用
- 3.11 MB | 43次下載 | 免費(fèi)
- 3RV1126B系列開發(fā)板產(chǎn)品資料
- 4.19 MB | 18次下載 | 免費(fèi)
- 4CH341編程軟件下載
- 2.50 MB | 16次下載 | 5 積分
- 5全志系列-米爾基于T153核心板開發(fā)板 四核異構(gòu)、3路千兆網(wǎng),賦能多元化工業(yè)場景
- 3.05 MB | 12次下載 | 免費(fèi)
- 6【開源】60余套STM32單片機(jī)、嵌入式Linux、物聯(lián)網(wǎng)、人工智能項目案例及入門學(xué)習(xí)資源包
- 10.55 MB | 8次下載 | 免費(fèi)
- 7冷柜-電氣控制系統(tǒng)講解
- 13.68 MB | 4次下載 | 10 積分
- 8特斯拉MODEL S車載充電機(jī)主電路回路原理圖
- 0.81 MB | 4次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233094次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191448次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183356次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81604次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費(fèi)下載
- 0.02 MB | 73824次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評論