snifer

[原创]Blackfin处理器的.LDF文件详解

0
阅读(3450)

最近,得了一本书,陈锋大哥写的《基于Blackfin DSP的数字图像处理》,对其中的几个例子做了验证,都很完美,其中在使用ADSP-BF533时,用VisualDSP++编译时,遇到了一些问题,查找了很多资料,终于得到了解决。

主要就是.LDF文件的理解,下面我针对我自己的理解加上在官网和大佬的交流,写一下这个问题。

一般来说ADSP-BF531.ldf是ADSP-BF531 Blackfin处理器的缺省的.LDF文件。

对每个处理器,有三个.LDF文件,后缀是_C、_CPP和_ASM (例如ADSP-BF533_C.ldf)。这些.LDF文件是Expert Linker的模板。
Blackfin处理器的.LDF文件可以分为5个主要部分:
• 前导段
• 库选择
• run-time头选择
• 存储空间声明
• 代码/数据到存储器映射定义
每个.LDF文件处理一系列命令,允许通过提供少量命令行选项来把多种配置植入应用。通过在.LDF文件中大量使用预处理器宏,//ARCHITECTURE指令规定这个.LDF文件用于ADSP-BF533 Blackfin处理器。
ARCHITECTURE(ADSP-BF533)       
*********************************************************************************
SEARCH_DIR指令识别标准run-time库的位置,像VisualDSP++安装目录的Blackfin\lib子目录一样。链接器将$ADI_DSP置为VisualDSP++安装目录。
如果选择__NO_STD_LIB选项,不包括SEARCH_DIR指令,这意味着链接器没有搜索run-time库的缺省空间。这个选项由-no-std-lib编译器开关选择,确保应用仅被用户提供的库链接。

#ifndef __NO_STD_LIB
SEARCH_DIR( $ADI_DSP/Blackfin/lib )       
#endif
*********************************************************************************
这部分.LDF文件构建不同的宏和变量,目的是产生$LIBRARIES表,按需要的顺序搜索库和目标文件,解决引用问题。一些选项指定选择一个库对另一个库(如工作区激活版本对普通版本),其它选项指定选择一个库对另一个库顺序(如选择完全兼容的IEEE浮点支持版本对较高性能版)。
USE_FILEIO选项是强制定义的。这对在大部分开发周期内使用的printf()和其它与stdio-相关的函数,是必要的。禁用USE_FILEIO选项就禁用了所有与stdio-相关的I/O操作。

如果需要profiling的话,PROFFLAG被定义为一个目标文件的名称。如果不需要,就不定义PROFFLAG。
#ifndef PROFFLAG        /* { */
#define PROFFLAG
#endif        /* } */
/************************** OMEGA ******************************/
OMEGA是包括idle程序的文件名称。如果应用自动终止,如从main()返回或通过调用exit(),就使用这个程序。只要链接时需要工作区,__WORKAROUNDS_ENABLED选项就被编译器驱动器定义;尽管编译时可以单独选择每个可用的工作区,不能对所有的工作区组合提供预构建库。因此,每个库和目标都有单个激活工作区版本,选择了所有的工作区。

#ifdef __WORKAROUNDS_ENABLED        /* { */
#define OMEGA idle532y.doj
#else
#define OMEGA idle532.doj
#endif        /* } */
/************************** MEMINIT******************************/
MEMINIT保持目标文件的名称,包括指向由存储器初始化实用程序产生的任何初始化数据的指针。除非随后的应用被存储器初始化程序处理,否则,这个指针是NULL指针。这个文件没有变量。

到这里大家对.ldf文件有了一定的了解,不会在使用的时候一头雾水了,其实很多时候细节决定成败,一个小问题可能挡住大家对问题理解的道路,只要细细揣摩,加上一点钉子精神,一切都是O了!!!