摘要:ARM7TDMI-S是ARM公司設計的一款32位精簡指令集處理器內核,LPC210x系列是飛利浦半導體公司生產的基于ARM7TDMI-S內核的芯片。在嵌入式系統設計中,針對嵌入式處理器和操作系統的Bootloader代碼的設計是一個難點。本文根據用LPC2106進行嵌入式系統設計的實際經驗,總結出基于ARM7TDMI-S內核的嵌入式處理器芯片的Bootloader代碼設計的一般流程;給出LPC2106芯片在基于μC/OS-II操作系統的嵌入式應用中,BootLoader程序的詳細設計流程及其中的一些關鍵技術和代碼。
引言
芯片的Bootloader代碼(即啟動代碼)就是芯片復位后進入操作系統之前執行的一段代碼,主要是為運行操作系統提供基本的運行環境,如初始化CPU堆棧、初始化存儲器系統等。Bootloader代碼與CPU芯片的內核結構、具體芯片和使用的操作系統等因素有關。其功能有點類似于PC機的BIOS(Basic Input/Output System,基本輸入輸出系統)程序,但是由于嵌入式系統的軟硬件都要比PC機的簡單,所以它的Bootloader代碼要比BIOS程序簡單得多。
嵌入式系統被定義為:以應用中為心,以計算機技術為基礎,軟件硬件可裁剪,適用于系統對功能、可靠性、成本、何種、功耗有嚴格要求的專用計算機系統。嵌入式系統的核心部件是嵌入式處理器。隨著嵌入式系統在人們日常生活中的廣泛運用,嵌入式處理器得到前所未有的飛速發展。基于ARM核的嵌入式處理器芯片種類繁多。由于ARM公司只設計內核的不生產具體的芯片,即便是基于同一種內核,不同廠家生產的芯片差別很大,因此不易編寫出統一的Bootloader代碼。ARM公司針對這一問題而采取的策略是,不提供完事的Bootloader代碼(ARM公司的開發工具ADS提供了一些功能代碼),Bootloader代碼不足的部分由芯片廠商提供或者由用戶自己編寫。飛利浦公司沒有提供LPC210x系列的Bootloader代碼,所以用戶只能自己編寫Bootloader代碼。
1 ARM7TDMI-S和LPC210x
ARM7TDMI-S是目前比較低端的ARM核—ARM核不是芯片,它與其它部件如RAM、ROM、片內外設組合在一起才構成實際的芯片。ARM7是用于對成本和功耗都非常敏感的消費應用的低價位、低功耗的32位核。其主要特點如下:馮.諾依曼結構、3段流水線、0.9MIPS/MHz;非常低的功耗;嵌入式ICE-RT(In Circuit Emulation-Real Time,實時在線仿真)邏輯。
LPC2104/2105/2106基于一個支持實時仿真和跟蹤的ARM7TDMI-S內核,并帶有128KB的高速Flash存儲器,128位寬度的存儲器接口和獨特的加速結構,使32位代碼能夠在最大時鐘速率下運行。由于LPC2104/2105/2106具有非常小的尺寸和極低的功耗,它們非常適合于那些將小型化作為主要要求的應用,例如存儲取控制和POS機。帶有寬范圍的串行通信接口、片內多達64KB的SRAM,由于具有大的緩沖區和強大的處理器能力,它們非常適合于通信網關和協議轉換器、軟件調制解調器、聲音識別以及低端的圖像處理。而多個32位定時器、PWM輸出和32個GPIO,使它們特別適用于工業控制和醫療系統。LPC2106是LPC210x系列的一種,其它兩種為LPC2104/2105。它們都基于ARM7TDMI-S內核。三種芯片唯一的區別就是SRAM的容量大小:LPC2106是64KB,而LPC2104是16KB,LPC2105是32KB。
2 Bootloader代碼
2.1 Bootloader代碼的作用
嵌入式系統的資源有限,應用程序通常都是固化在ROM中運行。ROM中的程序執行前,需要對系統硬件和軟件運行環境進行初始化。這些工作是用匯編語言和C語言編寫的Bootloader代碼完成的。在ARM處理器的嵌入式系統中,Bootloader代碼的作用主要有以下幾點:
*初始化CPU各種模式的堆棧和寄存器;
*初始化系統中要使用的各種片內外設;
*初始化目標板;
*引導操作系統。
2.2 Bootlader代碼設計的一般流程
Bootloader代碼是嵌入式系統中應用程序的開頭部分,它與應用程序一起固化在ROM中,并首先在系統上運行。設計好Bootloader代碼是設計嵌入式程序的關鍵,也是系統能夠正常工作的前提。Bootloader代碼所執行的操作主要信賴于CPU內核的類型,以及正在開發的嵌入式系統軟件中需要使用CPU芯片上的哪些資源。Bootloader代碼的一般流程(即Bootloader代碼應該進行的操作)如圖1所示。
2.3 基于LPC2104和μC/OS-II是多任務的實時操作系統。針對該款芯片和多任務實時操作系統的Bootloader程序的流程如圖2所示。
2.3.2 關鍵代碼分析
;中斷向量表,給出了CPU芯片出現異常時應該轉去執行的程序地址
Vectors
LDR PC,ResetAddr
LDR PC,SWI_Addr
LDR PC,SWI_Addr
LDR PC,PrefetchAddr
LDR PC,DataAbortAddr
DCD 0xb9205f80
LDR PC,[PC,#-0xff0]
LDR PC,FIQ_Addr
ResetAddr DCD Reset
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
;InitStack函數,其功能是初始化CPU各種模式的堆棧
InitSatck
MOV R0,LR ;因芯片模式切換,故將程序返回地址保存至R0,同時在初始化堆棧完成后使用R0返回
MSR CPSR_c,#0xd3 ;設置管理模式堆棧
LDR SP,StackSvc
MSR CPSR_c,#0xd2 ;設置中斷模式堆棧
LDR SP,StackIrq
MSR CPSR_c,#0xd1 ;設置快速中斷模式堆棧
LDR SP,StackFiq
MSR PSR_c,#0xd7 ;設置中止模式堆棧
LDR SP,StackAbt
MSR CPSR_c,#0xdb ;設置未定義模式堆棧
LDR SP,StackUnd
MSR CPSR_c,#0xdf ;設置系統模式堆棧
LDR SP,StackUsr
MOV PC,R0
StackUsr DCD UsrStackSpace+(USR_STACK_LEGTH-1)*4
StackRvc DCD SvcStackSpace+(SVC_STACK_LEGTH-1)*4
StackIrq DCD IrqStackSpace+(IRQ_STACK_LEGTH-1)*4
StackFiq DCD FiqStackSpace+(FIQ_STACK_LEGTH-1)*4
StackAbt DCD AbtStackSpace+(ABT_STACK_LEGTH-1)*4
StackUnd DCD UndtStackSpace+(UND_STACK_LEGTH-1)*4
;系統初始化代碼
Reset
BL InitStack ;調用InitStack函數初始化芯片各種模式的堆棧
BL TargetResetInit ;調用TargetResetInit函數對系統進行基本初始化
B _main ;跳轉到ADS提供的啟動代碼_main函數處,它初始化函數庫并最終引導CPU進入操作系統的main()函數
上面的程序代碼只包含了流程圖中的幾個主機步驟。這些步驟都是必不可少的,其余的步驟都在TargetResetInit函數中加以實現。本例中的TargerReset Init函數如下:
void TargetResetInit(void)
{/*設置系統各部分時鐘*/
PLLCON=1;
#if((Fcclk /4)/Fpclk==1
VPBDIV=0;
#endif
#if((Fcclk/4)/Fpclk==2
VPBDIV=2;
#endif
#if((Fcclk/4)/Fpclk==4
VPBDIV=1;
#endif
#if(Fcco/Fcclk)==1
PLLCFG=((Fcclk/Fosc)-1)|(1<<5);
#endif
#if(Fcco/Fcclk)==2
PLLCFG=((Fcclk/Fosc)-1|(2<<5);
#endif
#if(Fcco/Fcclk)==4
PLLCFG=((Fcclk/Fosc)-1|(3<<5);
#endif
#if(Fcco/Fcclk)==8
PLLCFG=((Fcclk/Fosc)-1)|(4<<5);
#endif
PLLFEED=0xaa;
PLLFEED=0x55;
while(PLLSTAT &(1<<10)==0)
PLLCON=3;
PLLFEED=0xaa;
PLLFEED=0x55;
/*設置存儲器加速模塊*/
MAMCR=2;
#if Fcclk<20000000
MAMTIM=1;
#else
#if Fcclk<40000000
MAMTIM=2;
#else
MAMTM=3;
#endif
#endif
/*初始化VIC,使芯片在進入μC/OS-II多任務環境前關中斷*/
VICIntEnClr=0xffffffff;
VICVectAddr=0;
VICIntSelect=0;
/*其它步驟的代碼與實際的軟件功能相關,不具有代表性,故在此不列出*/
}
3 結論
本文介紹的Bootloader代碼已經在基于Philips公司的LPC2106芯片開發的系統上運行并測試通過。針對不同的CPU芯片編寫Bootloader代碼,首先要了解該CPU的內核結構、指令系統,其次是具體芯片的結構和各種片上資源,以及所采用的操作系統。以上所列的設計流程不是一成不變的,在具體應用中要權衡取舍。
- ARM7(50049)
- 代碼設計(6116)
相關推薦
ARM7 系列微處理器有哪些特點
ARM7TDMI (Rev 3)核心處理器產品概述
ARM7TDMI技術參考中文手冊
ARM9TDMI技術參考手冊
ARM9嵌入式系統設計與開發教程
ARM9嵌入式系統設計與開發教程
ARM嵌入式系統應用中的問題總結分析
ARM嵌入式系統應用中的問題總結分析
ARM嵌入式系統應用中的問題總結分析
ARM嵌入式系統應用中的問題總結分析
ARM嵌入式系統應用中的問題總結分析
ARM嵌入式系統的基本結構
ARM嵌入式系統的學習步驟
ARM嵌入式系統的學習步驟
ARM嵌入式系統的學習步驟
ARM嵌入式系統的學習步驟
ARM嵌入式系統的學習步驟
ARM嵌入式系統的學習步驟
ARM嵌入式系統硬件設計及應用實例
ARM嵌入式Linux 系統開發從入門到精通
ARM嵌入式Linux系統開發從入門到精通
ARM嵌入式Linux系統開發詳解
ARM嵌入式學習經典40問
ARM嵌入式操作系統匯總
ARM嵌入式最小系統的啟動架構是什么?
ARM和嵌入式系統方向介紹
嵌入式ARM原理與應用
嵌入式系統中的掉電保護過程是什么樣的?
嵌入式系統學習步驟
嵌入式系統開發流程
嵌入式系統掉電保護實現的過程是什么?
嵌入式系統的開源軟件發展如何?
嵌入式系統結構與協同性探討
嵌入式系統開發過程中的常見問題和解決方法
嵌入式Linux怎么學?給大家推薦幾本學習嵌入式系統的書籍
嵌入式硬件系統的相關資料分享
嵌入式網絡系統設計(光盤):基于Atmel ARM7系列
嵌入式軟件代碼保護系統是由什么構成的?
μC/OS-II在LPC213X上有哪些移植方案?
《ARM嵌入式系統基礎教程》
《ARM嵌入式系統基礎教程》PDF高清版
《ARM嵌入式系統基礎教程》下載
【下載】ARM嵌入式系統基礎教程(周立功第2版)
【下載】《ARM9 嵌入式系統設計與開發教程》
【我是電子發燒友】淺談嵌入式ARM開發的前世今生
一種嵌入式系統用于多媒體實時數據的網絡傳輸設計
與嵌入式相關的資料
什么是嵌入式開發?
基于ARM7實現嵌入式應用啟動程序
基于ARM7的嵌入式音頻處理系統的設計
基于ARM-Linux和S3C2440的嵌入式Linux內核設計
基于ARM嵌入式系統的自動化配送系統
基于ARM怎么搭建嵌入式Linux系統?
基于ARM的嵌入式系統與C語言編程的結合
基于ARM的嵌入式系統設計
基于ARM高速閃存MCU應對廣泛嵌入式需求
基于嵌入式操作系統的開發方法有哪些?
基于μClinux ARM的嵌入式系統的設計
基于網絡加載的嵌入式BootLoader有什么優點?
基于網絡加載的嵌入式BootLoader的設計與實現
大佬都在看的嵌入式復習提綱
如何利用ARM7嵌入式單片機設計視頻報警系統?
如何學習嵌入式系統
如何學習嵌入式系統【硬件篇】
如何學習嵌入式系統(基于ARM平臺)
如何學習嵌入式系統(基于ARM平臺)
對ARM在嵌入式開發中的概述
求好的嵌入式教材推薦
淺談ARM嵌入式系統如何學習與入門
淺談嵌入式系統開發流程
熟知ARM如何構架,了解嵌入式系統基本核心
移植BootLoader嵌入式操作系統
采用ARM怎么實現嵌入式監測系統?
ARM7TDMI中文資料參考手冊pdf
![](https://skin.elecfans.com/images/2021-soft/load.png)
arm7tdmi介紹
![](https://skin.elecfans.com/images/2021-soft/load.png)
ARM7TDMI-S在嵌入式系統中的Bootloader代碼
![](https://skin.elecfans.com/images/2021-soft/load.png)
ARM7TDMI-S 在嵌入式系統中的Bootloader代
![](https://skin.elecfans.com/images/2021-soft/load.png)
ARM7TDMI-S(Rev 4)技術參考手冊
![](https://skin.elecfans.com/images/2021-soft/load.png)
基于ARM嵌入式系統開發與應用_吳明暉
![](https://skin.elecfans.com/images/2021-soft/load.png)
ARM7TDMI-S(Rev 4)技術手冊手冊
![](https://skin.elecfans.com/images/2021-soft/load.png)
初識ARM嵌入式系統
![](https://skin.elecfans.com/images/2021-soft/load.png)
評論