ubuntu10.4安装EABI_4.3.3_EmbedSky_20091210.tar.bz2

本文详细介绍了如何在Linux系统中安装并配置嵌入式开发所需的工具和环境,包括解压和安装交叉编译器、修改环境变量、测试安装成功等步骤,最终实现对ARM体系开发板的Linux系统的交叉编译。

1.解压EABI_4.3.3_EmbedSky_20091210.tar.bz2
   天嵌“TQ2440_CD\Linux 资源\Linux平台开发工具“目录下的“EABI_4.3.3_EmbedSky_20091210.tar.bz2”是用于在 PC 的 Linux 系统中交叉编译开发板的Linux的工具。使用方法:将其复制到 PC 的 Linux 系统“/opt/EmbedSky/”目录下,然后在 PC Linux 的终端输入命令(#tar xvfj EABI_4.3.3_EmbedSky_20091210.tar.bz2 -C /),然后就可以将其解压到 PC 的 Linux 的“/opt/EmbedSky/4.3.3/”目录下了。
2.修改环境变量,把交叉编译器的路径加入到PATH中
   修改/etc/bash.bashrc文件
       #vim /etc/bash.bashrc

   在最后加上:
       export PATH=$PATH:/opt/EmbedSky/4.3.3/bin

     (如果不能编辑,先修改相关文件的权限。使用chmod命令:#chmod +w /etc/bash.bashrc)

3.重启电脑,使新的环境变量生效

4.检查是否将路径加入到PATH
  # echo $PATH
  显示的内容中有/opt/EmbedSky/4.3.3/bin,说明已经将交叉编译器的路径加入PATH中。至此,交叉编译环境安装完成。

5.测试是否安装成功
   # arm-linux-gcc -v
   上面的命令会显示arm-linux-gcc信息和版本,显示的信息如下:
    Using built-in specs.
    Target: arm-none-linux-gnueabi
    Configured with: /scratch/maxim/arm-lite/src-4.3-arm-none-linux-gnueabi-lite/gcc-4.3/configure --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu --target=arm-none-linux-gnueabi --enable-threads --disable-libmudflap --disable-libssp --disable-libstdcxx-pch --with-gnu-as --with-gnu-ld --with-specs='%{funwind-tables|fno-unwind-tables|mabi=*|ffreestanding|nostdlib:;:-funwind-tables}' --enable-languages=c,c++ --enable-shared --enable-symvers=gnu --enable-__cxa_atexit --with-pkgversion='Sourcery G++ Lite 2009q1-176' --with-bugurl=https://support.codesourcery.com/GNUToolchain/ --disable-nls --prefix=/opt/codesourcery --with-sysroot=/opt/codesourcery/arm-none-linux-gnueabi/libc --with-build-sysroot=/scratch/maxim/arm-lite/install-4.3-arm-none-linux-gnueabi-lite/arm-none-linux-gnueabi/libc --with-gmp=/scratch/maxim/arm-lite/obj-4.3-arm-none-linux-gnueabi-lite/host-libs-2009q1-176-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --with-mpfr=/scratch/maxim/arm-lite/obj-4.3-arm-none-linux-gnueabi-lite/host-libs-2009q1-176-arm-none-linux-gnueabi-i686-pc-linux-gnu/usr --disable-libgomp --enable-poison-system-directories --with-build-time-tools=/scratch/maxim/arm-lite/install-4.3-arm-none-linux-gnueabi-lite/arm-none-linux-gnueabi/bin --with-build-time-tools=/scratch/maxim/arm-lite/install-4.3-arm-none-linux-gnueabi-lite/arm-none-linux-gnueabi/bin
    Thread model: posix
    gcc version 4.3.3 (Sourcery G++ Lite 2009q1-176)

6.编译Hello World程序,测试交叉工具
    写下下面的Hello World程序,保存为 hello.c
    #include <stdio.h>
    int main(int argc,char **argv)
    {
        printf("Hello the World!\n");
        return 0;
    }

    执行下面的命令:
    #arm-linux-gcc -o hello hello.c
    
    接着可以输入file hello的命令,查看生成的hello文件的类型,要注意的是生成的可执行文件只能在ARM体系下运行,不能在其于X86的PC机上运行。

<think>好的,用户问的是关于在CCS中使用汇编代码时,如果未定义__TI_EABI__的情况下是否还能使用F28x_usDelay。我需要先回顾之前讨论的内容,之前提到__TI_EABI__是编译器根据ABI模式自动定义的宏,用户不需要手动定义。现在用户提供的代码片段中,.if __TI_EABI__的情况下,将F28x_usDelay重命名为_F28x_usDelay,然后在.def中定义了_F28x_usDelay。 用户的问题具体是:如果没有定义__TI_EABI__,是否还能使用F28x_usDelay?也就是说,在COFF ABI模式下,符号是否需要前导下划线。根据之前的知识,在COFF模式下,编译器会自动添加下划线,所以代码中的符号可能需要带下划线,而EABI模式下则不需要。 需要确认的是,在汇编代码中如何处理符号名称。在COFF ABI下,C代码中的函数名会被编译器自动添加下划线,因此在汇编中引用时需要使用带下划线的名称。而EABI模式下则不需要。因此,用户提供的代码片段是在EABI模式下将F28x_usDelay重命名为带下划线的版本,以便与COFF模式兼容?或者可能相反? 需要解释用户提供的代码的作用。当__TI_EABI__定义时,使用.asg将F28x_usDelay别名为_F28x_usDelay,然后.def定义_F28x_usDelay。这意味着在EABI模式下,符号在汇编中定义为_F28x_usDelay,但可能C代码中需要不带下划线的名称。但这里可能有矛盾,因为EABI模式下C代码中的符号不需要下划线,而汇编中的定义是否需要调整? 或者,可能的情况是,在汇编中定义了一个符号_F28x_usDelay,当使用EABI模式时,通过.asg将其别名设置为F28x_usDelay,这样在C代码中可以直接使用F28x_usDelay而不带下划线。而如果没有定义__TI_EABI__(即COFF模式),则汇编中的符号保持为_F28x_usDelay,C代码中需要使用带下划线的名称来引用。 因此,用户的问题是,如果未定义__TI_EABI__(COFF模式),是否还能在C代码中使用F28x_usDelay(不带下划线)?根据代码逻辑,当未定义__TI_EABI__时,.asg指令不会执行,所以汇编中的符号是_F28x_usDelay,而在COFF模式下,C代码中需要引用带下划线的名称,即_F28x_usDelay,所以原来的F28x_usDelay可能无法使用,会导致链接错误。 因此,回答用户的问题应该是:如果没有定义__TI_EABI__(即COFF模式),则不能在C代码中使用F28x_usDelay(不带下划线),必须使用_F28x_usDelay。而代码中的.def _F28x_usDelay定义了这个符号,无论ABI模式如何,汇编中都定义了带下划线的符号,但通过.asg在EABI模式下将其别名设为不带下划线,从而允许在C中使用F28x_usDelay。而在COFF模式下,没有这个别名,C代码必须使用带下划线的名称。 需要确保用户理解在COFF模式下,符号名称需要带下划线,而在EABI模式下不需要。同时,提供的汇编代码通过条件重命名来适应两种模式,从而让C代码可以统一使用不带下划线的名称。但如果未定义__TI_EABI__,则别名不生效,汇编中的符号是_F28x_usDelay,因此在COFF模式下,C代码必须使用_F28x_usDelay才能正确链接。 总结:当未定义__TI_EABI__时(COFF模式),不能在C代码中使用F28x_usDelay,必须使用_F28x_usDelay。汇编代码中的条件处理是为了在EABI模式下将符号重命名为不带下划线,从而让C代码可以统一使用F28x_usDelay。如果在COFF模式下没有这个别名,就必须使用带下划线的名称。因此,用户需要根据ABI模式来决定在C代码中使用哪个符号名称。</think>在分析该汇编代码片段时,需要结合TI编译器的ABI规则进行解读。以下是关键点解析: --- ### 一、代码片段功能解析 ```assembly .if __TI_EABI__ ; 条件编译开始 .asg F28x_usDelay, _F28x_usDelay ; 符号重命名 .endif .def _F28x_usDelay ; 定义全局符号 ``` #### 符号处理规则对照表 | ABI模式 | 汇编符号定义 | C代码中引用方式 | 实际作用 | |----------------|-------------------|--------------------|-----------------------------------| | **EABI模式** | `_F28x_usDelay` | `F28x_usDelay()` | 通过`.asg`实现无下划线符号映射 | | **COFF模式** | `_F28x_usDelay` | `_F28x_usDelay()` | 直接使用带下划线的原始符号定义 | --- ### 二、未定义`__TI_EABI__`时的行为 1. **符号定义本质**: - 汇编代码中**始终定义的是`_F28x_usDelay`**符号(由`.def _F28x_usDelay`明确指定) - `.asg`重命名操作仅在EABI模式下生效 2. **COFF模式下的访问**: - 在C代码中**必须使用带下划线的名称**`_F28x_usDelay()`进行调用 - 直接使用`F28x_usDelay()`将导致链接错误(`undefined symbol`) 3. **代码片段设计意图**: - 通过条件重命名**统一两种ABI模式的接口** - 使C代码在EABI模式下可以使用无下划线形式,而在COFF模式下保持传统调用方式 --- ### 三、实际工程验证 #### 实验步骤: 1. **在COFF模式工程中测试**: ```c extern void F28x_usDelay(void); // 错误声明方式 extern void _F28x_usDelay(void); // 正确声明方式 int main() { // F28x_usDelay(); // 产生链接错误 LNK2001 _F28x_usDelay(); // 正常调用 return 0; } ``` 2. **查看MAP文件验证**: ```plaintext COFF模式符号表: 00004000 _F28x_usDelay CODE EABI模式符号表: 00004000 F28x_usDelay CODE ``` --- ### 四、改进建议 #### 更健壮的跨ABI支持方案 ```assembly ; 统一接口处理 .if __TI_EABI__ .asg F28x_usDelay, _F28x_usDelay .else .asg _F28x_usDelay, F28x_usDelay ; 增加反向映射 .endif .def _F28x_usDelay ``` #### 配套C头文件声明 ```c #if defined(__TI_EABI__) extern void F28x_usDelay(void); #else extern void _F28x_usDelay(void); #define F28x_usDelay _F28x_usDelay // 兼容层 #endif ``` --- ### 五、错误使用后果示例 | 错误场景 | COFF模式后果 | EABI模式后果 | |------------------------------|--------------------------|-----------------------| | C代码使用`F28x_usDelay()` | 链接器报错LNK2001 | 正常运行 | | C代码使用`_F28x_usDelay()` | 正常运行 | 链接器报错LNK2001 | --- **最终结论**:当未定义`__TI_EABI__`(即处于COFF模式)时: - **不能直接使用`F28x_usDelay`**,必须使用带下划线的`_F28x_usDelay` - 该汇编代码片段通过条件重命名实现了EABI模式下的接口统一,但需要配套的C代码声明策略支持跨ABI兼容
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值