(1)通常将RTOS讀作“實時多任務操作系統”,這個名稱包括了兩個部分“實時多任務”和“操作系統”。FreeRTOS提供了對實時多任務的通用的調度管理功能,但對于具體到單片機應用的操作系統的功能提供的較少,如果要将單獨的FreeRTOS應用到具體單片機的項目中,還需要用戶自己編寫一系列的程序。
(2)操作系統(OS)走入百姓家從多年前的PC計算機的DOS開始,當今的STC32G/F和STC8H系列單片機内核性能指标已經達到或超過當年運行DOS的PC機的水平了:
同時STC32G/F和STC8H系列單片機包括了豐富的片上資源,數量和性能遠超當年PC主闆,而體積和功耗卻小了幾個量級。
因此是時候為STC32G/F和STC8H系列單片機配一個簡單而完備的OS——操作系統了。
(3)泰山x51 前後台實時多任務操作系統(TSx51-RTOS)是一款專門為STC系列單片機設計的基礎操作系統,為各種RTOS的運行提供系統節拍、系統時間、臨界區保護、适合多任務的串口命令行輸入輸出、8位數碼管實時顯示以及單片機初始化等操作系統功能。
TSx51-RTOS使用定時器4作為系統中斷,提供1KHz的系統節拍,使用串口1作為命令行輸入輸出端口,使用定時器2作為波特率發生器,波特率為115200,單片機燒錄主頻使用24MHz。
(4)本文介紹在STC32G實驗箱上運行的FreeRTOS TSx51-RTOS的一個演示範例,由FreeRTOS提供實時任務管理功能,由TSx51-RTOS提供基本操作系統功能,組成了一個完整的實時多任務操作系統。
系統運行的效果見下面的視頻:
1)從視頻中可以看到數碼管在顯示當前的系統時間。TSx51-RTOS的系統時間中的小時不是24小時制,到24小時不清零,這是考慮那些長時間運行時的連續性專門設計的(比如按曲線設定溫度烘幹煙葉要連續幾天)。
2)從串口助手的接收框可以看到實時任務1的循環計數輸出和實時任務2的當前時間輸出。
3)如果手動發送框向串口發送字符串,可以從接收框看到實時任務0給出的響應效果。
4)視頻的最後是利用串口助手的“自動發送”功能,以10毫秒的周期自動發送字符串後,實時任務0的響應結果,可以觀察到任務0的對于每秒100次命令的輸入的響應效果。
(5)TSx51-RTOS的組成與用戶程序。下圖是本範例的項目組成圖:
其中“TSx51_SYS_Core_24M_STC32G.OBJ”和“TSx51_SYS_Core.h”是TSx51-RTOS的系統核心程序,以“OBJ”模塊文件的形式構成。使用OBJ模塊的目的是為了避免用戶編程時産生無意的改變(比如使用批量替換的程序編輯功能),造成程序運行時系統崩潰或者産生危險。TSx51-RTOS的原理和程序代碼将另文介紹。
項目中“TSx51_DRV_V94_STC32G.c”和“TSx51_DRV_V94.h”是STC32G實驗箱的8位數碼管和LED(它們共用P6端口硬件連在一起了)的驅動程序,提供各種筆畫、數值和時間的顯示功能。
項目中“main.c”、“TTasks.c”和“uCx51_4Tasks.c”分别為用戶的系統主程序、定時前台任務程序和實時多任務程序文件。
(6)系統初始化程序。在FreeRTOS的“xTaskCreate”函數建立任務和“vTaskStartScheduler”函數啟動任務前,TSx51-RTOS做了下面的單片機和操作系統初始化操作:
其中每個初始化步驟都有注釋,這裡就不一一介紹了。
(7)TSx51-RTOS定時任務。TSx51-RTOS在定時器4的中斷裡面,用分頻的方法訪問4個回調函數,用戶隻要在這4個回調中編寫自己程序,系統就會自動地執行這個4個定時任務。本範例的定時任務程序如下圖所示:
1)1KHz定時任務,這裡是空任務。設計這個任務的目的是讓用戶在這裡實現自己的軟件定時器功能,比如毫秒表,比如毫秒精度的倒計時器,實現精确的硬件延時。在多任務情況下,一個任務軟件延時的時間長短不但依賴延時函數本身的循環次數,還依賴于RTOS分配給這個延時函數的CPU執行空循環的時間,所以在多任務環境中,軟件延時函數不一定延時準确。而硬件延時就不一樣了,由于硬件中斷的優先級高于各個實時任務的優先級,所以其倒計時時間與哪個任務在執行無關了。
對于FreeRTOS的“休眠狀态”時間是由系統硬件中斷控制的,任務的休眠時間是準确的且與各個任務的誰在運行無關,隻是喚醒後能不能立即得到響應,就要看其任務優先級和任務調度是否将控制權交給它了。
2)500Hz定時任務是專門為數碼管等實時顯示設備刷新用。本範例中它調用STC32G實驗箱的數碼管驅動程序的中斷刷新函數來實現數碼管的動态刷新,每次刷新一位數碼管的顯示。
3)40Hz定時任務是設計為進行按鍵,開關等手動輸入采樣用的。比如使用40Hz定時任務的按鍵掃描程序,在多任務程序可以很容易的實現防抖動處理和長按短按識别,不像某些程序用軟件延時的方法會阻塞整個程序的運行。
4)4Hz定時任務把一秒鐘分為4拍。對于那些需要在整小時、整分鐘和整秒鐘對齊的操作,可以提前幾個節拍做準備工作,實現設備同步運行。
本範例中利用STC32G實驗箱上的兩個LED實現每秒鐘閃爍一次的生命燈。同時第54行程序實現每秒鐘刷新4次的數碼管時間顯示,從視頻中可以看到小數點的交替和秒數字進位等顯示都很流暢。
(8)串口輸出。TSx51-RTOS内含了串口1的命令行輸入輸出中斷驅動程序。其中串口輸出函數是采用了函數可重入的無阻塞搶奪型輸出方法,優先級高的任務可以剝奪正在使用串口輸出的低優先級任務的控制權,優先輸出自己的字符串。等低優先級任務獲得任務執行權時,再從被搶奪點的下一個字符繼續輸出自己的字符串。采用搶奪型輸出策略,就是不采用傳統的優先級反轉這類複雜的多任務串口輸出控制方法,也不會産生阻塞。
下圖是實時任務1和實時任務2進行串口信息輸出的程序:
其中實時任務2每3秒在第145行輸出當前的系統時間。第142行的将系統時間轉換為字符串的轉換函數“TSx51_SYS_Time_to_String”為TSx51-RTOS專門的系統函數。
圖中實時任務1每1800毫秒在第124行輸出任務的循環計數。減小1800毫秒這個休眠時間,将可以看到優先級高的實時任務1如何搶奪實時任務2的輸出的。
(9)命令行輸入與處理流程。本範例實時任務0演示了最基本的無阻塞地從串口輸入一個字符串,并将其再次輸出到串口上供用戶檢查。實現這個功能的程序如下圖:
TSx51-RTOS的命令行字符串接收由UART1的中斷服務程序處理,接收到的字符依次存在系統内部接收緩沖區中,内部接收緩沖區的長度為63個字節。當接收到回車(0x0D)、換行(0x0A)和C語言字符串結束符(0x00)之中任何一個字符,就回調用第101行的鈎子函數“TSx51_SYS_UART1_RX_NewLine_Hook”。由于鈎子函數的執行是在UART1中斷服務程序中,因此命令行字符串的處理不适合放在鈎子函數中。本範例收到字符串後,隻是在鈎子函數中設置收到命令行的信号量“RX_Flag”,由實時任務0處理。
(10)命令行處理程序流程。實時任務0的開始設置部分第67行清除接收标志信号量“RX_Flag”,第69行讓UART1中斷服務程序開始接收新字符串。
1)在任務主循環部分,首先第74行檢查是否收到命令行字符串,如果沒有檢測到輸入字符串,則在第95行放棄任務的CPU控制權(任務0的優先級最高,如果不利用休眠函數放棄控制權,則任務1和任務2就沒有執行的機會了),休眠10毫秒後,再跳轉到主循環開始進行新一輪的檢查。休眠時間這裡為10毫秒,如果長了,任務0對命令行的響應慢,如果太短,則導緻與各個任務切換太頻繁,影響任務1和任務2的執行效率。因此具體取多少要根據具體項目來平衡。
2)如果收到,第77行程序将輸入的字符串從系統緩沖區複制到用戶自己的任務緩沖區進行處理,原始字符串仍然留着系統緩沖區中供多次處理用。
這裡,第80行和第81行簡單地接收到字符串回送到輸出到串口去。第84行程序輸出一個命令行提示符,第87行清除信号量标志,第89行讓UART1中斷服務程序再次開始接收新字符串,開始新的一輪接收流程。
(11)總結:将FreeRTOS實時多任務操作系統與TSx51-RTOS前後台實時多任務系統結合起來,就可以實現一個完整的人機交互的操作系統,實現任務調度、系統運行節拍控制、信息的實時顯示與控制台輸出以及控制台命令輸入與處理等各種操作系統功能。
并且将控制台任務的優先級設置為最高,操作者可以通過上位機的串口輸出命令接管單片機的CPU運行權,進行命令處理,操作整個單片機系統運行,就可以構建成一個名副其實的“操作系統”。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!