眾所周知,嵌入式開發(fā)屬于偏底層的開發(fā),主要編程語言是C和匯編。所以本文要講的source文件主要指的就是c文件和匯編文件。
盡管在平常開發(fā)中,我們都只會關(guān)注自己創(chuàng)建的.c/.h/.s源文件,但實(shí)際上我們不知不覺中也跟很多不是我們創(chuàng)建的源文件在打交道,那么問題來了,一個(gè)完整的嵌入式工程(以基于ARM Cortex-M控制器的工程為例)到底會包含哪些source文件呢?
現(xiàn)在就到了痞子衡的show time了,痞子衡將這些文件按來源分為五類十種,下面痞子衡按類別逐一分析這些文件:
第一類:Provided by Committee
第一類文件由C標(biāo)準(zhǔn)委員會提供,該類文件伴隨著標(biāo)準(zhǔn)的發(fā)布而逐漸壯大。該類文件主要就是一種,即C標(biāo)準(zhǔn)庫。
1. C standard Library
大家都知道C語言是有標(biāo)準(zhǔn)的,常見的C標(biāo)準(zhǔn)有ANSI C(C89)、C99、C11,而C標(biāo)準(zhǔn)函數(shù)庫(C Standard library)就是所有符合C標(biāo)準(zhǔn)的頭文件的集合,以及常用的函數(shù)庫實(shí)現(xiàn)程序。C標(biāo)準(zhǔn)庫由Committee制訂發(fā)布,通常會被包含在IDE里。列舉一些常見文件和函數(shù)如下,是不是覺得似曾相識?
/* 常用文件 */ assert.h,stdio.h,stddef.h,stdint.h,string.h ...
/* 常用定義 */ bool,NULL,uint8_t,uint16_t,uint32_t...
/* 常用函數(shù) */ assert(),printf(),memset(),memcpy()...
第二類:Provided by IDE(Compiler)
第二類文件由IDE提供,C語言是編譯型語言,需要編譯器將C程序匯編成機(jī)器碼,所有便有了一些跟編譯器特性相關(guān)的函數(shù)庫。
2. Compiler Library
我們在開發(fā)嵌入式應(yīng)用時(shí)需要借助集成開發(fā)環(huán)境(IDE),常見的IDE有GCC(GNUC),Keil MDK(ARMCC),IAR EWARM(ICCARM),這些IDE都有配套的C編譯器,這些編譯器是各有特色的,為了充分展示各編譯器特色,配套的函數(shù)庫便應(yīng)運(yùn)而生。
編譯器函數(shù)庫是因IDE而異的,此處僅講一個(gè)例子以供參考,需要了解更多需查看各IDE手冊。
以IAR EWARM里的DLib_Product_string.h文件為例,該文件中重定義了memcpy的實(shí)現(xiàn):
#define _DLIB_STRING_SKIP_INLINE_MEMCPY
#pragma inline=forced_no_body
__EFF_NENR1NW2R1 __ATTRIBUTES void * memcpy(void * _D, const void * _S, size_t _N)
{
__aeabi_memcpy(_D, _S, _N);
return _D;
}
第三類:Provided by ARM
第三類文件由ARM提供,嵌入式程序的執(zhí)行靠的是控制器內(nèi)核(此處指的內(nèi)核便是ARM內(nèi)核),ARM公司在設(shè)計(jì)內(nèi)核時(shí),提供了一些內(nèi)核模塊的接口,開發(fā)者可以通過這些接口訪問內(nèi)核資源,CMSIS header里就是這些內(nèi)核模塊資源的接口。
3. CMSIS header
完整的CMSIS header目錄應(yīng)該是下面這個(gè)樣子,而必須要關(guān)注的只有CMSISInclude下面的core_cmx.h文件
CMSIS
Core
DAP /* ARM debugger實(shí)現(xiàn) */
Driver /* ARM統(tǒng)一的常用外設(shè)driver API */
DSP_Lib /* ARM優(yōu)化實(shí)現(xiàn)的DSP Lib */
Include /* ARM內(nèi)核資源接口 */
arm_xx.h
cmsis_xx.h
core_cmx.h
Lib /* ARM優(yōu)化實(shí)現(xiàn)的標(biāo)準(zhǔn)Lib */
Pack
RTOS /* ARM推出的RTOS- RTX */
RTOS2
SVD
Utilities
core_cmx.h文件里定義了內(nèi)核資源接口,里面最常用的三大模塊是SCB,SysTick,NVIC,一個(gè)嵌入式開發(fā)的老手看到這些模塊應(yīng)該要向痞子衡揮手示意,來,讓痞子衡看見你們的雙手~~~
第四類:Provided by Chip Producer
第四類文件是由ARM芯片生產(chǎn)商提供,我們在選型一個(gè)ARM芯片時(shí),除了看ARM內(nèi)核類型外,還得看芯片內(nèi)部外設(shè)資源,是這些外設(shè)導(dǎo)致了ARM芯片差異,于是便有了各大ARM廠商爭奇斗艷,比如NXP(Freescale), ST, Microchip(Atmel),ARM廠商賦予了ARM芯片各種外設(shè)資源,同時(shí)也會提供這些外設(shè)資源的接口。該類別下文件有四種:
4. device.h:芯片頭文件,主要包含中斷號定義(xx_IRQn)、外設(shè)模塊類型定義(xx_Type) 、外設(shè)基地址定義(xx_BASE)。
/////////////////////////////////////////////////////
// 中斷號定義
typedef enum IRQn {
NotAvail_IRQn = -128,
/* Core interrupts */
NonMaskableInt_IRQn = -14,
HardFault_IRQn = -13,
...
SysTick_IRQn = -1,
/* Device specific interrupts */
WDT0_IRQn = 0,
...
} IRQn_Type;
////////////////////////////////////////////////////
// 外設(shè)寄存器定義
typedef struct {
__IO uint32_t MOD;
...
__IO uint32_t WINDOW;
} WWDT_Type;
#define WWDT_WINDOW_WINDOW_MASK (0xFFFFFFU)
#define WWDT_WINDOW_WINDOW_SHIFT (0U)
#define WWDT_WINDOW_WINDOW(x) (((uint32_t)(((uint32_t)(x)) << WWDT_WINDOW_WINDOW_SHIFT)) & WWDT_WINDOW_WINDOW_MASK)
////////////////////////////////////////////////////
// 外設(shè)基地址定義
#define WWDT0_BASE (0x5000E000u)
5. startup_device.s:芯片中斷向量表文件,主要包含中斷向量表定義(DCD xx_Handler) ,以及各中斷服務(wù)程序的弱定義(PUBWEAK)。 Note:該文件因編譯器而異。
;;基于IAR的startup_device.s文件
MODULE ?cstartup
;; Forward declaration of sections.
SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:NOROOT(2)
PUBLIC __vector_table
PUBLIC __Vectors_End
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 中斷向量表定義
DATA
__vector_table
DCD sfe(CSTACK)
DCD Reset_Handler
DCD NMI_Handler
DCD HardFault_Handler
...
DCD SysTick_Handler
; External Interrupts
DCD WDT0_IRQHandler
...
__Vectors_End
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 中斷服務(wù)程序弱定義
THUMB
PUBWEAK WDT0_IRQHandler
PUBWEAK WDT0_DriverIRQHandler
SECTION .text:CODE:REORDER:NOROOT(2)
WDT0_IRQHandler
LDR R0, =WDT0_DriverIRQHandler
BX R0
WDT0_DriverIRQHandler
B .
END
6. system_device.c/h:芯片系統(tǒng)初始化文件,主要包含全局變量SystemCoreClock定義(提供芯片內(nèi)核默認(rèn)工作頻率)、SystemInit()函數(shù)定義(完成最基本的系統(tǒng)初始化,比如WDOG初始化,RAM使能等,這部分因芯片設(shè)計(jì)而異)。
7. device SDK Library:官方提供的芯片外設(shè)SDK driver包文件,有了這個(gè)SDK包可以直接使用片內(nèi)外設(shè)設(shè)計(jì)自己的應(yīng)用,而不需要查看芯片手冊里的外設(shè)模塊寄存器去重寫外設(shè)驅(qū)動(dòng)。當(dāng)然并不是每個(gè)廠商都有完善的SDK包,這取決于各廠商對軟件服務(wù)的重視程度。
// 來自于NXP SDK的WWDT driver API
void WWDT_GetDefaultConfig(wwdt_config_t *config);
void WWDT_Init(WWDT_Type *base, const wwdt_config_t *config);
void WWDT_Deinit(WWDT_Type *base);
void WWDT_ClearStatusFlags(WWDT_Type *base, uint32_t mask);
void WWDT_Refresh(WWDT_Type *base);
第五類:Created by Developer
第五類文件是開發(fā)者自己創(chuàng)建,用于實(shí)現(xiàn)開發(fā)者自己的嵌入式應(yīng)用,分為應(yīng)用系統(tǒng)啟動(dòng)文件,應(yīng)用系統(tǒng)初始化文件,應(yīng)用文件。其中應(yīng)用系統(tǒng)啟動(dòng)和初始化文件屬于main函數(shù)之前的文件,一般可以通用,大部分開發(fā)者并不關(guān)心其具體內(nèi)容,但是了解其過程可以加深對嵌入式系統(tǒng)結(jié)構(gòu)的理解。
8. reset.s: 應(yīng)用系統(tǒng)復(fù)位啟動(dòng)文件,了解ARM原理的都知道,image前8個(gè)字節(jié)數(shù)據(jù)分別是芯片上電的初始SP, PC,其中PC指向的便是本文件里的Reset_Handler,這是芯片執(zhí)行的第一個(gè)函數(shù)入口,該函數(shù)主要用于完成應(yīng)用系統(tǒng)初始化工作,包含應(yīng)用中斷向量表重定向、調(diào)用芯片系統(tǒng)初始化、ARM系統(tǒng)寄存器rx清零、初始化應(yīng)用程序各數(shù)據(jù)段、初始化ARM系統(tǒng)中斷、跳轉(zhuǎn)main函數(shù)。
// 一段經(jīng)典的startup code
SECTION .noinit : CODE
THUMB
import SystemInit
import init_data_bss
import main
import CSTACK$$Limit
import init_interrupts
EXTERN __vector_table
REQUIRE __vector_table
#define SCB_BASE (0xE000ED00)
#define SCB_VTOR_OFFSET (0x00000008)
PUBLIC Reset_Handler
EXPORT Reset_Handler
Reset_Handler
// Mask interrupts
cpsid i
// Set VTOR register in SCB first thing we do.
ldr r0,=__vector_table
ldr r1,=SCB_BASE
str r0,[r1, #SCB_VTOR_OFFSET]
// Init the rest of the registers
ldr r2,=0
ldr r3,=0
ldr r4,=0
ldr r5,=0
ldr r6,=0
ldr r7,=0
mov r8,r7
mov r9,r7
mov r10,r7
mov r11,r7
mov r12,r7
// Initialize the stack pointer
ldr r0,=CSTACK$$Limit
mov r13,r0
// Call the CMSIS system init routine
ldr r0,=SystemInit
blx r0
// Init .data and .bss sections
ldr r0,=init_data_bss
blx r0
// Init interrupts
ldr r0,=init_interrupts
blx r0
// Unmask interrupts
cpsie i
// Set argc and argv to NULL before calling main().
ldr r0,=0
ldr r1,=0
ldr r2,=main
blx r2
__done
B __done
END
9. startup.c:應(yīng)用系統(tǒng)初始化文件,該文件里主要包含兩個(gè)初始化函數(shù),init_data_bss()、 init_interrupts(),data, bss段數(shù)據(jù)的初始化是為了保證嵌入式系統(tǒng)中所有全局變量能有一個(gè)開發(fā)者指定的初值。由于data,bss段的位置是在鏈接階段確定的,所以此處需要配合linker文件才能找到正確的data,bss位置,linker文件是因IDE而異的,所有本文件要想做到通用,必須增加各IDE條件編譯,此處僅以IAR下的實(shí)現(xiàn)為例:
//基于IAR的startup.c文件
#if (defined(__ICCARM__))
#pragma section = ".intvec"
#pragma section = ".data"
#pragma section = ".data_init"
#pragma section = ".bss"
#pragma section = "CodeRelocate"
#pragma section = "CodeRelocateRam"
#endif
void init_data_bss(void)
{
#if defined(__ICCARM__)
uint8_t *data_ram, *data_rom, *data_rom_end;
uint8_t *bss_start, *bss_end;
uint8_t *code_relocate_ram, *code_relocate, *code_relocate_end;
uint32_t n;
// 初始化data段 .data section (initialized data section)
data_ram = __section_begin(".data");
上一篇:痞子衡嵌入式:ARM Cortex-M文件那些事(0)- 文件關(guān)聯(lián)
下一篇:痞子衡嵌入式:ARM Cortex-M文件那些事(2)- 鏈接文件(.icf)
推薦閱讀
史海拾趣
作為全球化的技術(shù)型企業(yè),F(xiàn)RIWO在全球范圍內(nèi)設(shè)立了研發(fā)、生產(chǎn)和營銷部門,以滿足不同市場的需求。FRIWO的電源解決方案業(yè)務(wù)部(FPS)專注于為客戶量身訂做電源解決方案,其客戶群遍布醫(yī)療科技、IT通訊、家用電器、移動(dòng)工具以及工業(yè)應(yīng)用等多個(gè)領(lǐng)域。為了更好地服務(wù)本地客戶,F(xiàn)RIWO在不同地區(qū)設(shè)立了分支機(jī)構(gòu),確保能夠快速響應(yīng)客戶需求并提供專業(yè)的技術(shù)支持和服務(wù)。這種全球化布局與本地化服務(wù)的策略,使得FRIWO在激烈的市場競爭中保持了強(qiáng)勁的競爭力。
隨著汽車電子化的趨勢日益明顯,大陸集團(tuán)也開始將業(yè)務(wù)拓展到汽車電子領(lǐng)域。在新的架構(gòu)體系中,車身電子部門被納入“車聯(lián)網(wǎng)和信息”這個(gè)大的業(yè)務(wù)板塊中。大陸集團(tuán)致力于實(shí)現(xiàn)車身電子的更好互聯(lián)、更好呈現(xiàn)信息和更好的集成。通過互聯(lián)技術(shù),數(shù)據(jù)能夠在汽車與外界之間進(jìn)行傳遞,并將這些信息通過人機(jī)交互界面呈現(xiàn)給駕駛者和乘客。同時(shí),大陸集團(tuán)還致力于確保數(shù)據(jù)從車輛到云端的順暢傳輸和處理。這些舉措使得大陸集團(tuán)在汽車電子領(lǐng)域取得了顯著的進(jìn)展。
在LED照明產(chǎn)品的生產(chǎn)過程中,DDP Engineered LED Solutions公司始終堅(jiān)守品質(zhì)控制的原則。公司建立了嚴(yán)格的生產(chǎn)流程和質(zhì)檢標(biāo)準(zhǔn),確保每一件產(chǎn)品都符合質(zhì)量要求。同時(shí),公司還積極引入先進(jìn)的生產(chǎn)設(shè)備和管理系統(tǒng),提升生產(chǎn)效率和產(chǎn)品質(zhì)量。正是這些努力,讓DDP的產(chǎn)品在市場上贏得了客戶的信任和好評,為公司贏得了良好的口碑。
隨著產(chǎn)品技術(shù)的成熟和市場需求的增長,Delus Corp公司開始積極拓展市場。公司不僅在國內(nèi)市場取得了顯著成績,還通過參加國際展覽、建立海外銷售網(wǎng)絡(luò)等方式,成功打入國際市場。此外,公司還與國際知名企業(yè)開展合作,共同研發(fā)新產(chǎn)品,進(jìn)一步提升了公司的國際競爭力。
Abundance Enterprise Company成立于XXXX年,初期專注于電子元器件的研發(fā)和生產(chǎn)。公司憑借對市場需求的敏銳洞察,迅速定位在高端電子元器件市場,通過精準(zhǔn)的市場定位和高質(zhì)量的產(chǎn)品,逐漸在電子行業(yè)中占據(jù)了一席之地。初創(chuàng)團(tuán)隊(duì)?wèi){借扎實(shí)的技術(shù)基礎(chǔ)和不懈的努力,成功打破了國外品牌在高端市場的壟斷,為國內(nèi)電子元器件行業(yè)樹立了新的標(biāo)桿。
EICHHOFF公司成立于XX世紀(jì)XX年代,當(dāng)時(shí)由創(chuàng)始人XXX在德國的一個(gè)小鎮(zhèn)上開設(shè)了一個(gè)小型的電子元件加工廠。由于XXX對電子技術(shù)的熱愛和對市場需求的敏銳洞察,他專注于生產(chǎn)高質(zhì)量的連接器和其他電子組件。在初創(chuàng)階段,EICHHOFF的產(chǎn)品主要供應(yīng)給當(dāng)?shù)氐碾娮又圃焐毯途S修店。隨著口碑的逐漸傳播和產(chǎn)品質(zhì)量的不斷提升,公司開始接到來自更廣泛地區(qū)的訂單。
為了應(yīng)對不斷增長的市場需求,EICHHOFF公司逐步擴(kuò)大了生產(chǎn)規(guī)模,并引入了先進(jìn)的生產(chǎn)設(shè)備和技術(shù)。同時(shí),公司也注重人才培養(yǎng)和團(tuán)隊(duì)建設(shè),吸引了一批有才華的工程師和技術(shù)人員加入。這些努力使得EICHHOFF在電子行業(yè)中逐漸嶄露頭角。
我有2臺全新未開封的APC品牌的UPS,SU1000型,WINDOWS個(gè)版本都有驅(qū)動(dòng)支持.26.1KG/體積21.6X17X43.9CM有需要的加我QQ19642345 [ 本帖最后由 西門 于 2009-5-12 19:13 編輯 ]… 查看全部問答∨ |
|
我在ram.c中定義了需要的全局變量 #define uchar unsigned char uchar counter3; uchar scounter; uchar mcounter; uchar scounter1; uchar code Ht1621Tab[]= { 0x00,0x00,0x00,0x00,0x00,0x00,0x ...… 查看全部問答∨ |
|
阿牛哥一直觀察和思考電子媒體互動(dòng)社區(qū)的博客和微博客。期刊看發(fā)行量 ,網(wǎng)絡(luò)看流量 ,那末博客和微博是僅僅看粉絲嗎?特別是微博,微博群 和MSN ,QQ群等交流工具相比有哪些優(yōu)勢?! 阿牛哥和一些開發(fā)制造商朋友溝通,他們說上 ...… 查看全部問答∨ |
|
C2000LANCHPAD 緊急求助中,用哪個(gè)軟件可以來下載這塊板子 我申請了那個(gè)板子,型號是TMS320F28027,但是,我用的是CCS3.3然后就在里面沒有找到這個(gè)芯片的型號,很是糾結(jié)也很老火,我是剛學(xué)的DSP,在這方面還是新手。求大師幫助中。感激不盡?。。 ? 查看全部問答∨ |
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 阿里黑科技落地!夸克AI眼鏡全球首發(fā),高德、淘寶、支付寶都能用
- 化繁為簡, 適配復(fù)雜磁場環(huán)境,MT73xx 3D雙路輸出霍爾鎖存器賦能車規(guī)電機(jī)精準(zhǔn)控制
- 9.5億美元收購恩智浦MEMS傳感器業(yè)務(wù),意法半導(dǎo)體 在傳感器領(lǐng)域的地位再升級
- 高性能電動(dòng)滑板車 BLDC 電機(jī)驅(qū)動(dòng)器:技術(shù)解析與應(yīng)用展望
- 5G工業(yè)網(wǎng)關(guān)的“邊緣計(jì)算+AI推理”一體化設(shè)計(jì),PLC協(xié)議解析與缺陷檢測的實(shí)時(shí)聯(lián)動(dòng)
- AR眼鏡的“工業(yè)指令投射”系統(tǒng),SLAM的空間定位、PLC數(shù)據(jù)實(shí)時(shí)疊加顯示
- 多光譜氣體傳感器的抗交叉干擾設(shè)計(jì)
- 多模態(tài)融合感知的“語義-幾何”聯(lián)合建模
- 工業(yè)觸摸屏的“壓感-手勢”多模態(tài)交互設(shè)計(jì)
- 工業(yè)機(jī)器人高精度力控的“雙模融合”傳感器設(shè)計(jì)
- 搶樓有獎(jiǎng):免費(fèi)獲得元器件樣品本~~
- 下午2點(diǎn)微信群語音答疑:Vicor電源專家答網(wǎng)友的電源設(shè)計(jì)問題
- 有獎(jiǎng)直播:是德科技高速芯片設(shè)計(jì)新技術(shù)研討會
- 是德科技白皮書下載:攻克當(dāng)前面臨的毫米波測試難關(guān)
- 有獎(jiǎng)直播|完美替代傳統(tǒng)汽車鑰匙?探索英飛凌數(shù)字鑰匙解決方案
- TI 工業(yè)月,靈感不設(shè)限!21天習(xí)慣養(yǎng)成記!打卡贏好禮啦!
- 深扒TI教室2.0,那些你不能錯(cuò)過的精彩
- 是德科技有獎(jiǎng)問答活動(dòng)之四,使用實(shí)時(shí)示波器進(jìn)行串?dāng)_分析,答題闖關(guān)贏好禮!
- 預(yù)計(jì)2025年全球新增逆變器需求將達(dá)到500GW
- 中小型工商業(yè)光伏勢頭正盛!看微型逆變器技術(shù)如何發(fā)揮領(lǐng)先優(yōu)勢!
- 光伏逆變器行業(yè)研究與投資機(jī)會分析
- 西門子博途Graph語言編程之在線調(diào)試方法
- Synaptics攜手百度為音質(zhì)設(shè)備升級
- 1602.c和1602.h頭文件,完美版的51單片機(jī)1602液晶驅(qū)動(dòng)
- 電動(dòng)全身外骨骼:支持敏捷制造的理想工具
- 雄安新區(qū)將建設(shè)國際領(lǐng)先數(shù)字化主動(dòng)配電網(wǎng)
- 英國政府投入3.5億英鎊支持綠色復(fù)蘇技術(shù)
- 機(jī)器人將取代的工種有哪些?
- 功能強(qiáng)勁的程序編輯器SourceInsight-v3.50.0050
- 院士聯(lián)名推薦T-MMB成為手機(jī)電視國家標(biāo)準(zhǔn)
- CCS無法燒寫程序
- 【中科藍(lán)訊AB32VG1 RISC-V板“碰上”RTT測評】定時(shí)器PWM模式與舵機(jī)應(yīng)用
- BOOST升壓斬波電路輸入電壓降低
- Altium Designer 16軟件安裝與破解詳細(xì)圖文教程(包成功破解)
- 哪個(gè)朋友幫我忙??我十萬火急,,吃飯不下
- USB攝像頭圖紙
- SQL Mobile 在Wince5.0 Arm下的安裝問題 (SQL CE 3.0)
- 【NUCLEO-WL55JC2測評】+ ADC采集轉(zhuǎn)發(fā)