收藏 分销(赏)

ARM嵌入式软件开发.ppt

上传人:丰**** 文档编号:6249610 上传时间:2024-12-03 格式:PPT 页数:49 大小:587KB
下载 相关 举报
ARM嵌入式软件开发.ppt_第1页
第1页 / 共49页
ARM嵌入式软件开发.ppt_第2页
第2页 / 共49页
ARM嵌入式软件开发.ppt_第3页
第3页 / 共49页
ARM嵌入式软件开发.ppt_第4页
第4页 / 共49页
ARM嵌入式软件开发.ppt_第5页
第5页 / 共49页
点击查看更多>>
资源描述

1、Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,TM,Click to Edit Master Title Style,*,66v06 Embedded Software Development,嵌入式软件开发,嵌入式开发过程,“,PC,软件”,独立的嵌入式应用,当程序员开始开发一个基于,ARM,应用的时候,你可以使用,ARM,的,ADS,编写类似于“,HELLO WORLD”,的程序,使用,ARMulator,或者在评估板上来调试,但当你把他移植到独立的嵌入式应用设备中时

2、,下面这些问题就成为我们首要考虑的:,硬件环境中所使用的,C,库函数,目标板上的存储器资源,应用程序的初始化,议程,PC,软件的构造,定制标准,C,库函数到目标板,定制,IMAGE,的存储器映射到目标板,复位和初始化,深层次的存储器器映象考虑,编译和调试,IMAGE,ADS,默认的标准,C,库,ANSI C,input/,output,error,handling,stack&,heap,setup,other,Semihosting,Support,应用程序调用的,C,库函数,eg,:,fputc,(),设备驱动层,使用,semihosting,SWIs,eg,:_sys_write(),调

3、试工具环境,C Library,Debug Agent,C,库函数功能是支持,PC,软件,的,而目标板上的可执行软件则依赖相关的硬件资源;在,ARM,体系中,我们可以采用,semihosting,通过相应的驱动来进行调试。,ADS,默认的存储器映射,在默认的情况下,我们链接、定位、运行在0,x8000,heap,被直接放置在数据区的上面,堆栈的基地址是通过调试环境从,C,库函数的,Startup Code,里读取出来的。,ARMulator,=from configuration file(peripherals.,ami,),default=0 x08000000,Multi-ICE=fro

4、m debugger internal variable$top_of_memory,default=0 x80000,RO,RW,ZI,0,x8000,链接时确定,由调试环境提供,Heap(,malloc,alloc,),Stack,C Library,User Code,应用程序启动,_,main,copy code and data,zero,uninitialized,data,_,rt,_entry,set up application stack and heap,initialize library functions,call top-level constructors(C+

5、),Exit from application,main(),causes the linker to pull in library initialization code,程序入口点,Agenda,一个,PC,软件的构造,定制,标准,C,库函数到目标板,定制,IMAGE,的存储器映射到目标板,复位和初始化,深层次的存储器器映象考虑,编译和调试,IMAGE,重定向,C,库函数(1),Semihosting,Support,ANSI C,input/,output,你可以使用适合你目标板运行的驱动来替换标准,C,库中的设备驱动。,Eg,:,printf,(),可打印到,LCD,上,而不是打印控

6、制台上,input/,output,ANSI C,C Library,User Code,Debug Agent,Target Hardware,Retarget,重定向,C,库函数,(2),要重定向,C,库函数,简单的办法是使用你自己的可执行的,semihosting SWIs,来代替原来的,C,库函数,从而来满足你的系统要求,比如说,the,printf,(),系列函数(,sprintf,(),除外,)都会调用,fputc,(),.,在默认情况下,fputc,(),的执行使用了,semihosting,SWI.,用下面的语句来代替:,extern void,sendchar,(char*,

7、ch,);,int fputc,(,int ch,FILE*f)/*e.g.write a character to an LCD*/char,tempch,=,ch,;,sendchar,(&,tempch,);return,ch,;,可查看在,ADS Embedded example,目录下的,retarget.c,可看到更多的重定向例子,你可以确定有不在连接时使用,semihosting,SWI,的吗?,.,消除,C,库函数中的,semi hosting,为了确保在连接时没有函数使用了,semi hosting,SWIs,,,你可以在程序中加入下面的句子:,#,pragma,import

