迅爲-imx6ull開發板之C語言實現LED例程

第九章我們使用匯編編寫了 LED 燈的實驗,在實際開發過程中大部分還是使用 C 語言,彙編只是用來完成 C 語言環境的初始化,本章我麼就來實現用匯編完成 C 語言環境的初始化,然後用 C 語言實現 LED 的例程。

 

10.1 C 程序版LED例程簡介
彙編完成 C 語言環境的初始化主要包括內存初始化,設置堆棧指針等等,當這些工作完成以後就可以跳轉到 C 語言,執行 C 程序了,所以我們有兩部分事情要做:
1.彙編文件,用來完成 C 語言的環境初始化
2.C 語言文件,主要實現我們的業務功能,比武我們本章的點亮 LED。

 

10.2 原理圖分析 原理圖分析
本章用到的硬件資源和第 6 章的一樣,可以參照第六章的硬件原理分析。

 

10.3 程序編寫
本實驗對應的例程在光盤資料的:i.MX6UL 終結者光盤資料\04_裸機例程源碼\2_led_C program 目錄下,我們在 Ubuntu 系統建立“1_Led_C program”文件夾,然後在“Led_C program”文件夾下建立文件:start.S、main.c、main.h。其中 start.S 是彙編文件,main.c 和 main.h 是 C 語言文件。
我們在前面新建的“srart.S”文件中輸入下面的代碼:
1. global _start /* 全局標號 */
2. /*
3. * 描述: _start 函數,程序從此函數開始執行,此函數主要功能是設置 C
4. * 運行環境。
5. */
6. _start:
7. /* 進入 SVC 模式 */
8. mrs r0, cpsr
9. bic r0, r0, #0x1f /* 將 r0 寄存器中的低 5 位清零,也就是 cpsr 的 M0~M4 */
10. orr r0, r0, #0x13 /* r0 或上 0x13,表示使用 SVC 模式 */
11. msr cpsr, r0 /* 將 r0 的數據寫入到 cpsr_c 中 */
12. ldr sp, =0X80200000 /* 設置棧指針 */
13. b main /* 跳轉到 main 函數 */
第 1 行定義了一個全局標號_start
第 6 行是程序的入口、
第 8 行到第 11 行是設置處理器進入 SVC 模式
第 12 行通過 ldr 指令設置 SVC 模式下的 sp 指針(0x80200000),i.MX6 ULL 終結者開發板上的內存地址範
圍是 0X80000000~0XA0000000(512MB)或 0X80000000~0X90000000(256MB),所以不論是 512MB 版本還是256MB 版本的,其內存起始地址都是 0X80000000,由於 i.MX6ULL 的堆棧是向下正常的,所以 SP 指針設置成 0X80200000(0X80200000-0X80000000,是 2MB 的棧空間,足夠我們使用了)。
第 13 行是挑喜歡到 main 函數(C 語言的入口函數。
至此彙編部分的程序我們就完成了,主要用來設置處理器在 SVC 模式下運行,然後初始化 SP 指針,最後跳轉到 C 程序的 main 入口函數。如果大家有接觸過三星的 S3C2440
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章