国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

電子工程網

標題: 怎么看待啟動程序 [打印本頁]

作者: feiante    時間: 2009-8-10 14:04
標題: 怎么看待啟動程序
我剛接觸ARM,發現它還有一個叫啟動程序的東西,我想問問怎么來看待這個,如果換芯片以后是不是要自己來寫?
作者: 阿南    時間: 2009-8-10 15:25
不需要自己寫,原廠或第三方會做,你要分析理解它
作者: feiante    時間: 2009-8-11 08:16
通過看什么可以理解它?是不是應用不同的功能,要修改或添加相應的啟動程序?它與boot有什么區別?
作者: 阿南    時間: 2009-8-11 09:02
一步步分析源代碼。通常指的boot是一個完整功能的應用程序,通常是用來裝載或引導操作系統(或其它應用程序的),而啟動代碼是任何一個應用程序,當然也包括boot的一部分,他的目的是上電之后初始化處理器硬件,使其它后續的程序能夠正常運行。
作者: feiante    時間: 2009-8-11 15:05
哦,原來是這樣,但是我想知道讀懂或者說分析啟動程序的基礎是什么,或者說必須要先看懂什么,才能讀懂啟動代碼?還有就是這么知道哪些需要有,哪些可以不寫(我理解是沒有用到的功能可以不寫)。總之就一句話,讀懂啟動代碼的基礎是什么呢?
作者: 阿南    時間: 2009-8-12 13:29
摸著石頭過河
作者: machunshui    時間: 2009-8-12 14:15
發一個winarm編譯器的lpc2000啟動文件,感覺寫的非常清晰.  

      .global main                    // int main(void)

        .global _etext                  // -> .data initial values in ROM
        .global _data                   // -> .data area in RAM
        .global _edata                  // end of .data area
        .global __bss_start             // -> .bss area in RAM
        .global __bss_end__             // end of .bss area
        .global _stack                  // top of stack

// Stack Sizes
        .set  UND_STACK_SIZE, 0x00000004
        .set  ABT_STACK_SIZE, 0x00000004
        .set  FIQ_STACK_SIZE, 0x00000004
        .set  IRQ_STACK_SIZE, 0X00000080
        .set  SVC_STACK_SIZE, 0x00000004

// Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs
        .set  MODE_USR, 0x10            // User Mode
        .set  MODE_FIQ, 0x11            // FIQ Mode
        .set  MODE_IRQ, 0x12            // IRQ Mode
        .set  MODE_SVC, 0x13            // Supervisor Mode
        .set  MODE_ABT, 0x17            // Abort Mode
        .set  MODE_UND, 0x1B            // Undefined Mode
        .set  MODE_SYS, 0x1F            // System Mode

        .equ  I_BIT, 0x80               // when I bit is set, IRQ is disabled
        .equ  F_BIT, 0x40               // when F bit is set, FIQ is disabled

        .text
        .code 32
        .align 2

        .global _boot
        .func   _boot
_boot:

