第九章我們使用匯編編寫(xiě)了 LED 燈的實(shí)驗(yàn),在實(shí)際開(kāi)發(fā)過(guò)程中大部分還是使用 C 語(yǔ)言,匯編只是用來(lái)完成 C 語(yǔ)言環(huán)境的初始化,本章我么就來(lái)實(shí)現(xiàn)用匯編完成 C 語(yǔ)言環(huán)境的初始化,然后用 C 語(yǔ)言實(shí)現(xiàn) LED 的例程。 10.1 C 程序版LED例程簡(jiǎn)介 匯編完成 C 語(yǔ)言環(huán)境的初始化主要包括內(nèi)存初始化,設(shè)置堆棧指針等等,當(dāng)這些工作完成以后就可以跳轉(zhuǎn)到 C 語(yǔ)言,執(zhí)行 C 程序了,所以我們有兩部分事情要做: 1.匯編文件,用來(lái)完成 C 語(yǔ)言的環(huán)境初始化 2.C 語(yǔ)言文件,主要實(shí)現(xiàn)我們的業(yè)務(wù)功能,比武我們本章的點(diǎn)亮 LED。 10.2 原理圖分析 原理圖分析 本章用到的硬件資源和第 6 章的一樣,可以參照第六章的硬件原理分析。 10.3 程序編寫(xiě) 本實(shí)驗(yàn)對(duì)應(yīng)的例程在光盤(pán)資料的:i.MX6UL 終結(jié)者光盤(pán)資料\04_裸機(jī)例程源碼\2_led_C program 目錄下,我們?cè)?Ubuntu 系統(tǒng)建立“1_Led_C program”文件夾,然后在“Led_C program”文件夾下建立文件:start.S、main.c、main.h。其中 start.S 是匯編文件,main.c 和 main.h 是 C 語(yǔ)言文件。 我們?cè)谇懊嫘陆ǖ?/font>“srart.S”文件中輸入下面的代碼: 1. global _start /* 全局標(biāo)號(hào) */ 2. /* 3. * 描述: _start 函數(shù),程序從此函數(shù)開(kāi)始執(zhí)行,此函數(shù)主要功能是設(shè)置 C 4. * 運(yùn)行環(huán)境。 5. */ 6. _start: 7. /* 進(jìn)入 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 的數(shù)據(jù)寫(xiě)入到 cpsr_c 中 */ 12. ldr sp, =0X80200000 /* 設(shè)置棧指針 */ 13. b main /* 跳轉(zhuǎn)到 main 函數(shù) */ 第 1 行定義了一個(gè)全局標(biāo)號(hào)_start 第 6 行是程序的入口、 第 8 行到第 11 行是設(shè)置處理器進(jìn)入 SVC 模式 第 12 行通過(guò) ldr 指令設(shè)置 SVC 模式下的 sp 指針(0x80200000),i.MX6 ULL 終結(jié)者開(kāi)發(fā)板上的內(nèi)存地址范 圍是 0X80000000~0XA0000000(512MB)或 0X80000000~0X90000000(256MB),所以不論是 512MB 版本還是256MB 版本的,其內(nèi)存起始地址都是 0X80000000,由于 i.MX6ULL 的堆棧是向下正常的,所以 SP 指針設(shè)置成 0X80200000(0X80200000-0X80000000,是 2MB 的棧空間,足夠我們使用了)。 第 13 行是挑喜歡到 main 函數(shù)(C 語(yǔ)言的入口函數(shù)。 至此匯編部分的程序我們就完成了,主要用來(lái)設(shè)置處理器在 SVC 模式下運(yùn)行,然后初始化 SP 指針,最后跳轉(zhuǎn)到 C 程序的 main 入口函數(shù)。如果大家有接觸過(guò)三星的 S3C2440 ![]() ![]() ![]() ![]() ![]() ![]() ![]() |