1:源頭
我們學習arm嵌入式開發(fā),一般接觸到的是ADS1.2、kei的工程模板,這些模板對初學者入門來說是一種福音,但是想深入了解一下芯片啟動過程、
編譯和鏈接、映像文件結構、如何初始化、移植標準庫等這些內(nèi)容的話,這些商業(yè)IDE就顯得隱藏了很多細節(jié),不利于進一步學習?;谏鲜鼍売?,
我寫了一個基于gnu arm-linux開發(fā)環(huán)境的LPC2220的簡單工程,此工程實現(xiàn)了芯片開機初始化、加載映像到運行映像的轉(zhuǎn)換、ZI段的清零、堆棧
的設置、引導高層C語言函數(shù)、移植標準庫、在高層實現(xiàn)了printf用于調(diào)試。
2:例程實現(xiàn)的功能
初始化LPC2220芯片:
1,實現(xiàn)LPC2220中斷向量表。
2,設置ARM芯片各個模式運行時所需的堆??臻g。本例程中將系統(tǒng)模式的堆棧設置在LPC2220內(nèi)部RAM的最頂端,即0x40004000。這里是因為芯片默認的運行模式就是系
統(tǒng)模式,也即我們的用戶程序都是在系統(tǒng)模式下運行的。又因為ARM芯片默認是從高地址向低地址使用堆棧,因此將LPC2220內(nèi)部RAM的最頂端設置為系統(tǒng)模式下的堆棧
指針。其他模式的堆棧設置在0x400000000開始的內(nèi)部RAM中。具體怎么實現(xiàn)的,我們下面例程代碼中會講解。
3,初始化目標板,主要設置各種總線時鐘、向量表映射、存儲BANK設置、存儲器加速模塊、實時時鐘等系統(tǒng)控制模塊。
4:將RW段從NorFlash COPY到SDram中,清零ZI段。
5:跳轉(zhuǎn)到main函數(shù)執(zhí)行。
6:使用標準庫并實現(xiàn)printf,用于調(diào)試。
7:利用printf打印全局變量,局部變量內(nèi)容,地址。用來說明全局變量,局部變量以及鏈接器鏈接等相關知識。
3:過程中遇到的困難
第一個是我想使用LPC2220的外部BANK1,我使用的硬件板,BANK1上接的是RAM,一開始程序怎么也調(diào)試不過,以為是鏈接腳本書寫錯誤。但后來發(fā)現(xiàn)是對LPC2220的引腳功能設置的問題。這不是什么知識點,但讓我在這上面浪費了不少時間,特此記錄一下,以安慰我那顆受傷的心。所以,記得一些硬件資源要先看datasheet初始化好后再使用。
第二個是編譯代碼的時候,出現(xiàn)一堆的undefinedreference to `__umoddi3'之類的錯誤,而且我還發(fā)現(xiàn)了只要我代碼里有取整取余等操作時就會報上述錯誤,真是百思不得其解,后來到網(wǎng)上去查資料,得出這個錯誤確實是因為使用了除法導致的。而且,ARM7不支持除法指令,需要軟件進行輔助除法運算,而一般是通過標準庫的形式提供。我們使用ADS1.2,keil等集成IDE開發(fā)程序時,它們自帶的庫里有對除法的支持。而我現(xiàn)在使用的編譯鏈是從網(wǎng)上下載的別人編譯好的arm-linux-gcc3.4.1,可能不支持除法、軟浮點支持。我不知道怎么解決這個問題,所以,干脆我使用了我自己使用源碼編譯的交叉編譯鏈(4.6.0版本的)。我編譯交叉連的時候選擇了除法、軟浮點支持。問題得以解決。具體交叉編譯鏈的制作,參考:制作S3C6410的交叉編譯鏈(arm-linux-gcc4.6.0)。
第三個問題是編譯的時候提示undefinedreference to `__exidx_start' undefined reference to`__exidx_end'等錯誤,而且是當我使用sprintf等相關格式化字符串的時候就提示這些錯誤,我沒有找到合適的解決方案。所以,我參考網(wǎng)絡資源自己實現(xiàn)了簡單的格式化函數(shù)。這不是根本解決之道,我對使用gnu開發(fā)工具鏈進行嵌入式開發(fā)如何使用標準庫函數(shù)也存在很多疑點。
4:部分例程代碼
例程總覽:該工程編譯,鏈接出的映像下載到LPC2220的BANK0(Norflash)中,其地址為0X80000000。運行時,所有的RO段運行在BANK0,RW段和ZI段運行于LPC2220的BANK1(RAM),其地址為0X81000000。裝載地址和運行地址不一致,所以在啟動代碼啟動后,應將RW段COPY到運行時的地址處,將ZI段清零。這些工作都在startup.s中完成,最后startup.s將引導最終的main函數(shù)。
startup.s
@******************************************************************************
@ 文件名 :startup.s
@ 功 能:初始化LPC2220:初始化各種運行模式的堆??臻g,各種exception
@ 入口。
@ 說明 :此工程為gcc for arm的工程,書寫此工程啟動代碼目的是學習嵌入式開發(fā)過程中
@ 的一些要點知識。gcc for arm 是開源的編譯,鏈接器,可以學習程序開發(fā)的更多
@ 細節(jié)。其他商業(yè)開發(fā)工具隱藏太多細節(jié),不利于其初學者學習。
@ 備注 :大家可以根據(jù)工程需要修改其內(nèi)容。
@ 作者 :張連聘
@ 創(chuàng)建時間:2014-07-27
@******************************************************************************
@define the stack size for each mode
@定義各種運行模式堆棧大小
.equ FIQ_STACK_LEGTH ,256
.equ IRQ_STACK_LEGTH ,9*8
.equ ABT_STACK_LEGTH ,256
.equ UND_STACK_LEGTH ,256
.equ NoInt ,0x80
.equ NoFIQ ,0x40
.equ USR32Mode ,0x10
.equ SVC32Mode ,0x13
.equ SYS32Mode ,0x1f
.equ IRQ32Mode ,0x12
.equ FIQ32Mode ,0x11
.equ PINSEL2 ,0xE002C014
.equ BCFG0 ,0xFFE00000
.equ BCFG1 ,0xFFE00004
.equ BCFG2 ,0xFFE00008
.equ BCFG3 ,0xFFE0000C
@The imported labels
@引入的外部標號在這聲明
.extern FIQ_Exception @Fast interrupt exceptions handler 快速中斷異常處理程序
.extern main @The entry point to the main function C語言主程序入口
.extern TargetResetInit @initialize the target board 目標板基本初始化
.extern SoftwareInterrupt
.extern Copydata
.extern ClearBssData
.global Reset
.text
@interrupt vectors
@中斷向量表
Reset:
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
.word 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr:
.word ResetInit
UndefinedAddr:
.word Undefined
SWI_Addr:
.word SoftwareInterrupt
PrefetchAddr:
.word PrefetchAbort
DataAbortAddr:
.word DataAbort
Nouse: .word 0
IRQ_Addr:
.word 0
FIQ_Addr:
.word FIQ_Handler
@未定義指令
Undefined:
B Undefined
@取指令中止
PrefetchAbort:
B PrefetchAbort
@取數(shù)據(jù)中止
DataAbort:
B DataAbort
@快速中斷
FIQ_Handler:
STMFD SP!, {R0-R3, LR}
LDR PC, =FIQ_Exception
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
/*********************************************************************************************************
**函數(shù)名稱: InitStack
**功能描述: Initialize the stacks 初始化堆棧
**輸 入: None
**輸 出 : None
**全局變量: None
**調(diào)用模塊: None
********************************************************************************************************/
InitStack:
MOV R0, LR
@Build the SVC stack
@設置中斷模式堆棧
MSR CPSR_c, #0xd2
LDR SP, StackIrq
@Build the FIQ stack
@設置快速中斷模式堆棧
MSR CPSR_c, #0xd1
LDR SP, StackFiq
@Build the DATAABORT stack
@設置中止模式堆棧
MSR CPSR_c, #0xd7
LDR SP, StackAbt
@Build the UDF stack
@設置未定義模式堆棧
MSR CPSR_c, #0xdb
LDR SP, StackUnd
@Build the SYS stack
@設置系統(tǒng)模式堆棧
MSR CPSR_c, #0xdf
LDR SP, =StackUsr
BX R0
/*********************************************************************************************************
**函數(shù)名稱: ResetInit
**功能描述: RESET 復位入口
**輸 入: None
**輸 出 : None
**全局變量: None
**調(diào)用模塊: None
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
ResetInit:
@Initial the extenal bus controller
@初始化外部總線控制器,根據(jù)目標板決定配置
LDR R0, =PINSEL2
LDR R1, =0x0f814914
STR R1, [R0]
LDR R1, =0x0f814914
LDR R0, =BCFG0
LDR R1, =0x1000ffef
STR R1, [R0]
LDR R0, =BCFG1
LDR R1, =0x1000ffef
STR R1, [R0]
LDR R0, =BCFG2
LDR R1, =0x0000fbef
STR R1, [R0]
LDR R0, =BCFG3
LDR R1, =0x10001460
STR R1, [R0]
BL InitStack @ Initialize the stack 初始化堆棧
BL TargetResetInit @ Initialize the target board 目標板基本初始化
BL Copydata
BL ClearBssData
B main @ Jump to the entry point of C program 跳轉(zhuǎn)到c語言入口
StackIrq:
.word IrqStackSpace +(IRQ_STACK_LEGTH - 1)*4
StackFiq:
.word FiqStackSpace +(FIQ_STACK_LEGTH - 1)*4
StackAbt: .word AbtStackSpace +(ABT_STACK_LEGTH - 1)*4
StackUnd: .word UndtStackSpace +(UND_STACK_LEGTH - 1)*4
/* 分配堆??臻g */
.bss
.align 4
IrqStackSpace:
.space IRQ_STACK_LEGTH * 4 @Stack spaces for Interrupt ReQuest Mode 中斷模式堆??臻g
FiqStackSpace:
.space FIQ_STACK_LEGTH * 4 @Stack spaces for Fast Interrupt reQuest Mode 快速中斷模式堆棧空間
AbtStackSpace:
.space ABT_STACK_LEGTH * 4 @Stack spaces for Suspend Mode 中止義模式堆??臻g
UndtStackSpace:
.space UND_STACK_LEGTH * 4 @Stack spaces for Undefined Mode 未定義模式堆棧
.end
main.c
/******************************************************************************
* 文件名 :main.c
* 功 能:初始化系統(tǒng)后,利用P2.28控制led燈閃爍
*
* 作者 :張連聘
* 創(chuàng)建時間:2014-07-27
*******************************************************************************/
#include 'LPC2220.h'
#include 'uart0.h'
#include 'print.h'
#define LEDCON (1<<28)
上一篇:android休眠喚醒驅(qū)動流程分析
下一篇:Windows CE6.0中斷實驗過程
推薦閱讀最新更新時間:2025-06-18 14:11
設計資源 培訓 開發(fā)板 精華推薦
- Microchip 升級數(shù)字信號控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領先的新器件
- 意法半導體STM32MP23x:突破成本限制的工業(yè)AI應用核心
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設置字重-ESP32篇
- 使用樹莓派進行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲html,css,js文件,以及網(wǎng)頁和arduino的通訊
- ESP32 freeRTOS使用測試
- 南芯科技推出高集成度多口移動電源解決方案,助力充電寶市場穩(wěn)健發(fā)展
- 英飛凌推出具有超低導通電阻的CoolSiC? MOSFET 750 V G2,適用于汽車和工業(yè)功率電子應用
- DigiKey 慶祝 B 站賬號粉絲突破 10 萬,贈送驚喜禮包
- 碳化硅企業(yè) Wolfspeed 啟動破產(chǎn)重組,預計 2025 年三季度末完成司法重整
- 蘋果被曝考慮放棄自研模型 轉(zhuǎn)而與Anthropic或OpenAI合作
- ?百度文心4.5來襲!英特爾Day0即支持端側部署
- 【廣瀨電機】關于中國發(fā)明專利侵權訴訟達成和解的公告
- 英飛凌BMS解決方案推動電動汽車創(chuàng)新
- 地平線的L3判斷與實踐路徑
- 汽車網(wǎng)絡升級攻略:CAN-CAN FD-車載以太網(wǎng)