// Runtime Interrupt Vectors
// -------------------------
Vectors:
        b     _start                    // reset - _start
        ldr   pc,_undf                  // undefined - _undf
        ldr   pc,_swi                   // SWI - _swi
        ldr   pc,_pabt                  // program abort - _pabt
        ldr   pc,_dabt                  // data abort - _dabt
        nop                             // reserved
        ldr   pc,[pc,#-0xFF0]           // IRQ - read the VIC
        ldr   pc,_fiq                   // FIQ - _fiq

#if 0
// Use this group for production
_undf:  .word _reset                    // undefined - _reset
_swi:   .word _reset                    // SWI - _reset
_pabt:  .word _reset                    // program abort - _reset
_dabt:  .word _reset                    // data abort - _reset
_irq:   .word _reset                    // IRQ - _reset
_fiq:   .word _reset                    // FIQ - _reset

#else
// Use this group for development
_undf:  .word __undf                    // undefined
_swi:   .word __swi                     // SWI
_pabt:  .word __pabt                    // program abort
_dabt:  .word __dabt                    // data abort
_irq:   .word __irq                     // IRQ
_fiq:   .word __fiq                     // FIQ

__undf: b     .                         // undefined
__swi:  b     .                         // SWI
__pabt: b     .                         // program abort
__dabt: b     .                         // data abort
__irq:  b     .                         // IRQ
__fiq:  b     .                         // FIQ
#endif
        .size _boot, . - _boot
        .endfunc


// Setup the operating mode & stack.
// ---------------------------------
        .global _start, start, _mainCRTStartup
        .func   _start

_start:
start:
_mainCRTStartup:

// Initialize Interrupt System
// - Set stack location for each mode
// - Leave in System Mode with Interrupts Disabled
// -----------------------------------------------
        ldr   r0,=_stack
        msr   CPSR_c,#MODE_UND|I_BIT|F_BIT // Undefined Instruction Mode
        mov   sp,r0
        sub   r0,r0,#UND_STACK_SIZE
        msr   CPSR_c,#MODE_ABT|I_BIT|F_BIT // Abort Mode
        mov   sp,r0
        sub   r0,r0,#ABT_STACK_SIZE
        msr   CPSR_c,#MODE_FIQ|I_BIT|F_BIT // FIQ Mode
        mov   sp,r0
        sub   r0,r0,#FIQ_STACK_SIZE
        msr   CPSR_c,#MODE_IRQ|I_BIT|F_BIT // IRQ Mode
        mov   sp,r0
        sub   r0,r0,#IRQ_STACK_SIZE
        msr   CPSR_c,#MODE_SVC|I_BIT|F_BIT // Supervisor Mode
        mov   sp,r0
        sub   r0,r0,#SVC_STACK_SIZE
        msr   CPSR_c,#MODE_SYS|I_BIT|F_BIT // System Mode
        mov   sp,r0

// Copy initialized data to its execution address in RAM
// -----------------------------------------------------
#ifdef ROM_RUN
        ldr   r1,=_etext                // -> ROM data start
        ldr   r2,=_data                 // -> data start
        ldr   r3,=_edata                // -> end of data
1:      cmp   r2,r3                     // check if data to move
        ldrlo r0,[r1],#4                // copy it
        strlo r0,[r2],#4
        blo   1b                        // loop until done
#endif
// Clear .bss
// ----------
        mov   r0,#0                     // get a zero
        ldr   r1,=__bss_start           // -> bss start
        ldr   r2,=__bss_end__           // -> bss end
2:      cmp   r1,r2                     // check if data to clear
        strlo r0,[r1],#4                // clear 4 bytes
        blo   2b                        // loop until done

// Call main program: main(0)
// --------------------------
        mov   r0,#0                     // no arguments (argc = 0)
        mov   r1,r0
        mov   r2,r0
        mov   fp,r0                     // null frame pointer
        mov   r7,r0                     // null frame pointer for thumb
        ldr   r10,=main
        mov   lr,pc
        bx    r10                       // enter main()

        .size   _start, . - _start
        .endfunc

        .global _reset, reset, exit, abort
        .func   _reset
_reset:
reset:
exit:
abort:
#if 0
// Disable interrupts, then force a hardware reset by driving P23 low
// -------------------------------------------------------------------
        mrs   r0,cpsr                   // get PSR
        orr   r0,r0,#I_BIT|F_BIT        // disable IRQ and FIQ
        msr   cpsr,r0                   // set up status register

        ldr   r1,=(PS_BASE)             // PS Base Address
        ldr   r0,=(PS_PIO)              // PIO Module
        str   r0,[r1,#PS_PCER_OFF]      // enable its clock
        ldr   r1,=(PIO_BASE)            // PIO Base Address
        ldr   r0,=(1<<23)               // P23
        str   r0,[r1,#PIO_PER_OFF]      // make sure pin is contolled by PIO
        str   r0,[r1,#PIO_CODR_OFF]     // set the pin low
        str   r0,[r1,#PIO_OER_OFF]      // make it an output
#endif
        b     .                         // loop until reset

        .size _reset, . - _reset
        .endfunc

        .end
作者: machunshui    時間: 2009-8-12 14:19
本帖最后由 machunshui 于 2009-8-12 14:26 編輯

就干了幾件事:

1.填寫中斷向量表
2.為使用C語言設置各種模式下的堆棧
3.拷貝已經初始化的全局變量數據到RAM,清零未初始化數據
4.跳轉到C語言下的MAIN()函數
作者: machunshui    時間: 2009-8-12 14:21
能讀懂啟動文件的基礎是能理解arm指令,
了解常見的偽指令,
理解啟動文件做哪些事情
作者: diwangwgl    時間: 2010-10-23 23:02
呵呵,還是有點不懂




歡迎光臨 電子工程網 (http://m.qingdxww.cn/) Powered by Discuz! X3.4
主站蜘蛛池模板: 日韩精品亚洲专区在线电影不卡 | 国产高清超清在线播放| 飘雪在线观看免费高清完整版韩国 | 麻豆AV久久AV盛宴AV| 亚洲欧美日产综合在线看| 一级毛片牲交大片| 亚洲国产日韩在线观频| 无套白浆| 中文字幕不卡在线| 女教师跟黑人男朋友激情过后| 午夜精品在线视频| 日本高清在线播放| 亚洲福利在线观看| 伊人久久国产精品| 国产精品资源在线观看网站| 妻子+免费观看完整| 亚洲人成a在线网站| 日韩在线免费视频| 中文字幕日韩在线一区国内| 澡堂同性老头gay老头| 玛雅成人网| 欧美一区二区三区视视频| 欧美一区日韩一区中文字幕页| 午夜视频在线观看www中文| 呜嗯啊野战h呻吟男男双性| 成人片在线播放| 亚洲H成年动漫在线观看不卡| 视色4se成人午夜精品| 亚洲欧美日韩成人网| 中文日产幕无线码一区| 欧美亚洲国产手机在线有码| 亚洲琪琪| 五月婷婷综合色| 伊人精品在线| 免费在线a| 日韩专区视频| 三级黄色在线视频中文| 亚洲国产一区二区三区a毛片| 国产女合集小岁9三部| 亚洲 欧美 国产 综合久久| 亚洲九九精品|