基于TQ2440的ARM启动代码注释分析(基于MDK).docx

上传人:西安人 文档编号:5020759 上传时间:2020-01-29 格式:DOCX 页数:16 大小:20.39KB
返回 下载 相关 举报
基于TQ2440的ARM启动代码注释分析(基于MDK).docx_第1页
第1页 / 共16页
基于TQ2440的ARM启动代码注释分析(基于MDK).docx_第2页
第2页 / 共16页
基于TQ2440的ARM启动代码注释分析(基于MDK).docx_第3页
第3页 / 共16页
基于TQ2440的ARM启动代码注释分析(基于MDK).docx_第4页
第4页 / 共16页
基于TQ2440的ARM启动代码注释分析(基于MDK).docx_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《基于TQ2440的ARM启动代码注释分析(基于MDK).docx》由会员分享,可在线阅读,更多相关《基于TQ2440的ARM启动代码注释分析(基于MDK).docx(16页珍藏版)》请在三一文库上搜索。

1、;/*/;/* S3C2440A.S: Startup file for Samsung S3C440A */;/* This file is part of the uVision/ARM development tools. */;/* Copyright (c) 2005-2006 Keil Software. All rights reserved. */;/* This software may only be used under the terms of a valid, current, */;/* end user licence from KEIL for a compat

2、ible version of KEIL software */;/* development tools. Nothing else gives you the right to use this software. */;/*/;elementary avocationA (rework:2008.09.24更新);*启动代码(执行复位后)* ; Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs/;向量中断模式/非向量中断模式 在PSRs设置(猜的); 系统的工作模式设定Mode_USR EQU 0x

3、10 ; 定义用户模式标志代码;/ 用户模式的CPSR代码 Mode_FIQ EQU 0x11 ; 定义快速中断模式标志代码;/ 快中断模式的CPSR代码Mode_IRQ EQU 0x12 ; 定义普通中断模式标志代码;/ 中断模式的CPSR代码Mode_SVC EQU 0x13 ; 定义管理模式标志代码;/ 管理模式的CPSR代码Mode_ABT EQU 0x17 ; 定义中止模式标志代码;/ 中止模式的CPSR代码Mode_UND EQU 0x1B ; 定义未定义模式标志代码 ;/ 未定义模式的CPSR代码Mode_SYS EQU 0x1F ; 定义系统模式(特权模式)标志代码;/ 系统(

4、特权)模式的CPSR代码I_Bit EQU 0x80 ;/ 普通中断开关(080:打开;000:关闭)F_Bit EQU 0x40 ;/ 快速中断开关(040:打开;000:关闭);/栈配置();系统的栈空间设定UND_Stack_Size EQU 0x00000000 ;未定义 SVC_Stack_Size EQU 0x00000008 ;管理模式端栈长度ABT_Stack_Size EQU 0x00000000 ;中止模式端栈长度FIQ_Stack_Size EQU 0x00000000 ;快速中断模式端栈长度IRQ_Stack_Size EQU 0x00000080 ;普通中断模式模式端

5、栈长度USR_Stack_Size EQU 0x00000400 ;用户模端栈长度;/ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + FIQ_Stack_Size + IRQ_Stack_Size);所有的堆栈大小进行相加,得到总堆栈大小/*;/arm的汇编程序由段组成,段是相对独立的指令或数据单位,每个段由AREA伪指令定义,并定义段的属性:;/READWRITE(读写)READONLY(只读)*/AREA STACK, NOINIT, READWRITE, ALIGN=3 ;开辟端栈段,段名(ST

6、ACK)定义为可读可写,不初始化内存单元或将内存写0,字节对齐Stack_Mem SPACE USR_Stack_Size ;/申请栈内存空间_initial_sp SPACE ISR_Stack_SizeStack_Top EQU Stack_Mem + ISR_Stack_Size ;/定义堆栈开始地址(最大地址,堆栈向下访问);/堆配置;/堆大小 (单位字节)/Heap_Size EQU 0x00000000 ;系统的堆空间设定/定义堆空间大小(配合最后的动态内存申请使用)AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;/段名(HEAP)声明堆代码段(不初始

7、化内存,可读写,字节对齐)Heap_Mem SPACE Heap_Size ;/申请堆的内存空间;时钟管理定义CLK_BASE EQU 0x4C000000 ; 时钟基地址 LOCKTIME_OFS EQU 0x00 ; PLL锁定时间计数器对应基地址的偏移值MPLLCON_OFS EQU 0x04 ; MPLL控制 对应基地址的偏移值/认为MPLL分出三种模式:FCLK、HCLK、PCLKUPLLCON_OFS EQU 0X08 ; UPLL控制 对应基地址的偏移值/用于USB设备CLKCON_OFS EQU 0x0C ; 时钟生成控制 对应基地址的偏移值CLKSLOW_OFS EQU 0x

