日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2024年12月20日(星期五)

正在發(fā)生

2019年12月20日 | 痞子衡嵌入式:ARM Cortex-M文件那些事(1)- 源文件(.c/.h/.s)

發(fā)布者:skyhcg 來源: eefocus關(guān)鍵字:ARM  Cortex-M文件  源文件 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

  眾所周知,嵌入式開發(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");

[1] [2]
關(guān)鍵字:ARM  Cortex-M文件  源文件 引用地址:痞子衡嵌入式:ARM Cortex-M文件那些事(1)- 源文件(.c/.h/.s)

上一篇:痞子衡嵌入式:ARM Cortex-M文件那些事(0)- 文件關(guān)聯(lián)
下一篇:痞子衡嵌入式:ARM Cortex-M文件那些事(2)- 鏈接文件(.icf)

推薦閱讀

Anthony Levandowski,此前優(yōu)步和Waymo之間自動(dòng)駕駛技術(shù)訴訟案的關(guān)鍵人物,12月18日在一篇博客中宣布“回歸”,稱讓“自動(dòng)駕駛拯救生命的潛能成為現(xiàn)實(shí)”是他畢生的使命,并且?guī)砹怂男鹿綪ronto.AI和首款產(chǎn)品。在博客中,Levandowski公布了一段視頻,稱其自動(dòng)駕駛車輛在沒有人員干預(yù)的情況下從舊金山開到紐約。視頻顯示,此次行程于10月16日從金門大...
隨著現(xiàn)代社會的發(fā)展,科學(xué)技術(shù)的進(jìn)步,出現(xiàn)了眾多高層建筑和智能建筑。電梯,作為高層建筑內(nèi)部一種重要的交通工具,其應(yīng)用規(guī)模日益擴(kuò)大。而作為電梯系統(tǒng)中必不可少的一部分,電梯召喚顯示板(簡稱電梯外呼板)的應(yīng)用也隨之劇增。電梯外呼板應(yīng)用于每層樓的電梯門外,供乘客及電梯維保人員使用。電梯外呼板將乘客及維保人員的需求信息通過CAN總線傳達(dá)給電梯...
[手機(jī)中國新聞]臨近年底,iQOO品牌總監(jiān)馮宇飛在微博發(fā)了“一些想跟大家說的話”。iQOO馮宇飛發(fā)長文馮宇飛發(fā)長文稱,“一轉(zhuǎn)眼,今年就只剩下15天了。”2020年,為了滿足大家不同的需求,iQOO一共給大家?guī)砹?款產(chǎn)品。2月25日發(fā)布的iQOO 3,是iQOO今年的第一款產(chǎn)品,也是iQOO首次搭載驍龍865移動(dòng)平臺的旗艦機(jī)型,拉力橙的配色和機(jī)械鍵盤的打字手感獲得了很...
今天上午,榮耀手機(jī)官方預(yù)熱,天璣 9000 旗艦芯性能全開,冷靜輸出!大家期待嗎?未來見!并 @聯(lián)發(fā)科技官方微博 ?! 〈舜温?lián)發(fā)科推出的天璣 9000 旗艦平臺,率先應(yīng)用臺積電 4nm 制程工藝,同時(shí)采用了 Cortex-X2 架構(gòu),并支持 LPDDR5x 7500Mbps 內(nèi)存,使其成為競爭力最強(qiáng)的旗艦級移動(dòng) SoC 之一。與此同時(shí),天璣 9000 旗艦平臺 ...

史海拾趣

問答坊 | AI 解惑

轉(zhuǎn)讓APC品牌SU1000型UPS

我有2臺全新未開封的APC品牌的UPS,SU1000型,WINDOWS個(gè)版本都有驅(qū)動(dòng)支持.26.1KG/體積21.6X17X43.9CM有需要的加我QQ19642345 [ 本帖最后由 西門 于 2009-5-12 19:13 編輯 ]…

查看全部問答∨

quartus2求救

各位DX能發(fā)一個(gè)quartus2教程視頻小弟嗎??現(xiàn)在我知識“貧血期”,謝謝各位?。aukenny@163.com…

查看全部問答∨

智能電子防盜門

許多人都有個(gè)習(xí)慣,當(dāng)長時(shí)間外出學(xué)習(xí)、工作時(shí)會將家里的防盜鐵門反鎖保險(xiǎn) ,防止竊賊入室,但是普通的防盜鐵門即使上了保險(xiǎn),對于橇竊經(jīng)驗(yàn)豐富的慣犯來說也是小菜一碟,用不了多少時(shí)間又能破門而入了,筆者將普通的防盜鎖改裝了一下,加裝了一個(gè)鎖 ...…

查看全部問答∨

Keil C的全局變量問題

我在ram.c中定義了需要的全局變量 #define uchar unsigned char uchar counter3; uchar scounter; uchar  mcounter; uchar scounter1; uchar code Ht1621Tab[]= {         0x00,0x00,0x00,0x00,0x00,0x00,0x ...…

查看全部問答∨

M0解密成功

PS:   1.三根黃色的線  是接的母頭   2.綠色和白色的線 借的是M0的P1.6  P1.7    3.波特率改的是9600    4.還有個(gè)M0怎么也ISP擦除不成功 哎  不過擦除了一塊 已經(jīng) ...…

查看全部問答∨

hex,bin文件

怎么讀出hex,bin格式的文件,有什么方法?謝謝…

查看全部問答∨

請問430外部中斷的觸發(fā)方式

請問430外部中斷的觸發(fā)方式有哪些?。吭谀膫€(gè)寄存器設(shè)置?…

查看全部問答∨

電子媒體互動(dòng)社區(qū)新觀察續(xù)篇

阿牛哥一直觀察和思考電子媒體互動(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ī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved