Linux中國

計算機實驗室之樹莓派:課程 5 OK05

OK05 課程構建於課程 OK04 的基礎,使用它來閃爍摩爾斯電碼的 SOS 序列(...---...)。這裡假設你已經有了 課程 4:OK04 操作系統的代碼作為基礎。

1、數據

到目前為止,我們與操作系統有關的所有內容提供的都是指令。然而有時候,指令只是完成了一半的工作。我們的操作系統可能還需要數據。

一些早期的操作系統確實只允許特定文件中的特定類型的數據,但是這通常被認為限制太多了。現代方法確實可以使程序變得複雜的多。

通常,數據就是些很重要的值。你可能接受過培訓,認為數據就是某種類型的,比如,文本文件包含文本,圖像文件包含圖片,等等。說實話,這只是你的想法而已。計算機上的全部數據都是二進位數字,重要的是我們選擇用什麼來解釋這些數據。在這個例子中,我們會用一個閃燈序列作為數據保存下來。

main.s 結束處複製下面的代碼:

.section .data %定義 .data 段
.align 2 %對齊
pattern: %定義整形變數
.int 0b11111111101010100010001000101010

.align num 確保下一行代碼的地址是 2 num 的整數倍。

.int val 輸出數值 val

要區分數據和代碼,我們將數據都放在 .data 區域。我已經將該區域包含在操作系統的內存布局圖。我選擇將數據放到代碼後面。將我們的指令和數據分開保存的原因是,如果最後我們在自己的操作系統上實現一些安全措施,我們就需要知道代碼的那些部分是可以執行的,而那些部分是不行的。

我在這裡使用了兩個新命令 .align.int.align 保證接下來的數據是按照 2 的乘方對齊的。在這個裡,我使用 .align 2 ,意味著數據最終存放的地址是 2 2=4 的整數倍。這個操作是很重要的,因為我們用來讀取內存的指令 ldr 要求內存地址是 4 的倍數。

命令 .int 直接複製它後面的常量到輸出。這意味著 11111111101010100010001000101010 2 將會被存放到輸出,所以該標籤模式實際是將這段數據標識為模式。

關於數據的一個挑戰是尋找一個高效和有用的展示形式。這種保存一個開、關的時間單元的序列的方式,運行起來很容易,但是將很難編輯,因為摩爾斯電碼-. 樣式丟失了。

如我提到的,數據可以代表你想要的所有東西。在這裡我編碼了摩爾斯電碼的 SOS 序列,對於不熟悉的人,就是 ...---...。我使用 0 表示一個時間單元的 LED 滅燈,而 1 表示一個時間單元的 LED 亮。這樣,我們可以像這樣編寫一些代碼在數據中顯示一個序列,然後要顯示不同序列,我們所有需要做的就是修改這段數據。下面是一個非常簡單的例子,操作系統必須一直執行這段程序,解釋和展示數據。

複製下面幾行到 main.s 中的標記 loop$ 之前。

ptrn .req r4 %重命名 r4 為 ptrn
ldr ptrn,=pattern %載入 pattern 的地址到 ptrn
ldr ptrn,[ptrn] %載入地址 ptrn 所在內存的值
seq .req r5 %重命名 r5 為 seq
mov seq,#0 %seq 賦值為 0

這段代碼載入 pattrern 到寄存器 r4,並載入 0 到寄存器 r5r5 將是我們的序列位置,所以我們可以追蹤我們已經展示了多少個 pattern

如果 pattern 的當前位置是 1 且僅有一個 1,下面的代碼將非零值放入 r1

mov r1,#1 %載入1到 r1
lsl r1,seq %對r1 的值邏輯左移 seq 次
and r1,ptrn %按位與

這段代碼對你調用 SetGpio 很有用,它必須有一個非零值來關掉 LED,而一個 0 值會打開 LED。

現在修改 main.s 中你的全部代碼,這樣代碼中每次循環會根據當前的序列數設置 LED,等待 250000 毫秒(或者其他合適的延時),然後增加序列數。當這個序列數到達 32 就需要返回 0。看看你是否能實現這個功能,作為額外的挑戰,也可以試著只使用一條指令。

2、當你玩得開心時,時間過得很快

你現在準備好在樹莓派上實驗。應該閃爍一串包含 3 個短脈衝,3 個長脈衝,然後 3 個短脈衝的序列。在一次延時之後,這種模式應該重複。如果這不工作,請查看我們的問題頁。

一旦它工作,祝賀你已經抵達 OK 系列教程的結束點。

在這個系列我們學習了彙編代碼,GPIO 控制器和系統定時器。我們已經學習了函數和 ABI,以及幾個基礎的操作系統原理,已經關於數據的知識。

你現在已經可以準備學習下面幾個更高級的課程的某一個。

  • Screen 系列是接下來的,會教你如何通過彙編代碼使用屏幕。
  • Input 系列教授你如何使用鍵盤和滑鼠。

到現在,你已經有了足夠的信息來製作操作系統,用其它方法和 GPIO 交互。如果你有任何機器人工具,你可能會想嘗試編寫一個通過 GPIO 管腳控制的機器人操作系統。

via: https://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/ok05.html

作者:Robert Mullins 選題:lujun9972 譯者:ezio 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國