1:調用C語言函數之前會有一段彙編代碼在前面執行來完成軟硬體方面的初始化。比如:關閉看門狗;初始化時鐘;設置堆棧;調用main函數等。在學習51單片機時候這些操作是由開發環境(如KEIL)在編譯C代碼的時候,幫我們做好這些工作。但是在開發ARM程式時,由於ARM處理器支持多種模式,多種功能,在不同的 ...
1:調用C語言函數之前會有一段彙編代碼在前面執行來完成軟硬體方面的初始化。比如:關閉看門狗;初始化時鐘;設置堆棧;調用main函數等。在學習51單片機時候這些操作是由開發環境(如KEIL)在編譯C代碼的時候,幫我們做好這些工作。但是在開發ARM程式時,由於ARM處理器支持多種模式,多種功能,在不同的項目裡面,我們可能會選擇不同的功能。這時,編譯器就不知道我們需要什麼功能,所以它無法幫助我們完成初始化的那些工作,而需要我們來完成這些工作。
eg:簡單的啟動代碼
@****************************************
@ File: startup.s
@ function: start up
@ author: pang123hui
@****************************************
.text
.global _start
_start:
LDR R0,=0x7E004000 @ WATCHDOG寄存器地址
MOV R1,#0x0
STR R1,[R0] @ 寫入0,禁止WATCHDOG,否則CPU會不斷重啟
LDR SP,=0x0c001000 @ 設置堆棧,註意:這時我們是將程式直接燒錄到SDRAM中,所以堆棧要設置在SDRAM中
@ 如果將程式燒在NAND FLASH中,需將堆棧改為1024*4,因為NAND FLASH中的代碼
@ 在複位後會移到內部RAM中,此RAM只有4K
BL main @ 調用C程式中的main函數
halt_loop:
B halt_loop
2:ioremap映射函數
eg:void * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
入口: phys_addr:要映射的起始的IO地址,即:物理地址
size:要映射的空間的大小;
flags:要映射的IO空間的和許可權有關的標誌;
因為linux的驅動程式是基於操作系統之上的,它無法直接操作硬體。所以我們通過ioremap函數將硬體上的寄存器,映射為虛擬的記憶體,從而使驅動程式操作硬體上的寄存器。(linux系統一切皆文件的思想)。
時間:2019/07/16