微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM系列之分散加载描述符(scatte)文件的应用

ARM系列之分散加载描述符(scatte)文件的应用

时间:11-11 来源:互联网 点击:

堆栈的初始化
程序中可能用到的处理器模式,都需要定义一个堆栈指针。
在表2中,堆栈位于stack_base标识的地址中。这个符号可以是存储器系统中的一个直接地址,也可以在另外的汇编文件中定义,由scatter文件来定义分配地址。表2代码为FIQ和IRQ模式各分配了一个256字节的堆栈,用户可以用同样的方法为其他模式也分配堆栈。最简单的方法就是进入相应的模式,然后为SP寄存器指定相应的值。如果想使用软件堆栈检查,还必须指定一个堆栈长度限制值。
堆栈指针和堆栈限制的数值会作为参数自动传递到C库函数的初始化代码__user_initial_stackheap中,在__user_initial_stackheap中不应该修改这些值。
硬件初始化 $sub$$main()
一般来说,应该把所有的系统初始化代码与主应用程序分离开来,但是有几个例外,比如cache和中断的使能,需要在C库函数初始化之后执行。
表3代码显示了如何使用 $sub和 $supper 。连接器把呼叫main()的函数替换成呼叫$sub$$main(),完成cache和中断的使能,并最终跳向main()。


执行模式考虑
为主应用程序选择一个处理器执行模式非常重要,这取决于系统的初始化代码。
许多在启动过程中使用到的功能,如MMU/MPU的配置、中断的使能等,只能在特权级模式下进行。如果需要在特权极模式下运行自己的应用程序,只要在退出初始化过程之前改变到相应的模式就行了,没有其他任何问题。
如果使用user模式,必须保证所有只能在特权模式下执行的功能完成之后,才能进入user模式。因为system模式和user模式使用相同的寄存器组,reset handler应该从system模式退出,_user_initial_stackheap在system模式下完成应用程序堆栈的初始化。这样在处理器进入user模式后,所有的堆栈空间都已经被正确设置好了。


对存储器布局的进一步考虑
在scatter文件中分配硬件地址
虽然可以在一个scatter文件中描述代码和数据的分散布局,但是目标硬件中的外设寄存器,堆栈和heap配置仍然直接采用硬件地址在程序源代码中进行设置。如果把所有存储器地址相关的信息都在scatter文件中进行定义,避免在源文件中引用绝对硬件地址,对程序的工程化管理是有大好处的。
*在scatter文件中定义目标外设地址
通常外设寄存器的地址在程序文件或头文件中定义,也可以声明一个结构类型指向外设寄存器,结构的地址定位在scatter文件中完成。
举例来说,目标定时器上有2个32位的寄存器,可以用表4来映射这些寄存器。为了把结构放置在指定的存储器地址上面,创建一个新的执行区(见表5)。scatter文件便把timer_regs结构定位在了地址0x40000000。
注意,在启动过程当中这些寄存器的内容不需要清零,改变寄存器的内容可能影响系统状态。在执行区上加UNINIT属性可以防止ZI数据在初始化过程中被清零。
在scatter文件中分配堆栈和heap
在许多情况下,用scatter文件来定义堆栈和heap的地址会带来一些好处,主要有:所有的存储器分配信息集中在一个文件里;改变堆栈和heap的地址只要重新连接就行了,不需要重新编译。
*显式地放置符号
在ADS1.2环境下,这是最简单的方法。在前文中引用过2个符号stack_base和heap_base,这2个符号在汇编模块中创建,在scatter文件中各自的执行区里定位(见表6)。
表7文件中,heap基地址定位在0x20000上,堆栈基地址位于0x40000。现在heap和堆栈的位置就可以非常方便地进行编辑了。
*使用连接器产生的符号
这种方法需要在目标文件中指定好heap和堆栈的长度。这在一定程度上减弱了本节开头描述的两个优点。
首先在汇编源程序中定义heap和堆栈的长度。关键词SPACE用来保留一块存储器空间,NOINT则可以阻止清零操作(见表8)。注意在这里的源文件中并不需要地址标号。
然后这些部分就可以在scatter文件中对应的执行区里定位了(见表9)。连接器产生的符号指向每一个执行区的基地址和长度限制,这些符号可以被_user_initial_stackheap调用的重定向代码使用。在代码中使用DCD来给这些值定义更有意义的名字,可以增强代码的可读性(见表10)。
文件把heap基地址定位在0x15000,堆栈地址定位在0x4000。Heap和堆栈的位置可以通过编辑对应执行区的地址方便地改变。



------------------------o---------------------------------------


样例如下所示:


分散加载描述文件供ARM-ADS链接器使用,用来决定各个代码段和数据段的存储位置,下面为一个添加注释后的.scf文件例子:

;YL-LPC2294片内FLASH分散加载文件
;Internal Flash 256kBytes, Address range:0x00000000~0x0003ffff
;Internal SRAM 16KBytes, Address range:0x40000000~0x40003fff
;External Flash 2MBytes,SST39VF1601,Address range:0x80000000~0x401fffff
;External SRAM 512KBytes,IS61LV25616,Address range:0x81000000~0x81080000
ROM_LOAD 0x0;ROM_LOAD:> ;0x0:Start address for ROM_LOAD region.
{
ROM_EXEC 0x00000000;ROM_EXEC:> ;0x00000000:Start address for the execture region.
{
Sta

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top