8、10 ; 慢时钟控制 对应基地址的偏移值CLKDIVN_OFS EQU 0X14 ; 时钟除法器控制 对应基地址的偏移值CAMDIVN_OFS EQU 0X18 ; 摄象时钟除法器控制 对应基地址的偏移值/UPLL提供CLOCK_SETUP EQU 1 ; 时钟设置LOCKTIME_Val EQU 0x0FFF0FFF ; PLL锁定时间计数器 值MPLLCON_Val EQU 0x00043011 ; MPLL控制 值UPLLCON_Val EQU 0x00038021 ; UPLL控制 值CLKCON_Val EQU 0x001FFFF0 ; 时钟生成控制 值CLKSLOW_Val EQU

9、 0x00000004 ; 慢时钟控制 值CLKDIVN_Val EQU 0x0000000F ; 时钟除法器控制 值CAMDIVN_Val EQU 0x00000000 ; 摄象时钟除法器控制 值;Interrupt definitions ;中断定义INTOFFSET EQU 0X4A000014 ;中断请求源偏移 地址;/中断向量表;/ 中断向量地址 ;/ 中断向量表地址必须字对齐 ;/ IntVT_SETUP EQU 1 ;中断向量设置IntVTAddress EQU 0x33ffff20 ;中断向量地址;- 存储器设定 -IRAM_BASE EQU 0x40000000 ; /内存基

10、地址; /看门狗定义WT_BASE EQU 0x53000000 ; 看门狗基地址WTCON_OFS EQU 0x00 ; 看门狗控制 对应基地址的偏移值WTDAT_OFS EQU 0x04 ; 看门狗数据 对应基地址的偏移值WTCNT_OFS EQU 0x08 ; 看门狗记数 对应基地址的偏移值WT_SETUP EQU 1 ; 看门狗设置WTCON_Val EQU 0x00000000 ; 看门狗控制WTDAT_Val EQU 0x00008000 ; 看门狗数据; 存储控制器设定MC_BASE EQU 0x48000000 ; 存储控制器基地址MC_SETUP EQU 0 ; 存储控制器设

11、定BWSCON_Val EQU 0x22000000 ;总线宽度和等待控制BANKCON0_Val EQU 0x00000700 ;Boot ROM 控制BANKCON1_Val EQU 0x00000700 ;BANK1 控制BANKCON2_Val EQU 0x00000700 ;BANK2 控制BANKCON3_Val EQU 0x00000700 ;BANK3 控制BANKCON4_Val EQU 0x00000700 ;BANK4 控制BANKCON5_Val EQU 0x00000700 ;BANK5 控制BANKCON6_Val EQU 0x00018005 ;BANK6 控制B

12、ANKCON7_Val EQU 0x00018005 ;BANK7 控制REFRESH_Val EQU 0x008404F3 ;DRAM/SDRAM 刷新 控制BANKSIZE_Val EQU 0x00000032 ;存储器大小 控制MRSRB6_Val EQU 0x00000020 ;SDRAM 的模式设置寄存器 控制MRSRB7_Val EQU 0x00000020 ;SDRAM 的模式设置寄存器 控制; 存储控制器设定结束; I/O 口设定PIO_BASE EQU 0x56000000 ; 端口基地址PCONA_OFS EQU 0x00 ; 端口A控制 对应基地址的偏移值PCONB_OF

13、S EQU 0x10 ; 端口B控制 对应基地址的偏移值PCONC_OFS EQU 0x20 ; 端口C控制 对应基地址的偏移值PCOND_OFS EQU 0x30 ; 端口D控制 对应基地址的偏移值PCONE_OFS EQU 0x40 ; 端口E控制 对应基地址的偏移值PCONF_OFS EQU 0x50 ; 端口F控制 对应基地址的偏移值PCONG_OFS EQU 0x60 ; 端口G控制 对应基地址的偏移值PCONH_OFS EQU 0x70 ; 端口H控制 对应基地址的偏移值PCONJ_OFS EQU 0xD0 ; 端口J控制 对应基地址的偏移值PUPB_OFS EQU 0x18 ;

