查看: 1509|回复: 0
打印 上一主题 下一主题

手工建立ARM交叉编译工具链,使用Eclipse+J-Link ARM-OB STM32调试A8

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-3 21:56:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
手工从零开始建立ARM交叉编译工具链,并使用Eclipse+J-Link ARM-OB STM32调试S5PV210

一、安装Linux系统,这里推荐Red Hat Enterprise Linux 6.3,服务器系统稳定优先;具体安装过程,请搜索即可,比较简单。

二、下载编译需要的源码包
binutils-2.23.1
expat-2.0.1
gcc-4.7.2
gdb-7.5.1
gmp-5.0.4
mpc-0.8.1
mpfr-2.4.2
newlib-1.20.0(可选)
zlib-1.2.3
glibc-2.17        (可选)

三、安装各种依赖包,因为我这里已经安装很久,都忘记了,不好意思,在运行每个源码包的configure时,如果出错,根据提示用 yum install 命令从网络下载即可;

四、开始编译
        1、编译依赖库 GMP,MPFR,EXPAT,ZLIB,MPC
                为了省事,直接写了一个sh脚本
export templib=$HOME/ARM/library
mkdir -p $templib

export GMP_VER=5.0.4
export MPFR_VER=2.4.2
export EXPAT_VER=2.0.1
export ZLIB_VER=1.2.3
export MPC_VER=0.8.1


mkdir expat-build
cd expat-build
../expat-$EXPAT_VER/configure \
        --prefix=$templib \
        --disable-shared
make -j 8
make install
cd ..

cd zlib-$ZLIB_VER
./configure \
        --prefix=$templib \
        --static
make -j 8
make install
cd ..

mkdir -p gmp-build
cd gmp-build
../gmp-$GMP_VER/configure \
        --prefix=$templib \
        --disable-shared
