搭建使用 RTX51-Tiny 的 C51 Keil 項目環境


最近 1 個月一直在利用業余時間研究 STC12A5C60S2 單片機及其應用,用於放松每天搞 SharePoint 后的緊張心情和頭腦。(事實證明,能放松那才怪!)

在折騰完了 LCD 1602、LCD 12864(並、串)、PCF 8563(時鍾芯片)、nRF24L01(無線通信)、矩陣鍵盤、LN 298(H 橋電機驅動)、光耦計數器、HC-SR 04(超聲波測距)之后,決定放棄“白痴”一樣基於中斷、定時器循環的“多任務”程序,上操作系統。否則,后面我想寫略微復雜的應用是幾乎不可能的。

下面這個就是我使用的 STC12A5C60S2 單片機最小系統,自帶 U 轉串芯片,所有 IO 口引出,燒片調試很方便:

這種小板要說缺點,也是有的,就是沒有安裝孔,整個板只能“飄”着,靠杜邦線的張力來固定(呃,也就是沒有固定:),所以后來用到小車上面時,只能像這樣在底部焊“支架”再安裝到洞洞板上:

 

操作系統的選擇

最開始考慮的是 uc/OS-II。因為名氣大(經常看到),功能強(聽上去),而且我買的書里面也是介紹這個操作系統。

us/OS-II 的任務調度是完全基於任務優先級的搶占式調度方式,正在執行的低優先級任務可以被處於“READY”狀態的高優先級任務打斷。這點在 STC12A5C60S2 里面通過設置硬件中斷優先級也可以實現,但我不可能任何任務都是中斷吧。所以還是得用操作系統。

結果網上翻了翻資料,傻眼了。us/OS-II 太xx復雜了,沒有一個網頁能夠清楚的用幾段話說清楚應該怎么用。而且,us/OC-II 到 STC12A5C60S2 需要移植(就是你得改他的源碼,從而適應硬件的特殊情況)。呃 … …

然后,開始考慮 RTX-51。因為 C51 開發工具 Keil 里面自帶 RTX-51 操作系統,且直接支持在 Keil 中編譯調試,頗有吸引力 :)

RTX-51 有 2 個版本:Full 和 Tiny。

Full 需要的資源較多,但支持搶占式任務調度和中斷任務,以及任務間互發消息;Tiny 不支持搶占式調度,任務間也不能互發消息,但消耗資源少。

Full 版本雖然功能強大,但是占 8K ROM 也就算了,還需要至少 450 字節的 xData!STC12A5C60S2 總共才 1024 字節的片上 xData RAM,而且我還要 xData 當作液晶屏顯存用呢。想了想,果斷選擇 RTX-51 Tiny。

Tiny 版本不占用 xData,RAM 占用也很少(7+3×任務數),比較合適。至於缺點,只能用了才知道。Tiny 版是開源的,源碼是匯編。國內有人對照着寫自己寫了個操作系統,叫做 Small RTOS51

Small RTOS 51 的作者陳明計,當年是因為找不到合適的單片機操作系統,“一怒之下”自己動手寫了這個既有 Tiny 版本資源占用少的優點,又能支持搶占式任務調度的操作系統。(自己不爽,就創造一個,這似乎是很多牛人和新技術出現的根本動力啊!所以說,沒有好輪子用的時候,就要自己發明新的輪子。)

RTX-51 Tiny 使用還是很簡便的,網上隨便翻翻,馬上就找到了可用的指南(基於 RTX51 的單片機軟件設計),作者寫得很好,10 分鍾就看懂了,然后開始動手。

 

搭建環境

項目名字叫做 Wave。

首先,建立好項目目錄結構。每個子目錄放對應的內容,要不然,所有文件都堆在項目文件夾下面,你很快就暈了:

100 文件夾結構

上面圖中,

  • code 放自己的代碼
  • lib 放外部程序庫的代碼
  • listing 放 Keil 生成的中間文件(方法、變量的內存地址映射什么的)
  • output 放 Keil 生成的 HEX 文件
  • document 放文檔

這個目錄結構和 Keil IDE 里面的“目錄”結構是不一樣的(也不需要一樣)。

 