14、端口B上拉控制 对应基地址的偏移值PUPC_OFS EQU 0x28 ; 端口C上拉控制 对应基地址的偏移值PUPD_OFS EQU 0x38 ; 端口D上拉控制 对应基地址的偏移值PUPE_OFS EQU 0x48 ; 端口E上拉控制 对应基地址的偏移值PUPF_OFS EQU 0x58 ; 端口F上拉控制 对应基地址的偏移值PUPG_OFS EQU 0x68 ; 端口G上拉控制 对应基地址的偏移值PUPH_OFS EQU 0x78 ; 端口H上拉控制 对应基地址的偏移值PUPJ_OFS EQU 0xD8 ; 端口J上拉控制 对应基地址的偏移值;-端口 配置-PIO_SETUP EQU 0;

15、端口APIOA_SETUP EQU 0PCONA_Val EQU 0x000003FF;端口BPIOB_SETUP EQU 0PCONB_Val EQU 0x00000000 ;PUPB_Val EQU 0x00000000 ;端口B上拉开启;端口CPIOC_SETUP EQU 1PCONC_Val EQU 0x00001401 ;PUPC_Val EQU 0x00000000 ;端口C上拉开启;端口DPIOD_SETUP EQU 0PCOND_Val EQU 0x00000000 ;PUPD_Val EQU 0x00000000 ;端口D上拉开启;端口EPIOE_SETUP EQU 0PCO

16、NE_Val EQU 0x00000000 ;PUPE_Val EQU 0x00000000 ;端口E上拉开启;端口FPIOF_SETUP EQU 0PCONF_Val EQU 0x00000000 ;PUPF_Val EQU 0x00000000 ;端口F上拉开启;端口GPIOG_SETUP EQU 0PCONG_Val EQU 0x00000000 ;PUPG_Val EQU 0x00000000 ;端口G上拉开启;端口HPIOH_SETUP EQU 0PCONH_Val EQU 0x000007FFPUPH_Val EQU 0x00000000 ;端口H上拉开启;端口JPIOJ_SETU

17、P EQU 0PCONJ_Val EQU 0x00000000 ;PUPJ_Val EQU 0x00000000 ;端口J上拉开启; 汇编程序数据 8 字节对齐PRESERVE8 ;c和汇编有8位对齐的要求,这个伪指令可以满足此要求;/存储区设定和程序入口点;/启动代码必须连接到第一个地址才能运行。AREA RESET, CODE, READONLY ;/开辟端栈段,段名(RESET)定义RESET代码段为只读ARM ;/ARM 模式运行程序;/异常向量;/影射到地址0;/必须使用,绝对寻址方式。;/虚处理(子程序)是用一个无限循环实现的, 它是可修改的./(11942295)翻译Vector

18、s LDR PC, Reset_Addr ; 复位 LDR PC, Undef_Addr ; 未定义指令LDR PC, SWI_Addr ; 软件中断LDR PC, PAbt_Addr ; 中止(预取)LDR PC, DAbt_Addr ; 中止(数据)NOP ; 保留向量 LDR PC, IRQ_Addr ; 普通LDR PC, FIQ_Addr ; 快速中断IF IntVT_SETUP 0;/中断向量表地址 HandleEINT0 EQU IntVTAddress HandleEINT1 EQU IntVTAddress +4HandleEINT2 EQU IntVTAddress +4*

19、2HandleEINT3 EQU IntVTAddress +4*3HandleEINT4_7 EQU IntVTAddress +4*4HandleEINT8_23 EQU IntVTAddress +4*5HandleCAM EQU IntVTAddress +4*6HandleBATFLT EQU IntVTAddress +4*7HandleTICK EQU IntVTAddress +4*8HandleWDT EQU IntVTAddress +4*9HandleTIMER0 EQU IntVTAddress +4*10HandleTIMER1 EQU IntVTAddress +4

20、*11HandleTIMER2 EQU IntVTAddress +4*12HandleTIMER3 EQU IntVTAddress +4*13HandleTIMER4 EQU IntVTAddress +4*14HandleUART2 EQU IntVTAddress +4*15HandleLCD EQU IntVTAddress +4*16HandleDMA0 EQU IntVTAddress +4*17HandleDMA1 EQU IntVTAddress +4*18HandleDMA2 EQU IntVTAddress +4*19HandleDMA3 EQU IntVTAddress