make -j 8
make install
rm $templib/lib/*.dylib
cd ..

mkdir -p mpfr-build
cd mpfr-build
../mpfr-$MPFR_VER/configure \
        --prefix=$templib \
        --disable-shared \
        --with-gmp-build=../gmp-build
make -j 8
make install
cd ..

mkdir -p mpc-build
cd mpc-build
../mpc-$MPC_VER/configure \
        --prefix=$templib \
        --disable-shared \
        --enable-static \
        --with-gmp=$templib \
        --with-mpfr=$templib
make -j 8
make install
cd ..
        一般都添加—disable-shared
,--enable-static参数,也修改了安装目录,主要是因为,编译出来的文件仅仅是交叉工具链使用,不必污染PC系统。
        make -j 8
这里因为本人笔记本使用4核8线程处理器,就用了多线程编译,加快编译速度,否则后面会让你等得心烦,^_^。

        2、编译binutils
        binutils 是一些辅助工具集,脚本如下
export target=arm-none-eabi
export prefix=$HOME/ARM/$target
export templib=$HOME/ARM/library
export PATH="$PATHprefix/bin"

export BINUTILS_VER=2.23.1

mkdir -p binutils-build
cd binutils-build
CFLAGS="-I$templib/include" \
LDFLAGS="-L$templib/lib" \
../binutils-$BINUTILS_VER/configure \
        --target=$target \
        --prefix=$prefix \
        --disable-libssp \
        --disable-shared \
        --disable-threads \
        --enable-interwork \
        --enable-multilib \
        --with-gcc \
        --with-gnu-as \
        --with-gnu-ld
make -j 8
make install
cd ..

        这里一般不会出什么大问题。

        3、编译无库GCC,该GCC用于编译各种C库或者linux系统,以编译newlib为例脚本如下:

export target=arm-none-eabi
export prefix=$HOME/ARM/$target
export templib=$HOME/ARM/library
export PATH="$PATHprefix/bin"

export GCC_VER=4.7.2


mkdir -p gcc-build
cd gcc-build
../gcc-$GCC_VER/configure \
        --target=$target \
        --prefix=$prefix \
        --disable-shared \
        --disable-threads \
        --disable-libssp \
        --disable-libmudflap \
        --disable-libgomp -v \
        --enable-languages=c,c++ \
        --enable-interwork \
        --enable-multilib \
        --with-gcc \
        --with-gnu-ld \
        --with-gnu-as \
        --with-dwarf2 \
        --with-newlib \
        --with-headers=../newlib-$NEWLIB_VER/newlib/libc/include \
        --with-mpc=$templib \
        --with-mpfr=$templib \
        --with-gmp=$templib \
        --with-system-zlib
        #--disable-shared 不编译动态链接
        #--disable-threads 不支持多线程编译
        #--disable-libssp 关闭缓冲溢出        
        
mkdir -p libiberty libcpp fixincludes
make -j8 all-gcc
make install-gcc
cd ..

        4、编译newlib
export target=arm-none-eabi
export prefix=$HOME/ARM/$target
mkdir -p $prefix
mkdir -p $templib
export PATH="$PATHprefix/bin"

export NEWLIB_VER=1.20.0

mkdir -p newlib-build
cd newlib-build
mkdir -p etc
../newlib-$NEWLIB_VER/configure \
        --target=$target \
        --prefix=$prefix \
        --disable-newlib-supplied-syscalls \
        --enable-interwork \
        --enable-multilib
make -j 8
make install
cd ..

        5、编译支持newlib的gcc,这里使用3的配置,不过编译目标不一样
export prefix=$HOME/ARM/$target
export PATH="$PATHprefix/bin"

cd gcc-build
make -j8
make install
cd ..

        6、编译GDB调试工具,该工具与Jlink的GDBServer链接进行仿真调试;
export target=arm-none-eabi
export prefix=$HOME/ARM/$target
export templib=$HOME/ARM/library
mkdir -p $prefix
mkdir -p $templib
export PATH="$PATHprefix/bin"

export GDB_VER=7.5.1

mkdir -p gdb-build
cd gdb-build
CFLAGS="-I$templib/include" \
LDFLAGS="-L$templib/lib" \
../gdb-$GDB_VER/configure \
        --target=$target \
        --prefix=$prefix \
        --disable-shared \
        --disable-threads \
              --with-libexpat-prefix=$templib/lib \
        --with-libexpat
make -j 8
make install
cd ..

        至此,编译完成。

五、下载Eclipse+最新的Jlink驱动并配置
        Eclipse下载安装就不用我说了,建议Indigo Service Release 2 版本,界面看起来比较简洁,占用空间较少,4.2就不一样了,工具条各种粗,看起来不舒服……
        打开Eclipse->help->install new software
        定位到Indigo - http://download.eclipse.org/releases/indigo
        
搜索debug 安装如图所示的Hardware Debugging,安装完毕后重启Eclipse
OK

        六、配置一个工程示例
        1、新建一个Cross C 项目
               

填写工具连路径和前缀
        arm-none-eabi-
        /home/LiYong/ARM/arm-none-eabi/bin
        


        完成
        

选中工程,Alt+Enter配置参数,这里增加CPU_TYPE和FPU_TYPE两个环境变量,供后面参数使用
        

GCC编译器这里替换参数为:
-c -mcpu=${CPU_TYPE} -mfpu=${FPU_TYPE} -marm -fdata-sections -ffunction-sections -fno-builtin -ggdb -gdwarf-2

链接参数:
        -mcpu=${CPU_TYPE} -mfpu=${FPU_TYPE} -marm -static -T../${ProjName}.ld -g3 -ggdb -gdwarf-2

汇编器参数:
        -x assembler-with-cpp -c -mcpu=${CPU_TYPE} -mfpu=${FPU_TYPE} -marm -Wall -g3 -ggdb -gdwarf-2

OK,配置完毕

        六,增加连接器脚本文件,该文件名为 工程名.ld 在工程根目录:

LD脚本文件,主要有两个配置MEMORY和SECTIONS,举例

MEMORY
{
        IRAM                (rwx)        : ORIGIN = 0xD0020000, LENGTH = 85K
}
SECTIONS
{
        .text :
        {
                . = ALIGN(4);
                KEEP(*(.text.ResetHandler))
                *(.text)
                *(.text.*)
                . = ALIGN(4);
                *(.rodata)
                *(.rodata.*)
                . = ALIGN(4);
        } > IRAM
        __INIT_DATA = .;
        
        .data : AT (__INIT_DATA)
        {
                . = ALIGN(4);
                __DATA_BEGIN = .;
                *(.data)
                *(.data.*)
                . = ALIGN(4);
                *(.fastrun)
                *(.fastrun.*)
                . = ALIGN(4);
        } > GVAR
        __DATA_END = .;
        
        .bss :
        {
                . = ALIGN(4);
                __BSS_BEGIN = .;
                *(.bss)
                *(.bss.*)
                . = ALIGN(4);
        } > GVAR
        __BSS_END = .;
        
        .VectorTable :
        {
                . = ALIGN(4);
                KEEP(*(.VectorTable))
                . = ALIGN(4);
        } >VECTOR
}

然后,就可以增减其他编译和调试了,对于M3,M4处理器来说,一般向量表都放在最前面,请将LD脚本中的VectorTable配置正确即可。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表