1:源頭
我們學(xué)習(xí)arm嵌入式開發(fā),一般接觸到的是ADS1.2、kei的工程模板,這些模板對(duì)初學(xué)者入門來說是一種福音,但是想深入了解一下芯片啟動(dòng)過程、
編譯和鏈接、映像文件結(jié)構(gòu)、如何初始化、移植標(biāo)準(zhǔn)庫(kù)等這些內(nèi)容的話,這些商業(yè)IDE就顯得隱藏了很多細(xì)節(jié),不利于進(jìn)一步學(xué)習(xí)。基于上述緣由,
我寫了一個(gè)基于gnu arm-linux開發(fā)環(huán)境的LPC2220的簡(jiǎn)單工程,此工程實(shí)現(xiàn)了芯片開機(jī)初始化、加載映像到運(yùn)行映像的轉(zhuǎn)換、ZI段的清零、堆棧
的設(shè)置、引導(dǎo)高層C語言函數(shù)、移植標(biāo)準(zhǔn)庫(kù)、在高層實(shí)現(xiàn)了printf用于調(diào)試。
2:例程實(shí)現(xiàn)的功能
初始化LPC2220芯片:
1,實(shí)現(xiàn)LPC2220中斷向量表。
2,設(shè)置ARM芯片各個(gè)模式運(yùn)行時(shí)所需的堆棧空間。本例程中將系統(tǒng)模式的堆棧設(shè)置在LPC2220內(nèi)部RAM的最頂端,即0x40004000。這里是因?yàn)樾酒J(rèn)的運(yùn)行模式就是系
統(tǒng)模式,也即我們的用戶程序都是在系統(tǒng)模式下運(yùn)行的。又因?yàn)锳RM芯片默認(rèn)是從高地址向低地址使用堆棧,因此將LPC2220內(nèi)部RAM的最頂端設(shè)置為系統(tǒng)模式下的堆棧
指針。其他模式的堆棧設(shè)置在0x400000000開始的內(nèi)部RAM中。具體怎么實(shí)現(xiàn)的,我們下面例程代碼中會(huì)講解。
3,初始化目標(biāo)板,主要設(shè)置各種總線時(shí)鐘、向量表映射、存儲(chǔ)BANK設(shè)置、存儲(chǔ)器加速模塊、實(shí)時(shí)時(shí)鐘等系統(tǒng)控制模塊。
4:將RW段從NorFlash COPY到SDram中,清零ZI段。
5:跳轉(zhuǎn)到main函數(shù)執(zhí)行。
6:使用標(biāo)準(zhǔn)庫(kù)并實(shí)現(xiàn)printf,用于調(diào)試。
7:利用printf打印全局變量,局部變量?jī)?nèi)容,地址。用來說明全局變量,局部變量以及鏈接器鏈接等相關(guān)知識(shí)。
3:過程中遇到的困難
第一個(gè)是我想使用LPC2220的外部BANK1,我使用的硬件板,BANK1上接的是RAM,一開始程序怎么也調(diào)試不過,以為是鏈接腳本書寫錯(cuò)誤。但后來發(fā)現(xiàn)是對(duì)LPC2220的引腳功能設(shè)置的問題。這不是什么知識(shí)點(diǎn),但讓我在這上面浪費(fèi)了不少時(shí)間,特此記錄一下,以安慰我那顆受傷的心。所以,記得一些硬件資源要先看datasheet初始化好后再使用。
第二個(gè)是編譯代碼的時(shí)候,出現(xiàn)一堆的undefinedreference to `__umoddi3'之類的錯(cuò)誤,而且我還發(fā)現(xiàn)了只要我代碼里有取整取余等操作時(shí)就會(huì)報(bào)上述錯(cuò)誤,真是百思不得其解,后來到網(wǎng)上去查資料,得出這個(gè)錯(cuò)誤確實(shí)是因?yàn)槭褂昧顺▽?dǎo)致的。而且,ARM7不支持除法指令,需要軟件進(jìn)行輔助除法運(yùn)算,而一般是通過標(biāo)準(zhǔn)庫(kù)的形式提供。我們使用ADS1.2,keil等集成IDE開發(fā)程序時(shí),它們自帶的庫(kù)里有對(duì)除法的支持。而我現(xiàn)在使用的編譯鏈?zhǔn)菑木W(wǎng)上下載的別人編譯好的arm-linux-gcc3.4.1,可能不支持除法、軟浮點(diǎn)支持。我不知道怎么解決這個(gè)問題,所以,干脆我使用了我自己使用源碼編譯的交叉編譯鏈(4.6.0版本的)。我編譯交叉連的時(shí)候選擇了除法、軟浮點(diǎn)支持。問題得以解決。具體交叉編譯鏈的制作,參考:制作S3C6410的交叉編譯鏈(arm-linux-gcc4.6.0)。
第三個(gè)問題是編譯的時(shí)候提示undefinedreference to `__exidx_start' undefined reference to`__exidx_end'等錯(cuò)誤,而且是當(dāng)我使用sprintf等相關(guān)格式化字符串的時(shí)候就提示這些錯(cuò)誤,我沒有找到合適的解決方案。所以,我參考網(wǎng)絡(luò)資源自己實(shí)現(xiàn)了簡(jiǎn)單的格式化函數(shù)。這不是根本解決之道,我對(duì)使用gnu開發(fā)工具鏈進(jìn)行嵌入式開發(fā)如何使用標(biāo)準(zhǔn)庫(kù)函數(shù)也存在很多疑點(diǎn)。
4:部分例程代碼
例程總覽:該工程編譯,鏈接出的映像下載到LPC2220的BANK0(Norflash)中,其地址為0X80000000。運(yùn)行時(shí),所有的RO段運(yùn)行在BANK0,RW段和ZI段運(yùn)行于LPC2220的BANK1(RAM),其地址為0X81000000。裝載地址和運(yùn)行地址不一致,所以在啟動(dòng)代碼啟動(dòng)后,應(yīng)將RW段COPY到運(yùn)行時(shí)的地址處,將ZI段清零。這些工作都在startup.s中完成,最后startup.s將引導(dǎo)最終的main函數(shù)。
startup.s
@******************************************************************************
@ 文件名 :startup.s
@ 功 能:初始化LPC2220:初始化各種運(yùn)行模式的堆棧空間,各種exception
@ 入口。
@ 說明 :此工程為gcc for arm的工程,書寫此工程啟動(dòng)代碼目的是學(xué)習(xí)嵌入式開發(fā)過程中
@ 的一些要點(diǎn)知識(shí)。gcc for arm 是開源的編譯,鏈接器,可以學(xué)習(xí)程序開發(fā)的更多
@ 細(xì)節(jié)。其他商業(yè)開發(fā)工具隱藏太多細(xì)節(jié),不利于其初學(xué)者學(xué)習(xí)。
@ 備注 :大家可以根據(jù)工程需要修改其內(nèi)容。
@ 作者 :張連聘
@ 創(chuàng)建時(shí)間:2014-07-27
@******************************************************************************
@define the stack size for each mode
@定義各種運(yùn)行模式堆棧大小
.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
@引入的外部標(biāo)號(hào)在這聲明
.extern FIQ_Exception @Fast interrupt exceptions handler 快速中斷異常處理程序
.extern main @The entry point to the main function C語言主程序入口
.extern TargetResetInit @initialize the target board 目標(biāo)板基本初始化
.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
@設(shè)置中斷模式堆棧
MSR CPSR_c, #0xd2
LDR SP, StackIrq
@Build the FIQ stack
@設(shè)置快速中斷模式堆棧
MSR CPSR_c, #0xd1
LDR SP, StackFiq
@Build the DATAABORT stack
@設(shè)置中止模式堆棧
MSR CPSR_c, #0xd7
LDR SP, StackAbt
@Build the UDF stack
@設(shè)置未定義模式堆棧
MSR CPSR_c, #0xdb
LDR SP, StackUnd
@Build the SYS stack
@設(shè)置系統(tǒng)模式堆棧
MSR CPSR_c, #0xdf
LDR SP, =StackUsr
BX R0
/*********************************************************************************************************
**函數(shù)名稱: ResetInit
**功能描述: RESET 復(fù)位入口
**輸 入: None
**輸 出 : None
**全局變量: None
**調(diào)用模塊: None
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
ResetInit:
@Initial the extenal bus controller
@初始化外部總線控制器,根據(jù)目標(biāo)板決定配置
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 目標(biāo)板基本初始化
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
/* 分配堆棧空間 */
.bss
.align 4
IrqStackSpace:
.space IRQ_STACK_LEGTH * 4 @Stack spaces for Interrupt ReQuest Mode 中斷模式堆棧空間
FiqStackSpace:
.space FIQ_STACK_LEGTH * 4 @Stack spaces for Fast Interrupt reQuest Mode 快速中斷模式堆棧空間
AbtStackSpace:
.space ABT_STACK_LEGTH * 4 @Stack spaces for Suspend Mode 中止義模式堆棧空間
UndtStackSpace:
.space UND_STACK_LEGTH * 4 @Stack spaces for Undefined Mode 未定義模式堆棧
.end
main.c
/******************************************************************************
* 文件名 :main.c
* 功 能:初始化系統(tǒng)后,利用P2.28控制led燈閃爍
*
* 作者 :張連聘
* 創(chuàng)建時(shí)間:2014-07-27
*******************************************************************************/
#include 'LPC2220.h'
#include 'uart0.h'
#include 'print.h'
#define LEDCON (1<<28)
上一篇:android休眠喚醒驅(qū)動(dòng)流程分析
下一篇:Windows CE6.0中斷實(shí)驗(yàn)過程
推薦閱讀最新更新時(shí)間:2025-03-25 10:31

