引入sdk頭文件
?sudo chown -R gec /opt
用這條命令給gec賦權限,否則訪問權限不夠,無法讀取,如下圖成功
目的:解決寄存器地址難查難設置
-
devices/MCIMX6Y2/MCIMX6Y2.h
記錄外設寄存器及其相關操作
-
devices/MCIMX6Y2/drivers/fsl_iomuxc.h
記錄引腳復用及其相關操作
注意:
MCIMX6Y2.h注釋以下頭文件包含
#include "core_ca7.h" ? #include "system_MCIMX6Y2.h" ?
增加以下宏定義:
#define __O volatile #define __IO volatile #define __I volatile const ? #define uint32_t unsigned int #define uint16_t unsigned short #define uint8_t unsigned char
使用C語言
目的:提高開發效率
bin文件組成介紹
段是程序的基本組成元素:
-
.text段:代碼文本
-
.rodata段:只讀變量,如const修飾的變量
-
.data段:非零的全局變量、靜態變量
-
.bss:值為 0 的全局變量、靜態變量
-
.comment:存放注釋
-
...
準備C語言環境
-
bss段清零
bss段是一種在程序運行時需要初始化的全局或靜態變量的存儲區域。bss段中的變量在編譯時不分配具體的內存空間,而是在程序加載到內存后,運行時會被清零。
將bss段清零的操作稱為"bss段清零",其含義是將bss段中的所有變量的內存空間初始化為零。這通常是在程序啟動時進行的操作。通過清零bss段,可以確保所有的全局和靜態變量在使用之前都被初始化為零值。這樣可以避免在未初始化狀態下使用這些變量時出現不可預料的行為。
bss段清零是由操作系統或運行庫負責執行的,它們會在加載程序到內存時遍歷bss段的內存空間,并將其內容設置為零。這樣,在程序開始執行之前,所有位于bss段的變量都將具有預定義的默認值,即零值。
需要注意的是,只有位于bss段的變量才會被清零,已經在代碼中顯式初始化的全局或靜態變量不會受到影響。
-
棧指針(sp)
棧指針 (Stack Pointer) 是指向程序運行時堆棧 (Stack) 頂部的指針。堆棧是用于存儲函數調用、局部變量和其他臨時數據的一種數據結構,遵循后進先出(LIFO)的原則。
棧指針 (SP) 在程序執行期間動態地移動,以反映當前堆棧頂部的位置。通常,棧指針向下移動(減小)一次指向堆棧上一個條目。
當函數被調用時,它會將返回地址、參數以及其他必要的數據壓入堆棧。棧指針會相應地向下移動以適應新的數據。當函數退出時,棧指針會向上移動,以釋放先前壓入堆棧的數據。
棧指針的具體實現方式取決于底層的硬件架構和操作系統。在某些架構中,棧指針可以保存在特定的寄存器中,如 x86 架構中的 ESP (Extended Stack Pointer) 或 ARM 架構中的 SP (Stack Pointer) 寄存器。在其他情況下,棧指針可能存儲在內存中的特定位置。
棧指針的正確使用對于程序的正確執行和內存管理非常重要。在編程過程中,我們應該遵循正確的堆棧操作,確保棧指針在函數調用和返回過程中正確地移動,并避免棧溢出等問題。
裸機程序控制外設
特點:讀數據手冊、設寄存器值
-
找出外設有哪些相關寄存器
-
找出外設相關寄存器如何設置
鏈接腳本引入
目的:指定鏈接地址、起始代碼在text段的位置,其他段的位置
官方資料:Using LD, the GNU linker
SECTIONS{ ?. =xxx //鏈接起始地址.段名{xxx*(.段名)}... }
這是一個鏈接器腳本片段示例,用于定義程序的內存布局和段的起始地址。下面是對每個段的簡要說明:
.text
:包含程序的可執行代碼和只讀數據。.text
?段對齊到 4 字節邊界,并包含了?build/start.o
?目標文件和其他所有的?.text
?節。.rodata
:包含只讀的常量數據。.rodata
?段對齊到 4 字節邊界,并包含了所有的?.rodata
?節。.data
:包含已初始化的全局和靜態變量。.data
?段對齊到 4 字節邊界,并包含了所有的?.data
?節。.bss
:包含未初始化的全局和靜態變量。.bss
?段對齊到 4 字節邊界,并包含了所有的?.bss
?節和?COMMON
?節。
此鏈接腳本還定義了兩個符號 __bss_start
和 __bss_end
,分別指向 .bss
段的起始地址和結束地址。這些符號可以在程序中使用,以確定 BSS 段的大小和位置。
值得注意的是,這只是一個鏈接器腳本的示例片段,具體的內存布局和段定義可能因目標平臺和工具鏈而異。在實際使用時,你需要根據你的需求和目標環境來編寫和調整鏈接器腳本。
Makefile修改
-
兼容.s匯編文件
-
添加編譯程序命令
-
添加sd卡燒錄命令
?有報錯
gec@ubuntu:~/bare_mental/part_3$ make burn
cp ?build/led.bin /home/embedfire/bare_mental/part_1/download_tool
cp: 無法創建普通文件'/home/embedfire/bare_mental/part_1/download_tool': 沒有那個文件或目錄
Makefile:45: recipe for target 'burn' failed
make: *** [burn] Error 1
?
?這里改為自己當前的用戶名就行