21、 +4*20HandleMMC EQU IntVTAddress +4*21HandleSPI0 EQU IntVTAddress +4*22HandleUART1 EQU IntVTAddress +4*23HandleNFCON EQU IntVTAddress +4*24HandleUSBD EQU IntVTAddress +4*25HandleUSBH EQU IntVTAddress +4*26HandleIIC EQU IntVTAddress +4*27HandleUART0 EQU IntVTAddress +4*28HandleSPI1 EQU IntVTAddress +

22、4*39HandleRTC EQU IntVTAddress +4*30HandleADC EQU IntVTAddress +4*31IRQ_Entrysub sp,sp,#4 ;/保留PC值stmfd sp!,r8-r9ldr r9,=INTOFFSETldr r9,r9ldr r8,=HandleEINT0add r8,r8,r9,lsl #2ldr r8,r8str r8,sp,#8ldmfd sp!,r8-r9,pc ENDIFReset_Addr DCD Reset_Handler ;定义中断的入口地址; 以Reset_Addr为Reset_Handler分配一段字对齐的内存单元U

23、ndef_Addr DCD Undef_Handler ; 注:应该是将CODE映射(复制)到RAM的开始地址SWI_Addr DCD SWI_HandlerPAbt_Addr DCD PAbt_HandlerDAbt_Addr DCD DAbt_HandlerDCD 0 ;/保留地址 IRQ_Addr DCD IRQ_HandlerFIQ_Addr DCD FIQ_HandlerUndef_Handler B Undef_Handler ;中断处理程序的入口地址/B为跳转指令| ?自己跳转到自己?SWI_Handler B SWI_HandlerPAbt_Handler B PAbt_Han

24、dlerDAbt_Handler B DAbt_HandlerIF IntVT_SETUP 1IRQ_Handler B IRQ_HandlerENDIFIF IntVT_SETUP 0IRQ_Handler B IRQ_EntryENDIFFIQ_Handler B FIQ_Handler;/存储控制器配制 IF MC_SETUP 0MC_CFGDCD BWSCON_ValDCD BANKCON0_ValDCD BANKCON1_ValDCD BANKCON2_ValDCD BANKCON3_ValDCD BANKCON4_ValDCD BANKCON5_ValDCD BANKCON6_Va

25、lDCD BANKCON7_ValDCD REFRESH_ValDCD BANKSIZE_ValDCD MRSRB6_ValDCD MRSRB7_ValENDIF;/时钟管理配置IF CLOCK_SETUP 0CLK_CFGDCD LOCKTIME_Val DCD CLKDIVN_Val DCD UPLLCON_Val DCD MPLLCON_Val DCD CLKSLOW_Val DCD CLKCON_Val DCD CAMDIVN_Val ENDIF ;/I/O 配置IF PIO_SETUP 0PIOA_CFG DCD PCONA_ValPIOB_CFG DCD PCONB_ValDCD

26、PUPB_ValPIOC_CFG DCD PCONC_ValDCD PUPC_ValPIOD_CFG DCD PCOND_ValDCD PUPD_ValPIOE_CFG DCD PCONE_ValDCD PUPE_ValPIOF_CFG DCD PCONF_ValDCD PUPF_ValPIOG_CFG DCD PCONG_ValDCD PUPG_ValPIOH_CFG DCD PCONH_ValDCD PUPH_ValPIOJ_CFG DCD PCONJ_ValDCD PUPJ_ValENDIF; /复位处理模块;/下面是重起时的中断处理函数EXPORT Reset_Handler ;/定义

27、一个全局函数名变量Reset_Handler IF WT_SETUP 0 ;/看门狗处理;若WT_SETUP为1,则执行下一个语句LDR R0, =WT_BASELDR R1, =WTCON_ValLDR R2, =WTDAT_ValSTR R2, R0, #WTCNT_OFSSTR R2, R0, #WTDAT_OFSSTR R1, R0, #WTCON_OFSENDIFIF CLOCK_SETUP 0 ;/时钟处理;若CLOCK_SETUP为1,则执行下一个语句 LDR R0, =CLK_BASE ADR R8, CLK_CFGLDMIA R8, R1-R7 STR R1, R0, #LO