8、(_use_no_,semihosting,_,swi,),如果在程序中仍然使用了,semihosting,编译时将会报错:,Error:Symbol _,semihosting,_,swi,_guard multiply defined,修改:,如果使用(,check,-verbose,linker output for occurrences of,I use_,semihosting,_,swi,),那么连接器将会把那些使用了,smeihosting,的程序列出来,,然后:,提供你自己可运行的功能函数。,在,ADS 1.2,编译器和库函数手册,表4-2给出了所有使用了,semihosti

9、ng,的,C,库函数。,注意:连接器在用户自己的应用代码中不会出现任何有关,semihosting,SWI,使用的报告。,Agenda,一个,PC,软件的构造,定制,标准,C,库函数到目标板,定制,IMAGE,的存储器映射到目标板,复位和初始化,深层次的存储器器映象考虑,编译和调试,IMAGE,分散加载(,Scatterloading,),在一个实际应用当中,你可能并不想在0,x8000,处开始运行。,大多数嵌入式系统都有存储器设备,他们的地址空间是在整个存储器映射中交叉出现的。,分散加载提供了一种把你的代码和数据放在不同的存储器定位上的办法,分散加载定义了两种类型的存储器区域。,Load,区

10、:-在,reset/load,时保留了应用程序的代码和数据,(,典型应用为,ROM).,Execution,区 在程序执行的同时保留了程序的代码和数据。在应用程序启动 期间,每个,load,区都可创建一个或多个可执行区。,分散加载了的应用把详细的存储器映射保存在一个描述文件中,作为一个参数给,armlink,使用,eg,:,armlink,program.o-scatter scatter.,scf,-o program.,axf,Execute View,RAM,0,x10000,0,x18000,0,x4000,0,x0000,ROM,RO,分散加载,(,简单例子,),只读代码和数据保存在

11、,ROM,中,C,库函数初始化代码(在,_main),将:,从,ROM,拷贝,RW,数据到,RAM,在,RAM,中的,ZI,数据初始化,RAM,0,x10000,0,x18000,0,x4000,0,x0000,ROM,Load View,RO,RW,Fill with zeros,ZI,Copy,RW,Execute View,RAM,0,x10000,0,x18000,0,x4000,0,x0000,ROM,RO,LOAD_ROM 0 x0000 0 x4000,RAM,0,x10000,0,x18000,0,x4000,0,x0000,ROM,Load View,RO,RW,Scatte

12、r,描述文件,通配符(*)语法允许简单的对,CODE,和,DATA,进行分组,EXEC_ROM 0 x0000 0 x4000,*(+RO),RAM 0 x10000 0 x8000,*(+RW,+ZI),RW,ZI,RO,RW,ZI,RO,CODE,RO-DATA,RO-CODE,A,B,链接器放置规则,在每个可执行区,链接器通过一些基本的规则来放置,CODE,和,DATA,基本的排序方法是通过属性来安排的:,RO,领先于,RW,RW,领先于,ZI,有相同的属性时,,CODE,在,DATA,之前放置。,更多的排序方法决定于:,输入的组名按字母排序,在,ARMLINK,命令行中指定的顺序。,e

13、g,:,armlink,file1.o file2.o,A,section A,from file1.o,section A,from file2.o,在,SCATTOR,文件中的对象排序,为了把特定的,CODE,和,DATA,放在指定的地址上,你可以不考虑标准的放置规则,使用,+FIRST,和,+,LAST,,直接把第一个和最后一个对象放在可执行区。,图例:把,VECTOR,表放在区的开始。,LOAD_ROM 0 x0000 0 x4000,EXEC_ROM 0 x0000 0 x4000,vectors.o(Vectors,+FIRST,),file1.o(+RO),file2.o(+RO

14、),:,在可执行区内,,scattor,文件中要排序的对象对输出,image,没有影响,链接器的标准放置规则仍然适用,ROOT,区,LOAD_ROM 0 x0000 0 x4000 ;start address and length,EXEC_ROM 0 x0000 0 x4000;root(load=exec address),_main.o(+RO);copying code,*(Region$Table);RO/RW addresses to copy,*(,ZISection,$Table);ZI addresses to zero,RAM 0 x10000 0 x8000 ,*(+R

15、O);All other RO areas,*(+RW,+ZI);program variables ,Must be in a root region,outside root region,一个,root,区是一个可执行区,它的加载地址等于执行地址。,Root,区要点,一个,root,区是一个可执行区,它的加载地址等于执行地址,.,每个,scatter,描述文件必须最少包含一个,root,区,并且最少要包含下列内容:,_main.o,含有拷贝,code/data,的代码,Region$Table,和,ZISection,$Table,含有将要拷贝的,code/data,的地址,他是由链接器

