歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 裸板實驗程序解析-點亮LED

裸板實驗程序解析-點亮LED

日期:2017/3/1 9:49:47   编辑:Linux編程

首先明確目標:點亮LED

怎樣才能點亮LED?
查看原理圖,LED燈連接在CPU管腳上,只要控制該管腳輸出高低電平就可以控制LED通斷。
怎麼控制管腳輸出高低電平?
兩個步驟配置相應寄存器:
1.配置管腳功能(輸入/輸出/其他功能);
2.設置輸出值0/1,即高/低;
怎麼布置代碼文件及編譯?
有兩種方式布置代碼文件:
1.直接用匯編代碼配置CPU寄存器;
2.匯編+C代碼;
為什麼不能只用C代碼實現?
C語言程序是以main函數為入口,main函數並沒有什麼特別之處,也要被別人調用,並執行返回。在沒有啟動文件的情況下,C程序自己不能被執行。因此不能只用C代碼實現點燈的功能。

下面我們來討論使用匯編+C代碼實現的方式實現目標過程中遇到的問題:
C程序中main函數被誰返回?返回到哪裡?
我們平時在有操作系統的主機上開發程序時,系統中有一些庫或啟動文件,加上我們的應用程序。那麼我們的應程序中的main函數就由啟動文件或庫來調用。main函數執行完,再回到系統庫函數中,由其來做一些清理工作。
在裸機程序中,類似的庫或啟動文件就沒有操作系統提供了,都要開發者自己寫。這裡的庫或啟動文件也可稱作軟件相關的初始化。這一部分就是在匯編代碼中實現的。除此之外,我們的匯編代碼中還應包括硬件初始化。
軟件初始化要做的哪些事情?
1設置棧
2設置main的返回地址;
3調用main;
4清理工作。
硬件初始化做哪些事情?
1.關閉看門狗;
2.初始化時鐘;
3.sdram初始化;

下面我們針對以上提到的匯編代碼中軟硬件初始化工作來分析,為什麼要做這些工作:
在大型軟件的編寫過程中,為了提高代碼的可讀性和易移植性,我們一般選用C語言進行代碼編寫。C語言中,函數的調用是非常普遍的。函數調用、跳轉過程中需要傳遞的參數和函數返回時要返回的值需要放在一段內存中,這個過程叫數據壓棧。因此在調用main函數之前要指定棧,即設置棧。
什麼是設置棧?即把棧指針sp指向某塊內存。
既然要把棧指針指向某塊內存,就要涉及到內存介質初始化的問題。上面設置的棧的內存正好是片內的sram上,不需要單獨做初始化。如果該內存指向片外的sdram,就要先初始化sdram,以便讀寫。sdram初始化就是屬於硬件初始化。
1.為什麼要關看門狗?
什麼是看門狗?
對於看門狗的初步認識,在一篇短文中有介紹 《認識看門狗》 http://www.linuxidc.com/Linux/2013-12/94074.htm 。
簡單的說,看門狗就是為防止系統長時間掛起或跑飛而設置的一個開關。其實質是可以定時重啟系統的東西。如果系統在看門狗的定時器定時耗盡之前把它清零,則系統不會重啟,我們也認為此事系統沒有出現長時間掛起或跑飛的問題。反之,則看門狗會把系統重啟。
為什麼要關閉呢?
在我們的程序中,由於不是很復雜的系統,沒有獨立的部分用來定時清零看門狗的定時器,所以索性把看門狗關閉,否則系統會不斷重啟,影響我們進行實驗。
可不可以不關閉?
想不關閉看門狗也可以,不過按照上面介紹的,我們必須在其定時器耗盡之前將其清零。但是在我們一段只用匯編語言完成的LED點亮代碼中,確實沒有關閉看門狗,也沒有出現什麼異常現象,為什麼?由於點亮LED操作簡單,匯編只有對兩個寄存器的操作,程序運行時間很短,即使我們沒有關閉看門狗,系統發生重啟,對於我們點亮LED也毫無影響,因為CPU重啟及代碼運行很快,人眼分辨不出LED閃爍,說以沒有影響實驗。該實驗代碼為方便才沒做關閉看門狗的工作。
2.初始化時鐘:為什麼初始化時鐘?
系統剛啟動時,由外部晶振提供系統時鐘,晶振頻率很低,有些開發板上只有幾兆幾十兆。這個頻率對CPU來說太低。目前市面上的CPU工作頻率一般在1.5G左右,外部晶振頻率不能直接使用,需要初始化設置後達到高頻率狀。除CPU頻率外,系統一般還會有sdram頻率(HCLK)和串口定時器(PCLK)等,這些都需要在初始化時鐘時進行設置。這就是初始化時鐘部分的工作。具體系統時鐘工作另行說明。
3.初始化sdram(為什麼初始化sdram?sdram是外部擴展的,存儲空間較大,速度較慢,如果程序放在sdram中)另行說明。
以上是硬件初始化說明。

軟硬件初始化合起來就是啟動文件。本實驗中不關心速度的問題,因此不做時鐘初始化;而且代碼在片內sram中直接啟動,因此不適用sdram,故不用初始化。因此上面硬件初始化中,只需做關閉看門狗的工作。
在點亮led的實驗中,硬件初始化只需做關閉看門狗的工作。原因是,點亮led時鐘慢點沒關系,不用初始化時鐘;實驗平台用的是片內sram,不用初始化sdram。

為什麼設置棧?從反匯編從看,main一調用就能看到{fp, ip, lr, pc}幾個寄存器被保存到sp中,調用返回是{fp,sp,pc}又被恢復,因此一定好設置棧,否則出錯。

飛凌OK6410開發板(裸板) 第一個點亮LED燈程序 http://www.linuxidc.com/Linux/2013-01/77209.htm

TQ2440第一個裸板程序LED http://www.linuxidc.com/Linux/2013-04/83611.htm

micro2440第一個裸板程序LED http://www.linuxidc.com/Linux/2013-04/83610p2.htm

Copyright © Linux教程網 All Rights Reserved