28、CKTIME_OFSSTR R2, R0, #CLKDIVN_OFS STR R3, R0, #UPLLCON_OFS nopnopnopnopnopnopnopSTR R4, R0, #MPLLCON_OFS STR R5, R0, #CLKSLOW_OFSSTR R6, R0, #CLKCON_OFSSTR R7, R0, #CAMDIVN_OFSENDIF IF MC_SETUP 0 ;/存储控制器处理;若MC_SETUP为1,则执行下一个语句ADR R13, MC_CFGLDMIA R13, R0-R12LDR R13, =MC_BASESTMIA R13, R0-R12ENDIF I

29、F PIO_SETUP 0 ;/IO处理;若PIO_SETUP为1,则执行下一个语句LDR R13, =PIO_BASEIF PIOA_SETUP 0 ;/端口A处理;若PIOA_SETUP为1,则执行下一个语句 ADR R0, PIOA_CFGSTR R0, R13, #PCONA_OFSENDIFIF PIOB_SETUP 0 ;/端口B处理 ADR R0, PIOB_CFGLDR R1, R0,#4STR R0, R13, #PCONB_OFSSTR R1, R13, #PUPB_OFSENDIFIF PIOC_SETUP 0 ;/端口C处理ADR R0, PIOC_CFGLDR R1,

30、 R0,#4STR R0, R13, #PCONC_OFSSTR R1, R13, #PUPC_OFSENDIFIF PIOD_SETUP 0 ;/端口D处理ADR R0, PIOD_CFGLDR R1, R0,#4STR R0, R13, #PCOND_OFSSTR R1, R13, #PUPD_OFSENDIFIF PIOE_SETUP 0 ;/端口E处理ADR R0, PIOE_CFGLDR R1, R0,#4STR R0, R13, #PCONE_OFSSTR R1, R13, #PUPE_OFSENDIFIF PIOF_SETUP 0 ;/端口F处理ADR R0, PIOF_CFGL

31、DR R1, R0,#4STR R0, R13, #PCONF_OFSSTR R1, R13, #PUPF_OFSENDIFIF PIOG_SETUP 0 ;/端口G处理ADR R0, PIOG_CFGLDR R1, R0,#4STR R0, R13, #PCONG_OFSSTR R1, R13, #PUPG_OFSENDIFIF PIOH_SETUP 0 ;/端口H处理ADR R0, PIOH_CFGLDR R1, R0,#4STR R0, R13, #PCONH_OFSSTR R1, R13, #PUPH_OFSENDIFIF PIOJ_SETUP 0 ;/端口J处理ADR R0, PIO

32、J_CFGLDR R1, R0,#4STR R0, R13, #PCONJ_OFSSTR R1, R13, #PUPJ_OFSENDIF ENDIF;以下函数为进入相应的模式,并定义相应模式的端栈大小;/为每个模式设置栈LDR R0, =Stack_Top;/进入未定义指令模式并设定其栈指针MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_BitMOV SP, R0SUB R0, R0, #UND_Stack_Size;/进入异常中断模式,并设定其栈指针MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_BitMOV SP, R0SUB R0, R0,

33、 #ABT_Stack_Size;/进入 FIQ 模式,并设定其栈指针MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_BitMOV SP, R0SUB R0, R0, #FIQ_Stack_Size;/进入 IRQ 模式,并设定其栈指针MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_BitMOV SP, R0SUB R0, R0, #IRQ_Stack_Size;/进入 Supervisor 模式,并设定其栈指针MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_BitMOV SP, R0SUB R0, R0, #SVC_St

34、ack_Size; IMPORT MMU_EnableICache; bl MMU_EnableICache;/进入 用户 模式,并设定其栈指针 /;最后进入用户模式 MSR CPSR_c, #Mode_USRMOV SP, R0SUB SL, SP, #USR_Stack_Size;/进入C代码;IMPORT _mainLDR R0, =_mainBX R0;/用护初始堆与栈 ;/用户设置堆栈程序(C外部接口:用于动态申请内存使用)AREA |.text|, CODE, READONLY; IMPORT _use_two_region_memoryEXPORT _user_initial_s

