




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
;/*/;/* 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 compatible 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 0x10 ; 定义用户模式标志代码;/ 用户模式的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 ; 定义系统模式(特权模式)标志代码;/ 系统(特权)模式的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 ;普通中断模式模式端栈长度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 ;开辟端栈段,段名(stack)定义为可读可写,不初始化内存单元或将内存写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)声明堆代码段(不初始化内存,可读写,字节对齐)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 0x10 ; 慢时钟控制 对应基地址的偏移值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 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 ; /内存基地址; /看门狗定义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 ; 存储控制器设定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 控制bankcon7_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_ofs 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 ; 端口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;端口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 0pcone_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_setup equ 0pconj_val equ 0x00000000 ;pupj_val equ 0x00000000 ;端口j上拉开启; 汇编程序数据 8 字节对齐preserve8 ;c和汇编有8位对齐的要求,这个伪指令可以满足此要求;/存储区设定和程序入口点;/启动代码必须连接到第一个地址才能运行。area reset, code, readonly ;/开辟端栈段,段名(reset)定义reset代码段为只读arm ;/arm 模式运行程序;/异常向量;/影射到地址0;/必须使用,绝对寻址方式。;/虚处理(子程序)是用一个无限循环实现的, 它是可修改的./(11942295)翻译vectors 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*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*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 +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 +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分配一段字对齐的内存单元undef_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_handlerdabt_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_valdcd 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 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 ;/定义一个全局函数名变量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, #locktime_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 if 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, 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_cfgldr 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, pioj_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, #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_stack_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_stackheap_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_initial_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函数。函数会根据你的分散加载文件的描述选择正确的功能函数段。注意:如果你重新执行_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. 栈顶(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注意:由于满递减堆栈的原因,stack_base的值比栈的最高地址要高出1个栈容量。返回:r0,r1,r2,r3中的返回值是由你使用的一段存储模式还是二段存储模式决定。1. 一段模式中r1比r0大。r2和r3被忽略了。2. 二段模式中r0和r2用来初始化堆,r1和r3用来初始化
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 哈尔滨电力职业技术学院《BIM技术与软件应用》2023-2024学年第二学期期末试卷
- 延安职业技术学院《中学生物教育技术》2023-2024学年第二学期期末试卷
- 西昌民族幼儿师范高等专科学校《项目管理与案例分析》2023-2024学年第二学期期末试卷
- 杭州万向职业技术学院《外科护理学2(含皮肤性病护理学)》2023-2024学年第二学期期末试卷
- 扬州大学《压铸成型工艺与模具设计》2023-2024学年第二学期期末试卷
- 惠州学院《教育大数据及其应用》2023-2024学年第二学期期末试卷
- 兰州城市学院《数据分析与实践》2023-2024学年第二学期期末试卷
- 方程的应用-销售问题及变化率问题(小升初衔接)(教学设计)-2023-2024学年北师大版六年级下册数学
- 济源职业技术学院《工程项目管理与建设法规》2023-2024学年第二学期期末试卷
- 西安职业技术学院《国际贸易运输与保险》2023-2024学年第二学期期末试卷
- 部编版三年级下册语文第一单元教材解读PPT课件
- 【2022】154号文附件一:《江苏省建设工程费用定额》(2022年)营改增后调整内容[10页]
- 二年级剪窗花
- 分子生物学在医药中的研究进展及应用
- 《对折剪纸》)ppt
- 03SG520-1实腹式钢吊车梁(中轻级工作制A1~A5_Q235钢_跨度6.0m、7.5m、9.0m)
- 以虚报注册资本、虚假出资、抽逃出资为由对实行认缴资本登记制的公司进行处罚无法律依据
- 风电场生产运营准备大纲11.14
- 人教版八年级语文下册教材研说
- 《机械制造装备设计》ppt课件
- 中学家访记录大全100篇 关于中学家访随笔
评论
0/150
提交评论