一个linuxk开发板的开发笔记

arm-fsl-linux-gnueabi开发笔记

//开发主机系统信息
$ lsb_release -a
    No LSB modules are available.
    Distributor ID:Ubuntu
    Description:Ubuntu 18.04.4 LTS
    Release:18.04
    Codename:bionic
$ cat /proc/version
Linux version 4.15.0-43-generic (buildd@lgw01-amd64-001) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #46-Ubuntu SMP Thu Dec 6 14:45:28 UTC 2018
//交叉编译环境
File: gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2
Size: 163749909 bytes
Modified: 2020年2月24日, 23:18:03
MD5: 196AA7CA5A39492CD577D983C9DD1A10
SHA1: 9328B768F87D04504FE524E9DEC5A8409DD69261
CRC32: 7BB9B60F
//开发板内核
File: linux-2.6.35.3-102c9c0.tar.bz2
Size: 74888350 bytes
Modified: 2020年2月24日, 23:20:01
MD5: E52CF122EEF2D38E29BBA9D836FD48FD
SHA1: C61ADCA4D9A5540569FC0D69A0176BD04C58AE29
CRC32: D1EA1131
//sqlite3数据库工具
File: sqlite-autoconf-3310100.tar.gz
Size: 2887243 bytes
Modified: 2020年2月28日, 00:36:49
MD5: 2D0A553534C521504E3AC3AD3B90F125
SHA1: 0C30F5B22152A8166AA3BEBB0F4BC1F3E9CC508B
CRC32: 25B51AEC

交叉编译环境搭建

安装后续编译可能用到的工具

$sudo apt-get update && apt-get upgrade  //先更新下系统
$sudo apt-get install vim tftpd-hpa openssh-server nfs-kernel-server libncurses5-dev lib32z1-dev u-boot-tools

解压编译工具

这里要用到刚下载的 gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2

mkdir /usr/local/arm
cd /usr/local/arm
tar ./gcc-4.4.4-glibc-2.11.1-multilib-1.0_EasyARM-iMX283.tar.bz2  //在执行这个命令前,先将这个文件拷贝到当前目录(/usr/local/arm)

设置环境变量

mkdri /xjzy
cd /xjzy

新建 setenv.sh 文件

vim setenv.sh

将如下内容输入到 setenv.sh 中

#!/bin/sh
echo "[=== Setup ARM Compile Environment ===]"

export PATH="$PATH:/usr/local/arm/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin"
export ARCH=arm
export CROSS_COMPILE=arm-fsl-linux-gnueabi-

service tftpd-hpa restart

export PS1="\[\e[32;1m\][arm]\[\e[0m\]:\u@\h:\W "

修改 setenv.sh 权限

chmod 777 setenv.sh

以后需要进入交叉编译环境时,进入/xjzy目录,执行setenv.sh文件就可以了
说明{我从来没成功过,不知道那里出了问题,因此我每次都是把里面的代码粘到bash里,进入交叉编译环境}


编译内核

编译内核应在交叉编译环境下,具体请看 交叉编译环境搭建 章节
将内核文件复制到/xjzy目录下,解压

cd /xjzy
tar -xvf linux-2.6.35.3-102c9c0.tar.bz2
cd linux-2.6.35.3

//默认内核是已经配置好的了,若需要再次配置,可执行如下命令

make menuconfig

配置完成后,就可以进行编译了

[arm]:root@ubuntu:linux-2.6.35.3 make uImage    //make uImage前面的部分我虚拟机的名称等信息
    ... //出现如下信息时,说明编译成功
    CHK     include/linux/version.h
    CHK     include/generated/utsrelease.h
    make[1]: 'include/generated/mach-types.h' is up to date.
    CALL    scripts/checksyscalls.sh
    CHK     include/generated/compile.h
    Kernel: arch/arm/boot/Image is ready
    SHIPPED arch/arm/boot/compressed/lib1funcs.S
    AS      arch/arm/boot/compressed/lib1funcs.o
    LD      arch/arm/boot/compressed/vmlinux
    OBJCOPY arch/arm/boot/zImage
    Kernel: arch/arm/boot/zImage is ready
    UIMAGE  arch/arm/boot/uImage
    Image Name:   Linux-2.6.35.3-571-gcca29a0
    Created:      Fri Feb 28 10:49:02 2020
    Image Type:   ARM Linux Kernel Image (uncompressed)
    Data Size:    2585628 Bytes = 2525.03 KiB = 2.47 MiB
    Load Address: 40008000
    Entry Point:  40008000
    Image arch/arm/boot/uImage is ready

