上海交大ARM培训教材ARM嵌入式软件开发.pptVIP

  • 1
  • 0
  • 约1.59万字
  • 约 49页
  • 2019-01-07 发布于浙江
  • 举报

上海交大ARM培训教材ARM嵌入式软件开发.ppt

object1 entry library entry object2 entry exec image entry which entry point to use? 扩展功能 系统初始化代码通常在进入主应用之前运行 当然,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(); // 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)。 需要执行特权操作 比如:使能中断。 如果你的应用要运行在管理模式,简单的在管理模式下退出你的reset handler 就可。 如果你想在用户模式下运行你的应用,你需在$Sub$$main( )改变为用户模式 当然, __user_initial_stackheap( ) 必须有权使用你的应用模式寄存器。 解决办法是在系统模式里退出reset handler 所有C库初始化代码有权使用用户寄存器,但是仍然可以执行特权操作。 Agenda 一个PC软件的构造 裁减标准C库函数到目标板 定制IMAGE的存储器映射到目标板 复位和初始化 深层次的存储器器映象考虑 编译和调试IMAGE 长跳转Veneers ROM_LOAD 0x0000 { ROM_EXEC 0x0000 { * (+RO) } RAM 0 { farfunc.o (+RO) * (+RW,+ZI) } } /* main.c */ int main(void) { farfunc(); } /* farfunc.c */ void farfunc(void); { : } 代码段可被远距离分开放置 (比BL的跳转范围还远) 链接器可自动增加长跳转Veneers,远距离的函数可被成功调用。 0 bl Ven$AA$L$$farfunc : : Ven$AA$L$$farfunc ldr pc,[pc,#-4] dcd 0 : : 0: mov pc,lr 存储器映射寄存器 你可以使用scatterloading来放置外设寄存器的存储器映射 在文件中定义它 e.g. timer_reg.c struct { volatile unsigned reg1; /* timer control */ volatile unsigned reg2; /* timer value */ } timer_reg; 在存储器映射的请求地址上增加另外的可执行区来放置他们: LOAD_FLASH 00 { : TIMER 0UNINIT { timer_reg.o (+ZI) } : } UNINIT 显示在 ZI 段没有被初始化为0。 Stack 和 Heap 区(1) 你也可以在SCATTER文件中放置stack和heap 在汇编原文件里定义stack 和heap 区 比如. stackheap.s 这个空间直接保留一个为0的存储器块 AREA stack, DATA, NOINIT SPACE 0x3000 ; Reserve stack space AREA heap, DATA, NOINIT SPACE 0x3000 ; Reserve he

文档评论(0)

1亿VIP精品文档

相关文档