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

查看: 5778|回復(fù): 9
打印 上一主題 下一主題

怎么看待啟動程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2009-8-10 14:04:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關(guān)鍵詞: 程序
我剛接觸ARM,發(fā)現(xiàn)它還有一個叫啟動程序的東西,我想問問怎么來看待這個,如果換芯片以后是不是要自己來寫?
沙發(fā)
發(fā)表于 2009-8-10 15:25:09 | 只看該作者
不需要自己寫,原廠或第三方會做,你要分析理解它
板凳
 樓主| 發(fā)表于 2009-8-11 08:16:30 | 只看該作者
通過看什么可以理解它?是不是應(yīng)用不同的功能,要修改或添加相應(yīng)的啟動程序?它與boot有什么區(qū)別?
地板
發(fā)表于 2009-8-11 09:02:39 | 只看該作者
一步步分析源代碼。通常指的boot是一個完整功能的應(yīng)用程序,通常是用來裝載或引導(dǎo)操作系統(tǒng)(或其它應(yīng)用程序的),而啟動代碼是任何一個應(yīng)用程序,當然也包括boot的一部分,他的目的是上電之后初始化處理器硬件,使其它后續(xù)的程序能夠正常運行。
地下室
 樓主| 發(fā)表于 2009-8-11 15:05:31 | 只看該作者
哦,原來是這樣,但是我想知道讀懂或者說分析啟動程序的基礎(chǔ)是什么,或者說必須要先看懂什么,才能讀懂啟動代碼?還有就是這么知道哪些需要有,哪些可以不寫(我理解是沒有用到的功能可以不寫)?傊鸵痪湓挘x懂啟動代碼的基礎(chǔ)是什么呢?
6
發(fā)表于 2009-8-12 13:29:44 | 只看該作者
摸著石頭過河
7
發(fā)表于 2009-8-12 14:15:00 | 只看該作者
發(fā)一個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
8
發(fā)表于 2009-8-12 14:19:28 | 只看該作者
本帖最后由 machunshui 于 2009-8-12 14:26 編輯

就干了幾件事:

1.填寫中斷向量表
2.為使用C語言設(shè)置各種模式下的堆棧
3.拷貝已經(jīng)初始化的全局變量數(shù)據(jù)到RAM,清零未初始化數(shù)據(jù)
4.跳轉(zhuǎn)到C語言下的MAIN()函數(shù)
9
發(fā)表于 2009-8-12 14:21:26 | 只看該作者
能讀懂啟動文件的基礎(chǔ)是能理解arm指令,
了解常見的偽指令,
理解啟動文件做哪些事情
10
發(fā)表于 2010-10-23 23:02:30 | 只看該作者
呵呵,還是有點不懂
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产成人久久精品动漫 | 国产视频网站在线 | 中文字幕日韩精品一区口 | 自拍视频在线观看完整版 | 国产亚洲精品不卡在线 | 国产黄色小视频在线观看 | 国内精品七七久久影院 | 欧洲色网 | 国产真实乱对白精彩 | 99爱在线视频 | 精品国产高清露脸在线观看 | 四虎永久在线精品网址 | 在线观看精品一区 | 91香蕉视频在线观看免费 | 全彩acg★无翼乌火影忍者 | 国产日韩精品一区二区在线观看 | 91精品综合国产在线观看 | 国产亚洲人成网站天堂岛 | 理论片免费欧美片 | 免费污网站在线观看 | 九九视频热 | 四虎永久免费884hutv | 99久久精品免费观看区一 | 国产精品嫩模在线播放 | 一级毛片成人免费看免费不卡 | 手机看片久久国产免费不卡 | 中文字幕日韩精品一区口 | 久久久久免费精品视频 | 久久精品小视频 | 亚洲日本中文字幕区 | 成人精品视频在线观看播放 | 欧美国产亚洲一区二区三区 | 亚洲视频在线观看 | 51国产午夜精品免费视频 | 岛国视频在线免费观看 | qvod经典视频在线播放 | 国产成人亚洲综合在线 | 国产毛片在线看 | 免看一级一片一在线看 | 亚洲视频在线免费看 | 动漫精品一区二区3d |