16、产生的,不是一个对象文件。(所以*必须用),Error:L6202E:Section Region$Table cannot be assigned to a non-root region.,Error:L6202E:Section,ZISection,$Table cannot be assigned to a non-root region.,注意:如果,*(+RO),被定位在,root,区,在此之前的将被自动放置,Main,应用程序的入口点必须放在,root,区。,Error:L6203E:Entry point(0 x08000000)lies within non-root reg

17、ion EXE_FLASH.,Run-time,存储器管理,Semihosting,Support,ANSI C,Stack&,Heap,Setup,Stack&,Heap,Setup,ANSI C,C Library,User Code,Debug Agent,Target Hardware,Retarget,如何设置,stack,和,heap,来满足我们的目标存储器,?,我们已经通过执行,_user_initial_,stackheap,(),把,C,标准库的运行存储器模式修改到目标平台上。,Stack,和,Heap,初始化,C Library,User Code,_,main,copy

18、code and data,zero,uninitialized,data,_,rt,_entry,initialize library functions,call top-level constructors(C+),Exit from application,main(),cause linker to pull in library initialization code,Image Entry Point,_,user_initial_,stackheap,(),set up application stack and heap,Run-time,存储器模式,你必须决定在放置,sta

19、ck,和,heap,时所使用的区域是单一的区,(one-region model),或是不同的两个区,(two-region model),Heap,Stack,Stack,One region model,Two region model,HB,SB,SB,HB,HL,单一存储器模式是默认方式,为了实现多区域模式,你可以使用,use_two_region_memory,在所有的模式下,软件堆栈检查要许可。,编译开关是:-,apcs,/,swst,指定堆栈限制,(,为,two-region,模式),heap is checked against stack pointer,Heap,heap

20、is checked against heap limit,(,SL),_,user_initial_,stackheap,(),可以用,C,或汇编来写,他要返回:,Heap,基地址在,R0,STACK,的基地址在,R1.,Heap,的限制地址在,R2,STACK,的限制地址在,R3,EXPORT _user_initial_,stackheap,_user_initial_,stackheap,LDR r0,=0 x80000;HB,LDR r1,=0 x88000;SB,;r2 not used(HL),;r3 not used(SL),MOV pc,lr,Heap,Stack,Heap,

21、的限制地址在单一模式是不被使用的。,Stack,的限制地址只在软件堆栈检查许可的情况下才有效。,HB=0 x80000,SB=0 x88000,警告!,当使用分散加载时你必须执行,_user_initial_,stackheap,(),在,C,库初始化代码内的,_user_initial_,stackheap,(),的默认执行是在映像文件的,RW/ZI,数据段后放置,HEAP,。,使用,Image$RW$Base,/,Image$ZI$Base,连接符号,这些符号对,scatterloading,是无效的。,在,ADS 1.1,和早期版本的软件中:,符号被设置为0,X0,heap,被定位在这!

