第九章我們使用匯編編寫了 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 ![]() ![]() ![]() ![]() ![]() ![]() ![]() |