• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      ARM Cortex—M0+機器碼文件分析方法

      2017-07-25 07:19:59蔡伯峰蔣建武王宜懷
      現(xiàn)代電子技術(shù) 2017年14期

      蔡伯峰+蔣建武+王宜懷

      摘 要: MCU深層次應用開發(fā)需要開發(fā)人員深入了解機器碼在MCU中的存儲和執(zhí)行機制,但機器碼自身可讀性差、相互關(guān)系不清晰等特點決定了對其閱讀、查找、分析難度較大。針對這一情況,以采用ARM Cortex?M0+內(nèi)核的KL25 MCU為藍本,根據(jù)工程編譯鏈接過程和鏈接腳本文件(.ld),分析機器碼文件的生成機制和組織結(jié)構(gòu)。在此基礎(chǔ)上針對機器碼文件中的中斷向量表、初始化代碼、函數(shù)、常變量、FLASH配置域等主要內(nèi)容,結(jié)合機器碼系列文件,給出了簡明快捷實用的分析方法,為嵌入式開發(fā)人員優(yōu)化及動態(tài)更新程序和數(shù)據(jù)、設(shè)計機器碼下載軟件等提供支撐,對其他內(nèi)核機器碼文件的分析有借鑒意義。

      關(guān)鍵詞: ARM Cortex?M0+; 機器碼文件; KL25; 鏈接腳本

      中圖分類號: TN918.2?34; TP311 文獻標識碼: A 文章編號: 1004?373X(2017)14?0044?05

      Abstract: MCU deep?level application development requires its developers to understand storage and enforcement mechanisms of machine codes in MCU, but the machine code itself has poor readability and unclear structure, thus it is difficult to be directly read, searched and analyzed. In response to this situation, using the ARM Cortex?M0+ KL25 MCU as a model, and according to engineering compiling linking process and linker script files (.ld) of MCU application project, the generative mechanism and structure of machine code file are analyzed. On this basis, a concise, efficient and practical analysis method is given in allusion to the interrupt vector table, initialization code, functions, constants, variables and Flash configuration domain. This is helpful for the embedded developers to update dynamically and optimize programs and data, design machine code download software, and analyze machine code files of other kernels.

      Keywords: ARM Cortex?M0+; machine?code file; KL25; linker script

      0 引 言

      用C語言開發(fā)的MCU應用工程經(jīng)過編譯鏈接后生成機器碼目標文件,正確全面深入地掌握機器碼文件的分析方法是快速進行MCU深層次應用開發(fā)必備的技能。機器碼文件要通過機器碼下載軟件下載到目標板上芯片的FLASH存儲區(qū)中運行,下載軟件一般需要開發(fā)人員自行設(shè)計,因為KDS(Kinetis Design Studio)等集成開發(fā)環(huán)境提供的下載方法在脫離開發(fā)環(huán)境后無法使用,不便于產(chǎn)品的批量生產(chǎn);而在程序正常運行后,有時需要動態(tài)在線更新或升級部分程序和數(shù)據(jù),如濾波算法程序、排序算法程序、系統(tǒng)參數(shù)等;嵌入式系統(tǒng)的存儲資源與通用計算機系統(tǒng)相比,相對匱乏、速度較低,對實時性、可靠性要求較高[1],需要根據(jù)實際情況動態(tài)修改或優(yōu)化程序和數(shù)據(jù)等。這一切都需要開發(fā)人員對機器碼文件有充分的了解,能正確深入地分析機器碼文件,了解程序數(shù)據(jù)的存儲和執(zhí)行機制、芯片復位啟動過程、程序執(zhí)行時間等芯片底層內(nèi)容。但不同廠家不同內(nèi)核的指令機器碼存在差異,應用工程的機器碼文件結(jié)構(gòu)和組成也不相同,分析方法也不盡相同,目前有關(guān)ARM Cortex?M0+內(nèi)核機器碼文件的系統(tǒng)性分析研究很少。機器碼自身可讀性差、相互關(guān)系不清晰、不符合通常思維習慣等特點決定了由其組成的機器碼文件閱讀、理解和分析困難,為此,要有正確實用的分析機制和分析方法。

      本文在深入剖析機器碼文件的生成機制、組織結(jié)構(gòu)的基礎(chǔ)上,結(jié)合機器碼系列文件,給出了簡明快捷的分析方法。

      1 機器碼文件的生成

      MCU應用工程在編譯鏈接工程中會使用一些文件,并生成若干文件,只有了解這些文件的生成過程、相互關(guān)系、功能作用等內(nèi)容才能全面準確地分析機器碼文件。

      1.1 MCU程序編譯鏈接過程

      KDS集成開發(fā)環(huán)境下,對任一用C語言開發(fā)的MCU應用工程,運行Cross ARM GCC編譯器,會經(jīng)過如圖1所示的編譯、匯編和鏈接等過程。

      MCU應用工程往往包含若干源代碼文件(.c)(也包含需要快速執(zhí)行的匯編程序.S),每個源代碼文件在編譯、匯編后都會生成一個可重定位的二進制目標文件(.o)[2](本文稱之為中間文件),再通過ld鏈接器根據(jù)鏈接腳本文件(.ld)的內(nèi)部相關(guān)規(guī)則將這些中間文件鏈接組合成針對ARM CPU的.elf格式的可執(zhí)行目標文件[3]。如果程序調(diào)用了靜態(tài)庫(.a)中的函數(shù)或變量,鏈接時還會包括相應的庫文件。在編譯鏈接過程中,還可同時生成機器碼文件(.hex)、映像文件(.map)、列表文件(.lst)。

      1.2 鏈接腳本文件的使用

      鏈接腳本文件(.ld)提供給鏈接器控制鏈接過程,用于重定位代碼并提供程序、數(shù)據(jù)在內(nèi)存中的存儲位置[4?5]。它規(guī)定如何將各個中間文件中的段(稱為輸入段)放入可執(zhí)行目標文件中合適的段(稱為輸出段)中,并控制目標文件內(nèi)各部分的地址分配。它主要由MEMORY,SECTIONS命令組成[6]。首先通過MEMORY命令劃分FLASH和RAM存儲空間可用資源區(qū)為多個存儲區(qū),并定義各存儲區(qū)的起始地址及長度、設(shè)置讀寫或執(zhí)行等屬性。再通過SECTIONS命令定義一些可供應用程序使用的符號并賦值、包含在可執(zhí)行目標文件中的各個輸出段及裝載到哪個存儲區(qū)。在各個輸出段中定義一些與該段相關(guān)的一些符號并賦值,同時確定該段應該由哪些中間文件的哪些輸入段如何鏈接而成。

      以 KL25_UART應用工程為例,該工程運行于本課題組自行設(shè)計的基于KL25(NXP公司的MKL25Z128VLK4)的開發(fā)板上,用于測試串口與PC機間通信情況。KL25[7]包含128 KB FLASH,16 KB SRAM。FLASH分成128扇區(qū),每扇區(qū)1 024 KB。MEMORY和SECTIONS命令所定義的各存儲區(qū)、包含的輸出段及存儲器空間分配情況如圖2所示。共定義4個存儲區(qū):中斷向量區(qū)“m_interrupts”、FLASH配置區(qū)“m_flash_config”、用戶程序區(qū)“m_text”和數(shù)據(jù)區(qū)“m_text”。前3個區(qū)在FLASH(本文稱為目標FLASH)中,數(shù)據(jù)區(qū)在SRAM中。其中,“m_text”區(qū)中的.text段定義如下:

      .text:

      { . = ALIGN(4); /*4 B的邊界對齊*/

      *(.text) /*非函數(shù)代碼*/

      *(.text.*) /*函數(shù)代碼*/

      *(.rodata) /*字符串等*/

      *(.rodata.*) /*數(shù)組常量等*/

      } > m_text

      鏈接腳本文件可由開發(fā)人員根據(jù)MCU應用工程的程序、數(shù)據(jù)所需空間大小及存放要求、鏈接要求等自行編寫或由開發(fā)環(huán)境生成后修改。

      1.3 機器碼系列文件的生成

      可執(zhí)行目標文件(.elf)的生成依賴于鏈接腳本文件和各個中間文件。當源文件被編譯成中間文件時,其中的各輸入段并沒有具體地址,中間文件中只是記錄了程序中所使用的各個符號和各符號在輸入段中的相對位置。只有當鏈接器根據(jù)鏈接腳本文件鏈接中間文件的各個輸入段時,各段才會根據(jù)鏈接腳本文件中所分配的地址獲得加載內(nèi)存地址LMA和虛擬內(nèi)存地址VMA[8],各個符號也才有了真實地址。再根據(jù)每一符號所對應的真實地址更新相應的指令,從而實現(xiàn)真正的函數(shù)調(diào)用和符號引用功能。通過這一重定位過程就可生成可執(zhí)行目標文件(.elf)。

      因為可執(zhí)行目標文件是二進制文件,包含程序開始執(zhí)行地址、程序頭、輸出段頭、符號表、各個輸出段、重定位信息以及調(diào)試和說明信息等并需專門工具軟件打開,可讀性差、分析不便,不是本文分析研究的對象。本文所要分析的機器碼文件是指由可執(zhí)行目標文件在KDS下經(jīng)格式轉(zhuǎn)換而生成的機器碼文件(.hex)。它是由十六進制文本組成的ASCII碼文件,已經(jīng)包含可執(zhí)行目標文件中的程序入口地址、各個輸出段等主要內(nèi)容,可讀性和結(jié)構(gòu)清晰度均較好,分析比較方便。而可執(zhí)行目標文件中的其他內(nèi)容也已經(jīng)包含在KDS下生成的列表文件(.lst)和映像文件(.map)中。

      映像文件提供了鏈接腳本文件中所定義的各個符號的地址值和各個輸入輸出段的長度及LMA,VMA地址映射信息。列表文件提供了程序開始執(zhí)行地址、程序頭、輸出段頭、符號表,以及“C代碼、匯編代碼、機器碼及存儲地址”的對應關(guān)系及LMA、常量數(shù)據(jù)等內(nèi)容,用于程序分析。

      2 機器碼文件組織結(jié)構(gòu)分析

      機器碼文件(.hex)存放了中斷向量表、FLASH配置域信息、程序機器碼、常量、初始化了的靜態(tài)變量和全局變量、程序入口地址等內(nèi)容,可直接使用串行線調(diào)試(Serial Wire Debug,SWD)技術(shù)通過下載程序下載到目標MCU中運行,比通過USBDM外部調(diào)試接口下載.elf文件方便、快捷。

      機器碼文件是由若干行符合Intel HEX文件格式的十六進制文本所構(gòu)成的ASCII文本文件,文件每一行均是一條HEX記錄,記錄分成6種不同類型,但記錄格式均相同,如表1所示。

      本文以KL25_UART應用工程的KL25_UART.hex為例進行分析,文件內(nèi)容如圖3所示。記錄中的偏移量表示當前記錄中“數(shù)據(jù)/信息區(qū)”的有效數(shù)據(jù)在裝載到目標FLASH中時的偏移地址,也只有這些數(shù)據(jù)才會被裝載到目標FLASH中,它們在FLASH中以小端方式(KL25 MCU內(nèi)部采用的存儲方式[4],即字的低字節(jié)存儲在低地址中)依次存放。

      圖3中“數(shù)據(jù)/信息區(qū)”的內(nèi)容簡要分析如下:

      (1) 中斷向量表。存放于第1~12行的記錄中。KL25有48個中斷向量,每個中斷向量占4 B,每條記錄可存放4個中斷向量,共占用12條記錄。裝載到目標FLASH中時,中斷向量表將會從偏移地址是“0x0000”處開始存放,占用(4×12)×4=192 B。

      (2) FLASH配置域。存放于第13行記錄中, 固定長度為16 B,在目標FLASH中的偏移地址是“0x0400”。

      (3) 程序和常量。存放于第14~209行中,在目標FLASH中的偏移地址是“0x0800”。

      (4) 靜態(tài)變量及全局變量。緊接著上述機器碼程序和常量后是已初始化為非0的靜態(tài)變量及全局變量,數(shù)據(jù)長度因應用工程而異。它們也會裝載到目標FLASH中,斷電后數(shù)據(jù)不會丟失。復位啟動時初始化程序會將它們拷貝到RAM中。

      (5) 其他內(nèi)容。機器碼文件倒數(shù)第2行固定為存放程序開始執(zhí)行地址的記錄,記錄類型為“0x03”,最后一行固定為文件結(jié)束記錄,記錄類型為“0x01”。

      3 機器碼文件內(nèi)容分析

      雖然機器碼文件本身提供的信息量有限,但結(jié)合.ld,.lst、,map等系列文件提供的編譯鏈接和裝載等信息,就可以全面分析該文件,以深入了解中斷向量表、芯片復位啟動過程、FLASH加密解密機制、代碼及數(shù)據(jù)的鏈接方法、定位、裝載和運行地址、空間占用情況、執(zhí)行時間、符號的處理等內(nèi)容。

      3.1 中斷向量表定位與分析

      中斷向量表位于機器碼文件的開始處,將直接裝載到目標FLASH的0x00000000地址處。因為根據(jù)芯片內(nèi)部工作機制,中斷向量表應存放于目標FLASH的0x00000000地址處即第0扇區(qū),當MCU上電啟動或復位時,將從該處取出4 B的第一表項內(nèi)容賦給堆棧指針SP,完成堆棧指針初始化工作,取出4 B的第二表項內(nèi)容賦給程序計數(shù)器PC,以便轉(zhuǎn)到相應地址處執(zhí)行芯片復位處理代碼。中斷向量表占用的空間依賴于具體MCU的中斷源數(shù)量,就目前市場上的MCU而言,最多占用1個扇區(qū),在扇區(qū)大小是1 024 KB的情況下,1個扇區(qū)可以存放=256個中斷向量,即使扇區(qū)大小是512 KB也可以存放128個中斷向量。

      中斷向量表中各個中斷向量對應的是符號值、0(表示未用)或中斷處理函數(shù)名或弱函數(shù)名,在編譯鏈接并重定位時,鏈接器會將這些符號、函數(shù)名、弱函數(shù)名更新為相應的符號值、函數(shù)、弱函數(shù)或?qū)膹姾瘮?shù)的虛擬內(nèi)存地址VMA(即運行地址)。

      中斷向量表一般在芯片啟動文件(.s)中定義,啟動文件的內(nèi)容結(jié)構(gòu)[9]如圖4所示。

      在KL25芯片啟動文件定義的中斷向量表中,序號為0的中斷向量是__StackTop(棧頂?shù)刂贩枺?,序號?的中斷向量是Reset_Handler(芯片復位處理函數(shù)),序號為29的中斷向量是UART1_IRQHandler弱函數(shù),并在中斷處理源文件中定義了對應的強函數(shù)。圖3中序號為0的中斷向量4字節(jié)組“00 30 00 20”實際表示的數(shù)據(jù)是“20 00 30 00”,正是_StackTop的值。序號為1的中斷向量4字節(jié)組“01 08 00 00”→“00 00 08 01”,其內(nèi)容減1后的值正是Reset_Handler函數(shù)的VMA,也是程序開始執(zhí)行地址。內(nèi)容減1是因為KL25的Cortex?M0+處理器的指令地址為半字對齊,即PC寄存器的最低位必須始終為0,但程序在跳轉(zhuǎn)時,PC的最低位必須被置為1,以表明內(nèi)核處于執(zhí)行16位Thumb指令的Thumb狀態(tài),而非執(zhí)行32位指令的ARM狀態(tài)[10]。序號為29的中斷向量4字節(jié)組“ED 08 00 00”→“00 00 08 ED”,其內(nèi)容減1后的值正是UART1_IRQHandler強函數(shù)的VMA。從KL25_UART.map或intflash.ld文件中可以查到_StackTop和Reset_Handler,UART1_IRQHandler等函數(shù)的VMA正是這些值。

      進而根據(jù)中斷處理函數(shù)的VMA就可在機器碼文件中相應的偏移地址(=中斷處理函數(shù)的VMA-0x00000000)處查找到其機器碼。

      3.2 FLASH配置域定位與分析

      FLASH配置域在機器碼文件中緊接著中斷向量表后存放,記錄中的偏移量對應的是目標FLASH第一扇區(qū)的開始地址。由于FLASH保護和加解密功能需擦除整個第一扇區(qū),所以該扇區(qū)剩余的空間保留著,當不用FLASH保護和加解密功能時可以存放機器碼數(shù)據(jù)。

      FLASH配置域保存了默認的FLASH保護設(shè)定及加密屬性,用于對FLASH模塊進行訪問控制,以防止某些FLASH存儲區(qū)域受意外擦除、寫入,或通過外部調(diào)試接口(如JTAG,SWD和USBDM等)訪問FLASH存儲器,但加密后通過外部調(diào)試接口仍可進行大規(guī)模的擦除操作,只是無法執(zhí)行讀取或?qū)懭隖LASH的指令。在芯片復位時,F(xiàn)LASH模塊讀取FLASH配置域相應字段信息對FLASH保護寄存器FPROT 和加密寄存器FSEC進行初始化。FLASH配置域信息如表2所示,相關(guān)寄存器內(nèi)容可見文獻[7]。

      開發(fā)者可直接對FLASH配置域字段進行改寫(先擦除整個扇區(qū),再復位芯片后寫入)以啟用/關(guān)閉加密功能,或使用封裝的加密解密函數(shù)來對配置域進行設(shè)置,但前者操作簡單直接且更為安全。

      3.3 MCU初始化代碼定位與分析

      MCU應用程序機器碼區(qū)包括芯片初始化代碼、各個函數(shù)代碼、常量、初始化為非0的靜態(tài)和全局變量等,位于機器碼文件中緊接著FLASH配置域后,首條記錄中的偏移量對應的是目標FLASH第二扇區(qū)的開始地址。應用工程不同,記錄條數(shù)和機器碼長度也不相同。由于中斷向量表第二表項存放的是MCU初始化函數(shù)Reset_Handler的VMA,所以只要計算出偏移地址(=Reset_Handler函數(shù)的VMA-0x00000000),就可方便地在機器碼文件中查找到Reset_Handler函數(shù)的機器碼。圖3中Reset_Handler函數(shù)的機器碼從記錄中偏移量是0x0800處(第14行記錄)開始存放。通過查看KL25_UART.lst文件可知,該處的機器碼“72 B6 00 F0…”→“B6 72 F0 00…”對應的是芯片啟動文件的Reset_Handler函數(shù),共占0x44 B,初始化過程見圖4。弄清MCU初始化過程后,在實際應用中,就可根據(jù)是否要啟動看門狗、是否要復制中斷向量表至RAM、是否要清零未初始化.bss段、啟動時間、是否添加監(jiān)控程序等要求來編寫或修改、優(yōu)化相關(guān)代碼,以提高系統(tǒng)的穩(wěn)定性、可靠性、靈活性。監(jiān)控程序可添加在進入main函數(shù)之前的位置處,以判斷是否有要寫入機器碼到FLASH中的命令,若有則完成寫入,這是更新用戶程序的一種簡便方法。

      3.4 函數(shù)和功能段的定位與分析

      在C函數(shù)代碼編譯成匯編指令時,編譯器自動在函數(shù)開始處添加push指令以保存函數(shù)被調(diào)用時的現(xiàn)場,如push{r7, lr},函數(shù)結(jié)束處自動添加pop指令以恢復現(xiàn)場,如pop{r7, pc}。其機器碼高位字節(jié)分別為B5,BD,低位字節(jié)與指令中使用的寄存器相關(guān),在存儲時機器碼是半字對齊并采用小端格式。這樣就可根據(jù)B5,BD來定位函數(shù)。

      (1) 用戶函數(shù)及ISR的定位。若某一存儲單元的內(nèi)容為“B5”且其偏移地址的最低位為1,則從該存儲單元的上一單元開始表示某個函數(shù)開始。其后第一個“BD”所在的存儲單元(其偏移地址的最低位必須為1)表示該函數(shù)結(jié)束。找出函數(shù)機器碼后就可直接計算其占用的存儲空間字節(jié)數(shù),更加便捷的方法是查詢.lst文件中的符號表。

      (2) 某個特定函數(shù)的定位。由于機器碼文件中沒有函數(shù)名,所以要定位特定名稱的某個函數(shù)需要借助于.lst文件進行,即根據(jù).lst文件中提供的“C代碼、匯編代碼、機器碼及存儲地址”部分的內(nèi)容,找到該函數(shù)的前幾個機器碼字節(jié),從而就可在機器碼文件中定位到函數(shù)的開始部分。

      (3) 相鄰存儲的兩函數(shù)之間的數(shù)據(jù)歸屬。如果函數(shù)中使用了字符串常數(shù)、數(shù)組常量、靜態(tài)和全局變量等數(shù)據(jù),那么它們的VMA地址將會存放到該函數(shù)最后。函數(shù)中的指令先通過相對尋址方式,從PC值與指令中給出的偏移量相加后形成的操作數(shù)地址所指向的存儲單元中取出VMA地址,再通過獲得的VMA地址訪問到所需數(shù)據(jù)。其余常量直接轉(zhuǎn)換成指令中的立即數(shù)存放于機器碼中。

      (4) 功能段的定位。特定的C語言功能段代碼對應的機器碼可以直接在.lst文件中查找到,據(jù)此就可在機器碼文件中定位,并可很方便地計算其占用的存儲空間字節(jié)數(shù)。計算執(zhí)行時間時可根據(jù)對應的匯編指令及內(nèi)核參考手冊上提供的指令執(zhí)行周期進行精確計算[11]。

      定位到函數(shù)或功能段后就可修改其代碼,或動態(tài)在線更新目標FLASH中的相應代碼。要實現(xiàn)動態(tài)更新功能,可以在編程時在main的永久循環(huán)中添加監(jiān)控代碼,以判斷是否有要寫入機器碼到FLASH中的命令,若有則完成寫入。

      3.5 常量、靜態(tài)和全局變量的定位與分析

      字符串常數(shù)、數(shù)組常量等在機器碼文件中的存放位置取決于.ld文件中對.text段的定義,在本文中,它們集中存放于機器碼的后面,而其余常量將其值以立即數(shù)形式直接存放于指令中。要確定某個特定常量的存放位置,可從.lst文件的最后內(nèi)容中先查找到該常量的存放地址,再到機器碼文件中精確定位。

      根據(jù)鏈接腳本文件,未初始化或初始化為0的靜態(tài)和全局變量存放于RAM中.data段后的.bss內(nèi)存區(qū)域中,但.bss段不占機器碼文件空間和目標FLASH空間,只占運行時的RAM空間。而.data段中包含的初始化為非0的靜態(tài)和全局變量占用機器碼文件空間、目標FLASH空間和運行時的RAM空間,斷電后初始化數(shù)據(jù)能保存。

      在機器碼文件中,初始化為非0的靜態(tài)和全局變量緊接著機器碼和常量的后面存放。從.lst文件中可以查看到它們的LMA和占用空間,據(jù)此可在機器碼文件中精確定位到特定的變量,并可計算出FLASH剩余空間的起始地址。定位到常量、靜態(tài)和全局變量后,可根據(jù)需要修改其值或通過監(jiān)控程序動態(tài)在線更新目標FLASH中的相應值。FLASH剩余空間可用于存放其他數(shù)據(jù),如系統(tǒng)參數(shù)等,同樣可實現(xiàn)動態(tài)在線更新。

      4 結(jié) 語

      本文在對ARM Cortex?M0+機器碼文件的生成機制、組織結(jié)構(gòu)和內(nèi)容進行深入剖析的基礎(chǔ)上,結(jié)合機器碼系列文件提供的信息,系統(tǒng)地給出了中斷向量表、FLASH配置域、初始化代碼、函數(shù)和常量、全局或靜態(tài)變量等內(nèi)容在機器碼文件中的定位與分析方法,使得對機器碼文件的分析變得簡明快捷。開發(fā)人員可以將分析結(jié)果應用于MCU深層次應用開發(fā)工作中,如編寫或修改鏈接腳本文件及芯片復位啟動程序、精確計算代碼執(zhí)行時間和占用的存儲空間、添加監(jiān)控代碼、優(yōu)化及動態(tài)更新程序和數(shù)據(jù)、設(shè)計機器碼下載軟件等,以充分利用MCU有限的資源,提高系統(tǒng)的可靠性、穩(wěn)定性、健壯性。

      參考文獻

      [1] 廉玉龍,史崢,李春強,等.基于C.SKY CPU的地址立即數(shù)編譯優(yōu)化方法[J].計算機工程,2016,42(1):46?50.

      [2] 胡宗棠,王宜懷,沈忱.面向MC1321X的低開銷無線重編程機制的研究與設(shè)計[J].計算機應用與軟件,2014,31(12):272?277.

      [3] 王宜懷,朱仕浪,郭蕓.嵌入式技術(shù)基礎(chǔ)與實踐[M].3版.北京:清華大學出版社,2013:86?87.

      [4] STANKIC M, CETIC N, KRNJETIN M, et al. Graphical tool for generating linker configuration files in embedded systems [C]// Proceedings of 2011 19th Telecommunications Forum. [S.l.: s.n.], 2011: 1550?1553.

      [5] ARM. Armlink user guide [DB/OL]. (2016?03?31) [2016?05?15]. http://infocenter.arm.com/help/.

      [6] Free Software Foundation. Documentation for binutils 2.26 [DB/OL]. (2016?01?25) [2016?05?15]. https://sourceware.org/binutils/docs?2.26/ld/.

      [7] NXP. KL25 Sub?family reference manual [DB/OL]. (2014?09?01) [2016?05?15]. http://www.nxp.com/.

      [8] 胡敏,盧永江,劉兵.基于CK810處理器的匯編鏈接時優(yōu)化[J].計算機工程,2014,40(11):250?254.

      [9] NXP. Kinetis assembler reference manual [DB/OL]. (2014?02?01) [2016?05?15]. http://www.nxp.com/.

      [10] JOESEP Yiu.ARM?Cortex?M0權(quán)威指南[M].吳常玉,譯.北京:清華大學出版社,2013:52?53.

      [11] ARM. Cortex?M0+ Processor technical reference manual [DB/OL]. (2012?12?16) [2016?05?15]. http://infocenter.arm.

      廊坊市| 丘北县| 广安市| 秦安县| 牟定县| 韩城市| 湾仔区| 法库县| 杂多县| 香港| 时尚| 南澳县| 吴堡县| 商都县| 云安县| 曲靖市| 丰城市| 汉源县| 利川市| 凉城县| 开鲁县| 呼伦贝尔市| 哈巴河县| 巴南区| 高青县| 繁昌县| 汾西县| 梁山县| 剑河县| 赤峰市| 广西| 陇川县| 大城县| 康马县| 加查县| 津南区| 沁阳市| 邢台县| 潼南县| 曲阜市| 关岭|