22、,Heap,的并发使用,无论是直接,(e.g.with,malloc,(),或间接,(by use of,argc,/,argv,),的都可能破坏向量表或其他代码,典型的结果是不可预知的程序在运行时出错了。,在,ADS 1.2:,符号没有定义,应用程序不会联接:,Error:L6218E:Undefined symbol Image$ZI$Limit(referred from sys_,stackheap,.o).,Agenda,一个,PC,软件的构造,裁减标准,C,库函数到目标板,定制,IMAGE,的存储器映射到目标板,复位和初始化,深层次的存储器器映象考虑,编译和调试,IMAGE,The

23、 Vector Table,AREA Vectors,CODE,READONLY,IMPORT Reset_Handler,;import other exception handlers,;,ENTRY,BReset_HandlerBUndefined_HandlerBSWI_HandlerB,Prefetch,_HandlerBData_HandlerNOP,;Reserved vector,BIRQ_Handler,;FIQ_Handler will follow directly,END,在使用,scatterloading,+FIRST,时直接定位在0,X0(,或,0 xFFFF00

24、00),ENTRY,直接告诉链接器这是一个入口点,防止某些段被删除,中断向量表,初始化步骤,C Library,User Code,_,main,copy code and data,zero,uninitialized,data,_,rt,_entry,initialize library functions,call top-level constructors(C+),Exit from application,main(),tells linker to link in library initialization code,Image Entry Point,_,user_initi

25、al_,stackheap,(),set up stack&heap,reset handler,initialize stack pointers,configure MMU/MPU,setup cache/enable TCM,$,Sub$main(),enable caches&interrupts,ROM or RAM at 0 x0?,需要一个有效的地址在 0,x0,这项功能可被编码在像,RESET HANDLER,一样的模块中,在本章结束的时候,我们还会讲到。,ROM,0,x10000,0,x18000,0,x4000,0,x0000,Aliased,ROM,Reset Handl

26、er,ROM/RAM,Remapping,RAM,0,x10000,0,x18000,0,x4000,0,x0000,ROM,ROM at 0 x0,Reset Handler,Vectors,Reset Handler,0,x4000,0,x0000,RAM,Vectors,ROM/RAM,Remapping,下面的例子可像,Reset handler,一样在源码中编码。,;-Integrator CM control,reg,CM_,ctl,_,reg,EQU 0 x1000000C ;Address of CM Control Register,Remap,_bit EQU 0 x04

27、;Bit 2 is,remap,bit of CM_,ctl,ENTRY;On reset,an alias of ROM is at 0 x0,so jump to real ROM.LDR pc,=Instruct_2,Instruct_2;,Remap,by setting,Remap,bit of the CM_,ctl,register LDR r1,=CM_,ctl,_,reg,LDR r0,r1 ORR r0,r0,#,Remap,_bit STR r0,r1;RAM is now at 0 x0.;The exception vectors must be copied fro

28、m ROM to RAM(in _main);Reset_Handler follows on from here,这个功能也可在有,mmu,时使用,ROM/RAM,的重定向,初始化栈的指针,;-,Amount of memory(in bytes)allocated for stacks,Len_FIQ_Stack EQU 256,Len_IRQ_Stack EQU 256,Offset_FIQ_Stack EQU 0,Offset_IRQ_Stack EQU Offset_FIQ_Stack+Len_FIQ_Stack,Reset_Handler,LDR r0,stack_base,;lo

29、cated by scatter file,;Enter each mode in turn and set up the stack pointer,MSR CPSR_c,#Mode_FIQ:OR:I_Bit:OR:F_Bit,;No interrupts,SUB sp,r0,#Offset_FIQ_Stack,MSR CPSR_c,#Mode_IRQ:OR:I_Bit:OR:F_Bit,;No interrupts,SUB sp,r0,#Offset_IRQ_Stack,;System mode stack is set up last,MSR CPSR_c,#Mode_SYS:OR:I_

30、Bit:OR:F_Bit,;No interrupts,SUB sp,r0,#Offset_SYS_Stack,;Set up stack limit if needed,LDR r10,stack_limit,;located by scatter file,局部存储器设置,run-time,的存储器必须在,C,库初始化前定义,如果你使用的,ARM7,芯片还有,MMU/MPU,它必须设置;,ROM/RAM,的重新映射必须完成。,TCMs(Tightly coupled memory),如果有,TCM,典型的必须使能它。,请注意:在,TCM,使能之前,要屏蔽,ROM,在,Cache,打开之前要

31、返回。,在,c,库初始化代码运行之后,如果,cache,被使能,可以避免与,cache,相关的问题;,扩展功能,系统初始化代码通常在进入主应用之前运行,当然,,reset handler,不是一个适合使能中断和使能,caches,地方。,在,reset handler,最后应该放一个,C,运行库初始化代码,EG。IMPORT _main,B _main,我们可使用,$Sub,和$,Super,功能来包装符号,extern void$Super$main(void);,void$Sub$main(void),cache_enable();/enables caches,int,_enable()

32、;/enables interrupts,sys_to_,usr,_mode();/change mode-see next slide,$Super$main();/calls original main(),相关描述可在,ADS 1.2 Linker and Utilities Guide-4.4,章查阅到。,运行模式考虑,主应用程序运行在何种模式是要考虑的重要问题。,用户模式(,User mode),是非特权模式(,unprivileged mode)-,保护你的系统,系统初始化代码只能运行在特权模式(,privileged mode,)。,需要执行特权操作 比如,:,使能中断。,如果你

33、的应用要运行在管理模式,简单的在管理模式下退出你的,reset handler,就可。,如果你想在用户模式下运行你的应用,你需在,$Sub$main(),改变为用户模式,当然,_,user_initial_,stackheap,(),必须有权使用你的应用模式寄存器。,解决办法是在系统模式里退出,reset handler,所有,C,库初始化代码有权使用用户寄存器,但是仍然可以执行特权操作。,Agenda,一个,PC,软件的构造,裁减标准,C,库函数到目标板,定制,IMAGE,的存储器映射到目标板,复位和初始化,深层次的存储器器映象考虑,编译和调试,IMAGE,长跳转,Veneers,ROM_L

34、OAD 0 x0000,ROM_EXEC 0 x0000,*(+RO),RAM 0 x80000000,farfunc,.o(+RO),*(+RW,+ZI),/*,main.c*/,int,main(void),farfunc,();,/*,farfunc,.c*/void,farfunc,(void);:,代码段可被远距离分开放置,(,比,BL,的跳转范围还远,),链接器可自动增加长跳转,Veneers,远距离的函数可被成功调用。,0,x00000000,bl Ven,$AA$L$,farfunc,:,:,Ven,$AA$L$,farfunc ldr,pc,pc,#-4,dcd,0 x800

35、00000,:,:,0 x80000000:,mov,pc,lr,存储器映射寄存器,你可以使用,scatterloading,来放置外设寄存器的存储器映射,在文件中定义它,e.g.,timer_reg.c,struct,volatile unsigned reg1;/*timer control*/,volatile unsigned reg2;/*timer value */,timer_,reg,;,在存储器映射的请求地址上增加另外的可执行区来放置他们,:,LOAD_FLASH 0 x24000000 0 x04000000,:,TIMER 0 x40000000 UNINIT,timer

36、_reg.o(+ZI),:,UNINIT,显示在,ZI,段没有被初始化为0。,Stack,和,Heap,区(1),你也可以在,SCATTER,文件中放置,stack,和,heap,在汇编原文件里定义,stack,和,heap,区,比如.,stackheap,.s,这个空间直接保留一个为0的存储器块,AREA stack,DATA,NOINIT,SPACE 0 x3000;Reserve stack space,AREA heap,DATA,NOINIT,SPACE 0 x3000;Reserve heap space,END,Stack,和,Heap,区(2),增加一个可执行区来定位这个区域,

37、LOAD_FLASH 0X24000000 0 x04000000,:,STACK 0 x1000 UNINIT ;length=0 x3000,stackheap,.o(stack);stack=0 x4000 to 0 x1000,HEAP 0 x15000 UNINIT ;length=0 x3000,stackheap,.o(heap);heap=0 x15000 to 0 x18000,Heap,的基地址起始为,0 x15000.Stack,的最大地址为,0 x4000.,Stack,和,Heap,区,(3),链接器将产生一个为每个可执行区的基地址和限制地址的符号指针,在你的代码中引

38、入这些符号,IMPORT|Image$STACK$ZI$Base|,IMPORT|Image$STACK$ZI$Limit|,IMPORT|Image$HEAP$ZI$Base|,IMPORT|Image$HEAP$ZI$Limit|,stack_baseDCD|Image$STACK$ZI$Limit|,stack_limitDCD|Image$STACK$ZI$Base|,heap_baseDCD|Image$HEAP$ZI$Base|,heap_limitDCD|Image$HEAP$ZI$Limit|,使用,DCD,指令为这些段命名,_,user_initial_,stackheap,

39、(),在,reset handler,,这个,stack,指针(,r13),和,stack,限制值,(r10),通常设置了,他们分别通过,R1,和,R3,作为参数传递给,_user_initial_,stackheap,IMPORT _use_two_region_memory,EXPORT _user_initial_,stackheap,_user_initial_,stackheap,LDR r0,heap_base,;SB value setup in reset handler,LDR r2,heap_limit,;SL value setup in reset handler,MO

40、V pc,lr,Stack,Heap,这个,_user_initial_,stackheap,(),例子实现了两个存储器区域模式。,必须引用,_use_two_region_memory,,在这,HEAP,被检查,它是,HEAP,的限制值,而不是,STACK,指针,存储器映射例子,16,bit,RAM,0,x10000,0,x18000,0,x4000,0,x0000,Fast,32 bit,RAM,Vector Table,Stack,Exception Handlers,RW&ZI,Heap,Flash,0,x24000000,0,x28000000,Reset Handler,RO,Pe

41、ripherals,0,x40000000,外设控制寄存器的地址映射,直接在,FLASH,运行的代码大小,16位,RAM,被用来保存数据和,HEAP,区,一些紧急的代码和数据可放在快速的,RAM,区,SCATTER,文件例子,:,:,16,bitRAM,0 x10000,*(+RW,+ZI),HEAP 0 x15000 UNINIT,stackheap,.o(heap),TIMER 0 x40000000 UNINIT,timer_reg.o(+ZI),FLASH 0 x24000000 0 x04000000,FLASH 0 x24000000 0 x04000000,init.o(Init

42、,+First),*(+RO),32bitRAM 0 x0000,vectors.o(,Vect,+First),handlers.o(+RO),STACK 0 x1000 UNINIT,stackheap,.o(stack),:,这个,scatter,文件执行上页所显示的存储器映射。,Agenda,一个,PC,软件的构造,裁减标准,C,库函数到目标板,定制,IMAGE,的存储器映射到目标板,复位和初始化,深层次的存储器器映象考虑,编译和调试,IMAGE,不使用段的消除和程序的入口点,在默认的情况下,链接器将从最终的,image,文件中删除一些从不使用的代码段,或从未使用的数据段。,要查看哪些

43、段被删除了,在链接时用:,-info unused.,为了确保不删除重要的段(比如:中断向量表),:,使用汇编指令,entry,标示所有的入口点(,c,库有一个入口点:,_main(),),使用,-entry,选择其中一个入口点作为,image,的入口,否则,链接器将给警 告:,Image does not have an entry point.(Not specified or not set due to multiple choices),在生成,ROMmable,image,使推荐使用下面的链接命令:,armlink,obj1.o obj2.o-scatter scatter.,sc

44、f,-info unused-entry 0 x0-o,prog,.,axf,输出选项,链接器产生,ELF/DWARF2,格式的映像文件,选择适当的调试器下载调试,为把,elf,映像文件转为,ROMmable,格式 使用,fromelf,例如.:,fromelf,image.,axf,-bin-o image.bin,产生,binary,格式的文件可烧入到适当的,ROM,Flash,或,EPROM-Emulator,等.,其他,ROMmable,格式的文件也可由,fromelf,产生,例如,.:,Motorola 32 bit Hex(,-m32,),Intel 32 bit Hex(,-i3

45、2,),Intellec,Hex(,-,ihf,).,调试,ROM,映像文件,编译时加调试表(-,G),来进行源码级调试。,在,ROM(EPROM、Flash、EPROM-Emulator),设备里烧入,IMAGE,文件,然后,把,IMAGE,文件加载到,RAM,里,:,For AXD,select File-Load Memory From File with load address 0 x0,On command line,use:,loadbinary,image.bin 0 x0,从,ELF,格式的,IMAGE,文件里装载含调试信息的符号表,For AXD,select File-L

46、oad Debug Symbols,On command line,use:,loadsymbols,image.,axf,附加信息,附加信息:,例子代码在,ADSExamplesembedded,目录,ADS 1.2 Developer Guide,第6章:,Writing Code for ROM,ADS 1.2 Compilers and Libraries Guide,第 4章:,The C and C+Libraries,ADS 1.2 Linker and Utilities Guide,测验,1.默认情况下,应用程序的,STACK,和,HEAP,如何放置的?,2.,如何确认在,C

47、,库里没有链接进,semihosting,SWI,功能?,3.,在,scatter,描述文件里,如何确定中断向量表放在0,x0?,4.,哪个函数被用来放置应用,stack,和,heap?,5.,在,c,库初始化(,main),前,使能,cache,,可以避免,cache,相关的问题?,6.,在两个区域的,stack,和,heap,模式,什么符号必须引入执行?,ROM/RAM,重定向(,remmap,),ROM,0,x10000,0,x18000,0,x4000,0,x0000,Aliased,ROM,Reset Handler,0,x4000,0,x0000,RAM,Vectors,1.复位时,,ROM,通常定位到0,x0;,2.,跳转到实际的,ROM,地址:0,x10000,3.,这时,把0,x0,的,ROM,替换为,RAM,,把中断向量表拷贝到0。,Reset Handler,Reset Handler,Reset Handler,Reset Handler,ROM,0,x10000,0,x18000,Branch to real ROM,Remove alias,1,2,3,

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服