- 熱門資源推薦
- 熱門放大器推薦
-
SOLIDWORKS?電氣基礎(chǔ)教程(2017版)
-
Multisim_14_電子系統(tǒng)仿真與設(shè)計(jì)_第2版
-
基于嵌入式實(shí)時(shí)操作系統(tǒng)的程序設(shè)計(jì)技術(shù)(第2版) (吳光文)
-
嵌入式系統(tǒng)原理及應(yīng)用基于ARM Cortex-M3 內(nèi)核的STM32F103系列微控制器
-
數(shù)字電子技術(shù)基礎(chǔ)
-
TI 元器件庫(kù)(元件庫(kù)、封裝庫(kù)、3D庫(kù))
-
精通開關(guān)電源設(shè)計(jì)
-
IGBT逆變電源的設(shè)計(jì)與應(yīng)用
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 迅為IMX6ULL開發(fā)板交叉編譯器的安裝和使用
- 迅為-i.MX6ULL 開發(fā)板-移植OpenCv3.4.1-搭建編譯環(huán)境
- 嵌入式學(xué)習(xí)篇丨迅為4412開發(fā)板Android4.4系統(tǒng)編譯
- Linux系統(tǒng)編程篇丨迅為IMX6ULL-對(duì)應(yīng)視頻講解
- 嵌入式學(xué)習(xí)丨4412開發(fā)板-uboot源碼-匯編-源碼分析(一)嵌入式學(xué)習(xí)丨4412開發(fā)板-uboot源碼-匯
- 迅為IMX6ULL開發(fā)板-主頻和時(shí)鐘配置例程(二)
- 迅為IMX6ULL開發(fā)板-主頻和時(shí)鐘配置例程
- 迅為IMX6ULL開發(fā)板安裝VMware Tool工具
- i.MX6ULL終結(jié)者Debian文件系統(tǒng)的構(gòu)建i.MX6ULL 移植Debian文件系統(tǒng)
- LT1021CIN8-10 電壓基準(zhǔn)作為超線性鉑金溫度傳感器的典型應(yīng)用
- 使用 Cypress Semiconductor 的 CYS25G0101DX 的參考設(shè)計(jì)
- LT1086CM 調(diào)節(jié)固定穩(wěn)壓器輸出電壓的典型應(yīng)用
- LTC2292IUP 演示板,DeMUX 雙路 ADC,+3.0V,40Msps 12 位 1MHz
- DC2100B-A,用于使用 LTC3300-1 和 LTC6804-2 電池管理的雙向電池平衡器的演示板
- 使用 MikroElektronika 的 BNO080 的參考設(shè)計(jì)
- LB11685AVGEVB,LB11685AV 三相全波電流線性電機(jī)驅(qū)動(dòng)器評(píng)估板
- ADR421 超精密、低噪聲、2.048 Vout XFET 電壓基準(zhǔn)作為精密升壓輸出穩(wěn)壓器的典型應(yīng)用
- 具有短路保護(hù)功能的 NCV78M05BTG 5V 電流升壓的典型應(yīng)用
- 【訓(xùn)練營(yíng)】Hi3861舵機(jī)驅(qū)動(dòng)
- 六氟磷酸鋰產(chǎn)銷兩旺 天際股份三季報(bào)預(yù)盈4.6億元
- 半小時(shí)就能充滿!特斯拉第三代超級(jí)充電樁即將上線
- 單元串聯(lián)型變頻器的特點(diǎn)
- B001-Atmega16-帶電復(fù)位后不清0的.noinit變量
- 疑 OPPO Find X5 系列已獲得 3C 認(rèn)證,或搭載 80W 快充
- 奧托立夫?yàn)镹uro的自動(dòng)駕駛汽車搭載外部安全氣囊 保護(hù)弱勢(shì)道路使用者
- STM32F0單片機(jī)快速入門一: ARM架構(gòu)與STM32F0
- 兩相雙極步進(jìn)電機(jī)驅(qū)動(dòng)中電流再生時(shí)的電流衰減
- 中國(guó)發(fā)布HDMI和DisplayPort替代方案:GPMI接口來了
- 三星進(jìn)軍 AI 機(jī)器人領(lǐng)域,Ballie 本周公開亮相
- 消息稱美光即日起針對(duì)存儲(chǔ)模組產(chǎn)品向美國(guó)客戶征收“關(guān)稅附加費(fèi)”
- 迅為IMX6ULL開發(fā)板交叉編譯器的安裝和使用
- 迅為-i.MX6ULL 開發(fā)板-移植OpenCv3.4.1-搭建編譯環(huán)境
- BOE(京東方)董事長(zhǎng)提議回購(gòu)公司股份 堅(jiān)定看好資本市場(chǎng)長(zhǎng)期價(jià)值
- 英飛凌宣布收購(gòu)Marvell的汽車以太網(wǎng)業(yè)務(wù)
- 強(qiáng)強(qiáng)聯(lián)合!兆易創(chuàng)新與納微半導(dǎo)體達(dá)成戰(zhàn)略合作
- 德州儀器模擬設(shè)計(jì) | 運(yùn)算放大器基本穩(wěn)定性概述
- 人形機(jī)器人新王者崛起:Figure估值直逼2900億,中國(guó)軍團(tuán)能否迎頭趕上?
- 系列二:TI模擬芯片選型指南(參與過系列一活動(dòng)的也可以參加這期喲)
- 3小時(shí)實(shí)戰(zhàn)+剖析:TI工程師手把手帶你全面入門MSP430(限量售$4.3開發(fā)套件,助你參與動(dòng)手實(shí)驗(yàn))
- 答題贏獎(jiǎng):日?qǐng)D科技低功耗測(cè)試系統(tǒng)介紹
- 有獎(jiǎng)直播|英飛凌OBC解決方案深度詳解 報(bào)名中!
- 【歡樂新年精彩共享】?jī)?yōu)秀主題/回復(fù)活動(dòng)第19期如期到來啦~~
- 讀故事寫評(píng)語嘍~ 踩過坑的你是否期待更貼心智能的客戶支持,KeysightCare邀您搶樓贏禮!
- PI 有獎(jiǎng)直播:在無需DC-DC變換器的多路輸出電源設(shè)計(jì)中實(shí)現(xiàn)高效率和出色的輸出調(diào)整率
- 幫忙他人,成就自我——EEWORLD問答榜(10期)
- 平頭哥RVB2601開源應(yīng)用方案征集來啊~100套板卡助陣,天貓精靈智能套裝禮品組等你抱走~
- 彭博社:格芯計(jì)劃在美上市 價(jià)格預(yù)估200億美元
- 長(zhǎng)電先進(jìn)與星科金朋韓國(guó)榮獲“TI 卓越供應(yīng)商獎(jiǎng)”
- 全球矚目!蜂巢能源無鈷正極材料正式量產(chǎn)下線
- 開源FPGA基金會(huì)宣布成立
- 西門子推出PCBflow
- Easy Drive? ADC 簡(jiǎn)化高阻抗傳感器的測(cè)量
- 貿(mào)澤電子與Texas Instruments聯(lián)手探索下一代機(jī)器人
- 我國(guó)研發(fā)高精度量子重力儀,將打破國(guó)外技術(shù)壟斷
- 小米、蘋果不送充電器背后的真相
- LG Display將發(fā)布自發(fā)聲48英寸可彎曲OLED顯示屏