然后,開 Keil IDE 新建一個項目,放在剛剛的目錄下面:

101 新建項目

Keil IDE 有試用版的。試用版有全部功能,唯一的限制是只能編譯 2K 以內的目標代碼。

 

選擇芯片庫,我這里用的是 STC:

102 選擇芯片庫

Keil 默認的芯片庫里面,是沒有 STC 的芯片的,可以按照下面的步驟將 STC 的芯片庫加入到 keil 中:

  • 宏晶官網下載 UV3.CDB
  • 將UV3.CDB改名為STC.CDB,拷貝到Keil安裝目錄的UV4子目錄下
  • 修改Keil安裝目錄下的TOOLS.ini文件,在[C51]上方添加:CDB0=UV4\STC.CDB("STC Chip")
  • 建立新項目,然后就可以選擇對應的芯片數據庫了

然后,選擇芯片:

103 選擇芯片型號

問你是否需要自動包含啟動代碼,選“否”(除非你要改程序起始地址什么的):

104 是否需要啟動代碼

 

改改 Target 的名字,看上去好看些,然后設置項目屬性:

110 設置目標屬性

寫好晶振頻率並選擇“RTX-51 Tiny”作為操作系統,這樣 Keil 會自動將 lib 文件編譯到輸出中(Memory Model 用 Small 比較好,免得每次聲明變量都寫 data 修飾):

111 設置RTX-51 Tiny操作系統

然后選擇 output、listing 目錄到前面建立好的目錄結構:

112 選擇輸出目錄

113 選擇listing目錄

然后,忽略調用警告信息(這個警告會提醒你哪些函數定義了但是未被調用,很討厭!):

114 設置忽略警告

設置好調試選項(STC12A5C60S2 支持 ISD-51 進行在線調試,不過,實際用下來用處不大,外圍硬件模塊根本不會跟着斷點等你,還是先用軟件模擬調試好了再說):

115 設置調試

 

接下來,將常用的庫文件拖到 lib 目錄中:

  • ISD51.h,ISD51.A51 用於在線調試
    和串口 0 沖突,慎用
  • stc12c51a.h 單片機自帶的頭文件
  • Conf_tny.A51
    RTX-51 Tiny 的配置程序

120 放置庫文件

Conf_tny.A51 還是需要做點兒修改的:

  • INT_CLOCK,定義每個計時中斷對應的時鍾周期數,默認 10000,我改成 1000 了 ;)
    這個值會影響 os_wait 第二個參數的長短。例如,ow_wait(K_TMO, 5, 0) 等待 5 個計時周期,也就是等待 5000 個時鍾周期。
  • TIMESHARING,每個任務分到的時鍾中斷數量。默認是 5。
    這樣,每個任務都會被分配 5000 個時鍾周期的任務時間,到期以后,任務將被掛起,其它處於 READY 狀態的任務會運行。
    如果這個值是 0,那么,Round Robin 的任務輪詢算法會停止,必須你自己手動 os_send_signal 或者 os_switch_task 來切換任務。某些時候,這樣會提高實時性。
  • RAMTOP。指定了可用 RAM 的頂部地址,默認是 0FFH,即 256 字節 RAM。
    就 STC 這塊芯片來說,這樣的默認設置在任務代碼非常短小時沒有問題,但是,如果任務代碼較長,建議還是改小點兒,比如 0CFH。原因不明,但可能是因為高 128 字節 RAM 的直接存取方式是讀寫的特殊寄存器,我發現會和 RTX-51 Tiny 沖突,產生 error 65 access violation at 0x3480 之類的運行錯誤。

 

敲一段代碼先跑跑(軟件調試,Ctrl+F5):

122 第一段測試代碼

可以看見監視窗口里面,c0, c1 亂跳:

123 運行第一段測試代碼

再來一段代碼,看看 Keil 的高級功能(邏輯分析):

124 增強型第一段測試代碼

現在可以看波形了:

125 調試增強型第一段測試代碼

環境搞定,記得提交到配置庫。下面就可以開始移植代碼到新的基於 RTX-51 Tiny 的項目中了。 ■


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM