snifer

[原创]基于blackfin 平台的嵌入式系统的分散装配机制

0
阅读(32734)

看很少人关注嵌入式系统的分散装配方面,我最近看了一篇杂志,对照着ADI的blackfin 平台进行了模拟,感觉很不错,写出来与大家分享。 通常在嵌入式系统中,指令和数据代码会固化在非易失性存储器中(ROM或Flash) ,可以从这些地方上电启动。从运行速度方面考虑,部分指令和数据代码会在启动后搬运到易失性存储器中, 因此连接器可以使用一些方法机制来配置调度。

这种分散装载(scatterloading)的机制可以让把不同的指令和数据分散的放到不同的地址,而且这些地址在系统启动和系统运行可以是不同的映射。

详细的地址分配可以是用参数来指定,或者用一个描述文件来作为连接器的参数。使用描述文件会使维护起来非常简单,而且如果要改变地址分配,不需要把整个项目完全重新来做,只要把项目中需要的目标重新连接即可。
一个scatterloading文件的示例:
LOAD_FLASH 0x04000000 0x80000 ; 启动地址和长度

{
EXE_FLASH 0x04000000 0x80000
{
init.o (Init, +First) ;
* (+RO) ;
}
32bitRAM 0x0000 0x2000
{
vectors.o (Vect, +First) ;
int_handler.o (+RO)
}

16bitRAM 0x2000 0x80000
{
* (+RW,+ZI)
}
}

本文件定义了启动区域和三个执行区域。在大括号外面定义了启动区域(LOAD_FLASH) ,里面三个定义了执行区域
(EXEC_FLASH,32bitRAM,16bitRAM)。
为了提高运行速度,异常向量(在vectors.s)和异常句柄(在int_handler.c)被重新放置到32bitRAM的零地址开始的地方。
可以读写的变量被复制到16bitRAM的0x2000地址开始的地方。
零初始化的数据和可读写数据放在16bitRAM内。其他不需要搬运的代码只需要还放在Flash里就好。

抛砖引玉,希望能得到大家的支持。

Baidu
map