1 开发环境
仅针对Visual DSP
4.5进行了调试,5.0则没有。
2 目录结构
1、在移植过程中,基本保留了原有的目录结构不动。
2、在其根目录下新建了一个vdsp的子目录,用以保存VDSP的工程文件和生成的临时文件。最终生成的DXE文件也保存在这里。
3、将include目录下的asm-blackfin名称改为asm,因为在windows下无法使用alias。
4、为每个子目录下的文件建立一个以目录名称为名的工程文件。
3 代码修改
1、因为在移植过程中,首先用工具将所有的代码注释掉了,然后根据需要去除相应的注释。所以如果你发现在别处可以用的函数或者结构体在这里用不了,或者有链接错误等等,请不要惊讶,请在源文件中查找其声明或者实现,再去除其注释即可,当然有时可能有错,需要进行调试。
2、使用工具在每个.c文件的第一行插入了一条语句:
#include
这是新增的一个文件,在原系统中没有。这个文件的用意在于影响编译器的一些行为。系统的配置也是放在这个地方。
3、对于自行添加的driver,请添加一个dummy function,然后在main函数中引用它,否则可能无法正确的链接(不知道算不算VDSP的一个BUG,还是我孤漏寡闻了)。
4、对于make或者configure时自动生成的文件,采用的办法是首先在linux下生成,然后COPY过来,如果你发现缺少什么自动生成的文件,可参考此办法。
5、在原系统中,head.s直接跳转到start_kernel函数开始执行,在移植时将之改为跳转到main函数,然后在main函数中调用start_kernel。
4 crt
bf561中a,b两个核使用的CRT文件是不同的,a核的crt文件使用的是uClinux中的head.s(arch/blackfin/mach-bf561),而b核仍然使用VDSP向导生成的uclinux_basiccrt.s。如果希望在a核中使用VDS库中多核相关的函数,如testset等,请在head.s中加上:
// Initialise the multi-core data tables.
CALL.X __mc_data_initialise;
.extern __mc_data_initialise;
.type __mc_data_initialise,STT_FUNC;
如果希望在a核中使用C++代码,请加上:
/////////////////////////////////////////////////////////////////
// cplusplus
CALL.X ___ctorloop; // run global scope C++ constructors
.extern ___ctorloop;
.type ___ctorloop,STT_FUNC;
5 rootfs
rootfs的生成是在linux下用交叉编译完成的,使用的是ext2的文件系统,使用时请先在head.s或者main函数中中断下来,打开memory窗口,查找_end这一符号,然后使用memory fill将root_fs插入到_end这个地址就OK了。注意fill的数据类型请选择hex32。Rootfs可在CSDN资源中下载。
6 链接文件
u-boot原有的链接文件是arch/blackfin/kernel/vmlinux.lds.s,在移植中没有使用它,而是使用了VDSP向导生成的ldf文件,但是参照vmlinux.lds.s的内容做了部分修改。