❶ stc系列單片機_μC/OS-Ⅱ在C8051F系列單片機上的移植及其應用系統開發
隨著微處理器技術的飛速發展和嵌入式系統實時性要求的不斷提高,應用實時多任務操作系統(RTOS)作為嵌入式設計的開發平台已逐步成為嵌入式應用設計的主流。本研究討論將μC/OS-Ⅱ移植到C8051F系列高性能8位單片機中,並以C8051F060為例闡述了其應用系統的開正基發過程。
一、μC/OS-Ⅱ的基本工作原理
1.任務管理
µC/OS-II中的任務可以是一個無限的循環,也可以在一次執行完畢後被「刪除」掉,即該任務可以認為CPU完全屬於該任務本身,實時應用程序的設計過程包括將問題分割為多個任務。µC/OS-II可以管理64個任務,每個任務有一定的優先順序,且優先順序不重復。
2.任務調度機制的實現
µC/OS-II是可剝奪型內核,優先順序高的任務一旦就緒就能剝奪優先順序較低任務的CPU使用權,這提高了系統的實時響應能力。在沒有中斷情況下,任務間的切換一般會調用OSSched()函數。µC/OS-II的中斷服務子程序和一般前/後台的操作有所不同。
3.任務之間的通信
在µC/OS-II中,可以通過信號量、消息郵箱和消息隊列等機制,實現數據共享和任務通信。消息郵箱用一個指針型變數,一個任務或一個中斷服務子程序通過內核服務,將一則消息放入郵箱,一個或多個任務通過內核服務接受這則消息。每個郵箱有相應的等待消息任務表,等待消息的任務在無消息時被置掛起態,並記入郵箱等待消息任務表中。消息放入郵箱,內核將運行等待消息任務表中優先順序最高的任務。
二、移植及應用
C8051F060系列單片機特別適舉數謹用於任務繁重的小型化測控系統。當晶元具有的功能被較多地使用時,系統要處理的任務就較多,編程頭緒也多。為了簡化應用程序實現程序模塊化,提高應用程序的實時性和可靠畢納性,將μCOS2Ⅱ移植到C8051F060中就成為一件很有意義的事。
1.µC/OS-II的移植
(1)修改INCLUDES.H文件:增加的頭文件放在頭文件列表的最後。
#include "os_cpu.h"
#include "os_cfg.h"
#include "ucos_ii.h"
(2)修改OS CPU.H文件:為確保系統在KEIL環境下正常運行,重新定義了一系列與C8051F060和KEIL編譯器相關的數據結構、宏和常數。
typedef unsigned char OS_STK;/*定義堆棧寬度為8位*/
typedef unsigned char OS_CPU_SR;
#define OS_ENTER_CRITICAL() EA="0"
#define OS_EXIT CRITICAL()EA="1"
(3)修改OS_CPU_A.ASM文件
①編寫OSSTartHihgRdy()函數:獲得將要恢復運行的就緒任務的堆棧映像的最低地址,並計算出堆棧長度,然後向系統堆棧復制數據、堆棧指針SP和堆棧映像指針?C_XBP,最後利用中斷返回。
②編寫OSCtxSw()函數:先從當前任務的TCB控制塊中獲得當前任務堆棧長度和堆棧映像指針,然後將系統堆棧的內容復制到任務堆棧映像,最後獲得將要恢復運行的就緒任務的TCB,程序跳至OSSTartHihgRdy()函數的入口,實現任務的切換。
③編寫OSIntCtxSw()函數:代碼大部分與OSCtxSw()相同,不同之處在於此處不需要再保存寄存器;需要調整堆棧指針(SP=SP-4),去掉在調用OSIntExit(),OSIntCtxSw()中壓入堆棧中的多餘的內容,以使堆棧中只包含任務的運行環境。
④編寫OSTickISR()函數:用定時器0作中斷源,初始化定時器0使系統每秒中斷100次,節拍率Tick=100次/秒。
(4)修改OS_CPU_C.C文件:編寫OSTaskStkInit()函數用來初始化堆棧。
2. 基於µC/OS-II的C8051F060應用系統開發
移植了µC/OS-II的C8051F060的每個功能都可以作為一個獨立的任務,每個任務都有自己的堆棧空間,可以被其他任務和中斷服務程序掛起。在設計中,主函數均以OSInit()開始,以OSStart()結束,中間部分為與硬體相關的系統初始化函數。對於任務的建立,必須依照µC/OS-II系統中建立任務的格式,根據自己的需求來確定任務的個數,並且根據任務的重要程度和被調用的頻率來設置好優先順序。創建好任務後,在主函數外面分別列出各個任務函數,每個任務函數都是一個無限循環程序,調用實現某些功能的應用程序函數,然後按設計的需求設置掛起方式和掛起時間。
應用系統測試程序實現了6個任務:Task1是每1s發送CAN數據包,Task2是處理CAN接收到的數據,Task3是每3s發送串口數據,Task4是處理串口接收到的數據,Task5是處理按鍵信息,Task6是顯示數據。CAN匯流排接收採用中斷方式,其優先順序高於其他任務,為了保證系統的實時性,在中斷程序中不處理數據,只是發送一個信號量,在Task2中處理CAN數據。串口數據接收亦採用中斷方式,其優先順序低於CAN高於其他任務。串口數據發送採用的是查詢方式,按位元組發送。程序中設置6個任務的優先順序依次為13,11,14,12,15,16。
在主程序中,首先初始化C8051F060和CAN,調用OsInit();然後調用API函數,創建6個任務(不包括空閑任務);再創建一個信號量CAN_EVENT,為中斷與Task2通信所用;最後調用OSStart(),OS系統開始運行優先順序最高的任務。Task2的優先順序最高,但是在沒收到CAN_EVENT之前,任務一直處於休眠狀態,當CAN接收器收到數據包後,Task2進入就緒態,在中斷返回時,進行任務切換,執行優先順序最高Task2。在Task2還未收到信號量之前,Task1、Task3、Task4、Task5和Task6根據時間延時和優先順序的不同各自獨立運行。
三、結束語
將編寫的測試程序下載到C8051F060應用系統中進行了實際的運行測試,測試表明,基於µC/OS-II的C8051F060應用系統中的各任務工作穩定可靠,取得了滿意的效果,為進行嵌入式應用系統的進一步設計奠定了基礎。
(作者單位:黑龍江省大慶職業學院)
註:本文中所涉及到的圖表、註解、公式等內容請以PDF格式閱讀原文
本文為全文原貌 未安裝PDF瀏覽器用戶請先下載安裝 原版全文
❷ 51單片機匯編語言如何用定時器中斷實現數碼管從0-F每秒進1且循環進行。
ORG0000H
JMPBEGIN
ORG000BH
LJMPT0ISR
ORG0030H
TABLE:;共陰極數碼管顯示代碼表
DB3FH,06H,5BH,4FH,66H;01234
DB6DH,7DH,07H,7FH,6fh;56789
;---------------------------------------
BEGIN:
MOVTMOD,#01H
MOVTH0,#HIGH(65536-50000)
MOVTL0,#LOW(65536-50000)
SETBTR0
SETBET0
SETBEA
MOVR2,#20
CLRA
LOOP:
MOVDPTR,#TABLE
PUSHACC
MOVCA,@A+DPTR
MOVP0,A
POPACC
SJMPLOOP
T0ISR:
CLRTR0
MOVTH0,#HIGH(65536-50000)
MOVTL0,#LOW(65536-50000)
SETBTR0
DJNZR2,T0E
INCA
ANLA,#0FH
T0E:
RETI
END
❸ 單片機內部數據儲存地址中的00H 和0FH,FFH代表什麼意思。。。F 和0是什麼
表示十六進制數的意思。
00H,0FH,FFH是一個十六進制數,它等於0,0FH=15,FFH=255,用於內部數據存儲的內存。
00H~FFH相當於小數0~255
例如:二進制十六進制十進制
00000000b000h
0000000101h1b
0000001002bh2
00001001b09h9
00001010b010
000010110bh11b
000011000ch12b
00001101b0dh13
00001110b014
00001111b0fh15
(3)F在單片機擴展閱讀:
注意事項:
8051系列單片機有兩個定時器:T0和T1,分別稱為定時器和T1定時器,這兩個定時器是16位定時器/計數器,8052系列單片機新增第三定時器/計數器T2,具有定時或事件計數功能,常用於時間控制,延時,外部時間計數和檢測等。
8051單片機的兩個定時器T0和T1分別由兩個特殊的功能寄存器組成,T0由專用寄存器TH0和TL0組成,T1由TH1和TL1組成。
當作為定時器使用時,定時器對8051單片機晶元振盪器輸出的脈沖數進行12分頻後計數,即每台機器周期使定時器T0/T1的寄存器值自動累加1,直到溢出,之後循環計數從0開始;所以,定時器的解析度是時鍾頻率的1/12。
當用作計數器時,外部脈沖信號按引腳T0(P3.4)或T1(P3.5)計數,當輸入的外部脈沖信號從1跳到0時,計數器的值自動增加1,計數器的最大頻率通常是時鍾頻率的1/24。
由此可以看出,無論是定時器還是計數器的工作方式,定時器T0和T1都不佔用CPU時間,除非定時器/計數器T0和T1溢出,否則它可能導致CPU中斷,然後執行中斷處理程序,因此定時器/計數器是一種單片機高效、靈活的工作元件。
❹ 單片機公式f=12MHz f是什麼意思
這並不是什麼單片機公式,只是給了單片機的時鍾信號頻率,簡稱單片機時鍾頻率f為12MHz。因為,多數單片機時鍾電路要外配晶振,而時鍾頻率是由晶振頻率決定的,所以,f 又稱為單片機晶振頻率。如下圖中畫圈的元件就是晶振,上面的數字就是這個 f 的頻率。
❺ 就想問單片機中的通用寄存器區(00H~1FH)中的H和F代表什麼意思
H 就是英文 hex adecimal, 表示 16進制。
前兩位是數值, 其中 的 F 表示 16進制 里的數值 15。
16進制 用 0,1,2,3 。。。9,A,B,。。。F 表示 某一位 是 0到15 中的1個數。
❻ pic單片機中ADDWF PCL,F 中f是指的什麼意思呢,請高手指點啊!!!!好像沒這個寄存器吧
ADDWF PCL,F,這條指令的意思表示W寄存器和PCL的值相加,結果存回到PCL寄存器,工作寄存器W的值不變,ADDWF PCL,W表示結果存回工作寄存器W,PCL的值不變
❼ 單片機的數據存儲器RAM地址空間為00H~FFH,其中00H~FFH是什麼意思,H,F分別代表什麼
H表示是16進制數,16進制數中用0—9和A—F來表示十進制數的0—15,一位16進制數最多可以表示16個數,即0H—FH,F則相當於15。
在單片機里,儲存空間劃分成很多小單元,每個單元包含8個2進制位,即一個位元組。每個單元都給一個地址標號,相當於門牌號,從0開始。你的這個單片機Ram地址空間00H—FFH,化成10進制數就是0—255,共256位元組,不出意外的話,你那個是典型的51單片機。