電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>嵌入式開發(fā)>中斷驅(qū)動多任務(wù)--- 單片機(MCU) 下的一種軟件設(shè)計結(jié)構(gòu)資料下載

中斷驅(qū)動多任務(wù)--- 單片機(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),將由中斷喚醒進入主程序;如果程序跑飛,則中斷可以拉回;沒有了主從之分(其他中斷另計),程序易于模塊化。 為了把主程序全部放入(定時)中斷中,必須把程序化分成一個個的模塊,即任務(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進入低功耗模式。中斷程序的構(gòu)成: void Timer_Interrupt() { SetTimer(); ResetStack(); Enable_Timer_Interrupt; …. 進入中斷后,首先重置Timer,這主要針對8051、8051 自動重裝分頻器只有 8-bit,難以做到長時間定時;復(fù)位 stack ,即把stack指針賦值為棧頂或棧底,用以表示與過去決裂,而且不準(zhǔ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ù)是否需要運行,由程序員自己控制。另一種做法是通過函數(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)表入口:
下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1FS4059B帶NTC升壓型兩節(jié)鋰電池充電管理IC數(shù)據(jù)手冊
  2. 3.24 MB   |  1次下載  |  免費
  3. 2基于波形捕獲的超聲波傳感水流量計量技術(shù)應(yīng)用說明
  4. 1.01MB   |  1次下載  |  免費
  5. 3ADE-12H混頻器規(guī)格書
  6. 0.28 MB   |  1次下載  |  5 積分
  7. 4AD9984A高性能10位顯示接口英文手冊
  8. 0.49 MB   |  1次下載  |  5 積分
  9. 551開發(fā)板芯片資料
  10. 14.95 MB   |  1次下載  |  1 積分
  11. 6用TL431LI-Q1監(jiān)控電流供應(yīng)
  12. 176.71KB   |  1次下載  |  免費
  13. 7Q1和非Q1器件的TPS54340/360/540/560和TPS54340B/360B/540B/560B之間的差異
  14. 123.6KB   |  次下載  |  免費
  15. 8TPS512xx MOSFET驅(qū)動電路設(shè)計指南
  16. 886.86KB   |  次下載  |  免費

本月

  1. 1HFSS電磁仿真設(shè)計應(yīng)用詳解PDF電子教程免費下載
  2. 24.30 MB   |  129次下載  |  1 積分
  3. 2繼電保護原理
  4. 2.80 MB   |  42次下載  |  免費
  5. 3正激、反激、推挽、全橋、半橋區(qū)別和特點
  6. 0.91 MB   |  36次下載  |  1 積分
  7. 4GBT 4706.1-2024家用和類似用途電器的安全第1部分:通用要求
  8. 7.43 MB   |  18次下載  |  免費
  9. 5在設(shè)計中使用MOSFET瞬態(tài)熱阻抗曲線
  10. 1.57MB   |  15次下載  |  免費
  11. 6AD18學(xué)習(xí)筆記
  12. 14.47 MB   |  8次下載  |  2 積分
  13. 7H橋中的電流感測
  14. 545.39KB   |  7次下載  |  免費
  15. 8幾張電動車充電器電路圖
  16. 0.23 MB   |  6次下載  |  1 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935113次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
  4. 1.48MB  |  420061次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233084次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191360次下載  |  10 積分
  9. 5十天學(xué)會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183329次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81578次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73804次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65985次下載  |  10 積分