一、前言
前文介紹的“後台任務”是一個連續執行的過程,這在自然界中也是一個常見的現象。比如天氣一年年周而複始地變化,春夏秋冬四季輪回不止,比如我們每天工作學習,吃飯睡覺,一天一天的過日子,這些就是氣候和生活的“後台任務”,構成了氣候和生活的基本生命背景。
但是氣候和生活最精彩的部分卻不是這些“後台任務”,而是中斷後台任務的進程,突然插入的片段,比如台風來了,所到之處天搖地動,比如你的手機響了,接到的電話會立馬産生影響,快樂?憂愁?無限可能。
這種中斷事物當前的運行,臨時處理新事件的過程在操作系統的術語中被稱為“前台任務”。前台任務的特點是隻執行一個比較短的時間,有開始,有結束,唯獨不能像“後台任務”那樣無限循環沒完沒了。
在計算機運行過程中,每個中斷處理都是一個典型的“前台任務”,中斷服務程序(ISR)就是對應各個前台任務的任務函數。
既然前台任務中斷了後台任務,那麼前台任務執行過後後台任務能不能繼續順利地執行,兩者會不會互相影響,這個問題對于不同的單片機,不同的編譯器和不同的編程方法,結論是不同的。
由于教科書一般隻介紹成功的例子:後台任務被中斷後能繼續正确運行,前後台任務互相沒有影響,下面就介紹一個不成功的例子。
二、前台任務
(1)單片機最有特色的機制就是中斷,中斷編程是單片機編程中最重要的内容。STC8H系列單片機有豐富的中斷資源,其中定時器中斷是最基本的。本文用定時器0産生每秒100次的中斷,演示作為前台任務的效果。下圖是具體的範例程序:
前台任務程序範例
前台任務程序範例
(2)其中第37行到43行的初始化程序将定時器0設定為10毫秒的中斷周期。對于STC8051單片機,單片機中斷有兩級開關,首先一個是總中斷開關EA,第50行就是打開中斷總開關,其次對于每一個能産生中斷的片上設備,都有一個中斷允許位,隻有設置了這個中斷允許位,該設備才能産生中斷。第43行程序就是允許定時器0産生中斷。
為了避免意外,當單片機加電冷複位時,所有的設備中斷和總中斷都是關閉的,用到誰,打開誰。
(3)為了專門顯示前台任務的效果,第54行到第57行後台任務就隻是一個空循環,什麼事都不做。
(4)第61行到第71行是定時器0的中斷服務程序(前台任務函數),在C51語言中,用戶用“interrupt”關鍵字指明中斷号,這裡是1号中斷。
作為前台任務的中斷,是由單片機硬件産生的,中斷服務程序是由硬件調用的,因此前台任務函數沒有調用參數,也沒有返回值。前台任務函數名可以是任意的,但在整個程序中必須是唯一的。
(5)前台任務首先将節拍計數變量“Tick0”加1,然後每當Tick0的值為100的整倍數時,用“printf”庫函數輸出Tick0變量的值。
下面的視頻是前台任務執行的效果。
三、前後台任務
(6)我們已經看到了單獨的後台任務和單獨的前台任務的運行效果,如果我們在一個程序中将前後台任務組合在一起,其效果會不會像教科書中介紹的那樣前後台任務獨立正确的運行呢?下圖是完整的前後台任務程序:
前後台任務範例
前後台任務範例
(7)下面是前後台任務程序在STC8H的運行結果視頻:
(8)下面是運行效果的一個截屏:
後台任務出錯了
出錯的現象奇奇怪怪,出錯的原因不是單片機,也不是程序員,出錯的原因是“printf”這個庫函數。
(9)結論:對于STC8H單片機,使用Keil的C51編譯器,“printf”這個庫函數不能在前後台任務中同時使用。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!