编译的时候可能会报错,错误的部分代码如下:

372        @val = @{$canned_values{$hz}};
373        if (!defined(@val)) {
374                @val = compute_values($hz);
375        }
376        output($hz, @val);

将第373行代码修如下:

372        @val = @{$canned_values{$hz}};
373        if (!@val) {
374                @val = compute_values($hz);
375        }
376        output($hz, @val);

出现这样错误的原因是perl版本升级,因bug原因,将defined(@array)去掉了,可以直接使用数组判断非空
据说官方有说明,但我不知道怎么查找,写这个文档时,我参考的那个页面忘记是哪个了,所以也没再此留下对方的脚印


编译应用程序

以编译hello.c文件作为样例

# arm-fsl-linux-genueabi-gcc hello.c -o hello.o

hello.c的源码如下

#include <studio.h>

int main(void)
{
    int i;
    for (i=0; i<5; i++){
        print("Hello world! (%d)\n", i);
    }
    return 0;
}

写个makefile文件简化编译过程

为了编译方便,可以写一个makefile文件,这样以后编译就可以直接输入make命令了
我没写过这个,方法自己搜索一下吧,不复杂


sqlite3数据库移植

此部分内容参考:DoubleLi的文章成功移植SQLite3到ARM Linux开发板

下载sqlite3源码

官方网站 https://www.sqlite.org/download.html

sqlite-autoconf-3310100.tar.gz下载

将源码包放到linux主机工作目录下
写此笔记时我用的是sqlite版本是3310100
编译sqlite不需要使用root权限

$ whoami
    bootloader  #当前登录用户名
$ cd ~
$ pwd
    /home/bootloader #当前所在位置

解压源码包

将下载的sqlite-autoconf-3310100.tar.gz文件放到当前目录

mkdir install
tar zxvf sqlite-autoconf-3310100.tar.gz #解压
cd sqlite-autoconf-3310100

配置编译选项

交叉编译工具路径加入系统环境变量
下面这三个临时环境变量其实就是复制的setenv.sh中的

export PATH="$PATH:/usr/local/arm/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin"
export ARCH=arm
export CROSS_COMPILE=arm-fsl-linux-gnueabi-

生成makefile

./configure --host=arm-fsl-linux-gnueabi --prefix=/home/bootloader/install

其中

--host 指定交叉编译工具,我这里使用的是 arm-fsl-linux-gnueabi ,参考教程上说一般是arm-linux、arm-linux-gnueabihf、arm-none-linux-gnueabi等
--prefix 制定安装目录,编译后的文件会全部放在安装目录中,参考教程中说必须是绝对路径,我没测试过相对路径会报什么错

编译安装

make
make install

压缩生成文件

pwd
    /home/bootloader/sqlite-autoconf-3310100
arm-fsl-linux-gnueabi-strip ../install/lib/libsqlite3.so.0.8.6
arm-fsl-linux-gnueabi-strip ../install/bin/sqlite3

复制文件到开发板

后续步骤是在开发板上执行的
将sqlite3复制到/usr/local/bin目录,
将动态库文件复制到/usr/local/lib目录,并对动态库做链接

cd /usr/local/lib
ln -s libsqlite3.so.0.8.6 libsqlite3.so.0
ln -s libsqlite3.so.0.8.6 libsqlite3.so

运行sqlite-在开发板上

在开发板上执行sqlite3命令,看到如下信息说明sqlite3移植成功!

sqlite3
SQLite version 3.31.1 2020-01-27 19:55:54
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

使用 .help 查看帮助,使用 .quit 退出sqlite命令


libmodbus库移植

正在进行


goahead移植

正在进行


猜你喜欢

转载自www.cnblogs.com/guyk/p/12377077.html