35、tackheap_user_initial_stackheap /*/_user_initial_stackheap 库函数用法翻译用法:_user_initial_stackheap 返回这些值:1. 堆基址(heap base) - RO2. 栈基址(stack base,一般为栈的最高地址) - R13. 堆顶(heap limit) - R24. 栈顶(stack limit) - R3*/LDR R0, = Heap_MemLDR R1, =(Stack_Mem + USR_Stack_Size)LDR R2, = (Heap_Mem + Heap_Size)&nbs _user_i

36、nitial_stackheap 库函数用法翻译_user_initial_stackheap返回初始化堆和栈的位置。RVCT V2.X及其更早的版本中_user_initial_stackheap默认使用的是符号|Image$ZI$Limit|的值。当使用分散加载文件的时候这个符号不会产生。如果你使用分散加载文件,那么你需要重新执行_user_initial_stackheap函数,不然链接会失败。在RVCT V3.X中_user_initial_stackheap的功能得到了加强,即使你使用分散加载文件也不需要你重新执行_user_initial_stackheap函数。函数会根据你的分散

37、加载文件的描述选择正确的功能函数段。注意:如果你重新执行_user_initial_stackheap函数,这将忽略所有的库函数的执行。这就使得存在的应用程序不需要修改。语法:_valu_in_regs struct _initial_stackheap _user_initial_stackheap(unsinged R0,unsigned SP,unsgined R2)用法:_user_initial_stackheap 返回这些值:1. 堆基址(heap base) - RO2. 栈基址(stack base,一般为栈的最高地址) - R13. 堆顶(heap limit) - R24.

38、 栈顶(stack limit) - R3如果这个函数被重新执行,那么必须满足以下条件:1. 栈的使用不能超过88字节。2. R12(ip)不能被破坏。3. 堆要以8字节方式对齐(ALIGN = 3)。默认的一段模式中R2,R3将被忽略,R0,R1间的存储空间将全部用来作为堆空间。如果使用二段模式那么堆和栈的空间将分别受R2,R3的限制。在rt_misc.h中_user_initial_stackheap的定义是这样的:struct _initial_stackheap unsigned heap_base, stack_base, heap_limit, stack_limit注意:由于满递

39、减堆栈的原因,stack_base的值比栈的最高地址要高出1个栈容量。返回:R0,R1,R2,R3中的返回值是由你使用的一段存储模式还是二段存储模式决定。1. 一段模式中R1比R0大。R2和R3被忽略了。2. 二段模式中R0和R2用来初始化堆,R1和R3用来初始化栈。R2 = R0, R3 R1 R2 - heaps heaps - LOW ADDR_use_one_memory_region _use_two_memory_region使用分散加载文件:默认情况下_user_initial_stackhep()使用的是符号|Image$ZI$limit|的值。这个符号在用户使用分散加载文件时

40、不会产生。然而,C库提供了比较折中的方法:利用分散加载文件中的一些信息来执行这个函数。注意:如果你重新执行_user_initial_stackhep()函数,那么其他的库的执行将被忽略。选择使用一段存储模式:定义一段特殊的执行域在你的分散加载文件中。使用这种符号:ARM_LIB_STACKHEAP,并使用EMPTY属性。这样库管理器就选择了一个把这个域当作堆和栈合并在一起的_user_initial_stackhep()函数。在这个函数中使用了Image$ARM_LIB_STACKHEAP$Base和Image$ARM_LIB_STACKHEAP$ZI$Limit符号。选择使用二段存储模式:

41、定义两个特殊的执行域再你的分散加载文件中。使用这两种符号:ARM_LIB_STACK, ARM_LIB_HEAP。并且两个段都要使用EMPTY属性。这样库管理器就会选择使用符号:Image$ARM_LIB_HEAP$Base、Image$ARM_LIB_STACK$ZI$ZI$limit、Image$ARM_LIB_STACK$BaseImage$ARM_LIB_STACK$ZI$Limit的_user_initial_stackhep()函数。例子:FLASH_LOAD 0x0000 0x00200000VECTORS +0 0x400* (:gdef:_vectab_stack_and_reset, +FIRST); 其他域可以放在这里; 最高256 异常深度 (256*4bytes = 1024 = 0x400)CODE 0x400 FIXED* (+RO)DATA 0x20000000 0x00200000* (+RW, +ZI); 堆开始于 1MB ,向高地址生长ARM_LIB_HEAP 0x20100000 EMPTY 0x100000-0x8000; 堆安排在 2MB RAM的最高地址处; 向低地址生长,空间为32KBARM_LIB_STACK 0x20200

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1