• Day4: 应用篇-1


    应用篇-1

    环境安装

    应用开发交叉编译环境, 【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.7.pdf 章节4.3.1

    在 Ubuntu 中创建目录:/usr/local/arm,命令如下:

    sudo mkdir /usr/local/arm
    
    • 1

    令将交叉编译器复制到/usr/local/arm 中:

    sudo cp gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/ -f
    
    • 1

    拷贝完成以后在/usr/local/arm 目录中对交叉编译工具进行解压,解压命令如下:

    sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
    
    • 1

    等待解压完成,解压完成以后会生成一个名为“gcc-linaro-4.9.4-2017.01-x86_64_arm-linuxgnueabihf”的文件夹,这个文件夹里面就是我们的交叉编译工具链。
    修改环境变量,使用 VI 打开/etc/profile 文件,命令如下:

    sudo vi /etc/profile
    
    • 1

    打开/etc/profile 以后,在最后面输入如下所示内容:

    export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
    
    • 1

    添加完成以后的/etc/profile 如图 4.3.1.7 所示:
    在这里插入图片描述

    修改好以后就保存退出,重启 Ubuntu 系统,交叉编译工具链(编译器)就安装成功了。

    在使用交叉编译器之前还需要安装一下其它的库,命令如下:

    sudo apt-get install lsb-core lib32stdc++6
    
    • 1

    交叉编译器验证
    首先查看一下交叉编译工具的版本号,输入如下命令:

    arm-linux-gnueabihf-gcc -v
    
    • 1
    fei@ubuntu:~$ arm-linux-gnueabihf-gcc -v
    Using built-in specs.
    COLLECT_GCC=arm-linux-gnueabihf-gcc
    COLLECT_LTO_WRAPPER=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/../libexec/gcc/arm-linux-gnueabihf/4.9.4/lto-wrapper
    Target: arm-linux-gnueabihf
    Configured with: /home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/snapshots/gcc-linaro-4.9-2017.01/configure SHELL=/bin/bash --with-mpc=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-mpfr=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gmp=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu --with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-objc-gc --enable-shared --without-included-gettext --enable-nls --disable-sjlj-exceptions --enable-gnu-unique-object --enable-linker-build-id --disable-libstdcxx-pch --enable-c99 --enable-clocale=gnu --enable-libstdcxx-debug --enable-long-long --with-cloog=no --with-ppl=no --with-isl=no --disable-multilib --with-float=hard --with-mode=thumb --with-tune=cortex-a9 --with-arch=armv7-a --with-fpu=vfpv3-d16 --enable-threads=posix --enable-multiarch --enable-libstdcxx-time=yes --with-build-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/sysroots/arm-linux-gnueabihf --with-sysroot=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu/arm-linux-gnueabihf/libc --enable-checking=release --disable-bootstrap --enable-languages=c,c++,fortran,lto --build=x86_64-unknown-linux-gnu --host=x86_64-unknown-linux-gnu --target=arm-linux-gnueabihf --prefix=/home/tcwg-buildslave/workspace/tcwg-make-release/label/docker-trusty-amd64-tcwg-build/target/arm-linux-gnueabihf/_build/builds/destdir/x86_64-unknown-linux-gnu
    Thread model: posix
    gcc version 4.9.4 (Linaro GCC 4.9-2017.01)
    fei@ubuntu:~$
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    LED应用层操作

    应用层操控硬件的两种方式
    1. 设备文件: 应用层通过对设备文件的 I/O 操作来操控硬件设备
    2. sysfs文件: 应用层通过 sysfs 文件系统对硬件设备进行操控

    简单的说,sysfs 是一个基于内存的文件系统,同 devfs、proc 文件系统一样,称为虚拟文件系统;它的 作用是将内核信息以文件的方式提供给应用层使用。 sysfs 文件系统的主要功能便是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图。

    sysfs文件系统把连接在系统上的设备和总线组织成为一个分级的文件、展示设备驱动模型中各组件的 层次关系。sysfs 提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系,用来导出内核对象 (kernel object,譬如一个硬件设备)的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些 数据、属性的访问支持。
    内核对象、对象属性及对象间关系在用户空间 sysfs 中的的表现:
    在这里插入图片描述

    系统中所有的设备(对象)都会在/sys/devices 体现出来,是 sysfs 文件系统中最重要的目录结构;而 /sys/bus、/sys/class、/sys/dev 分别将设备按照挂载的总线类型、功能分类以及设备号的形式将设备组织存放 在这些目录中,这些目录下的文件都是链接到了/sys/devices 中。

    设备的一些属性、数据通常会通过设备目录下的文件体现出来,也就是说设备的数据、属性会导出到用 户空间,以文件形式为用户空间提供对这些数据、属性的访问支持,可以把这些文件称为属性文件;读这些 属性文件就表示读取设备的属性信息,相反写属性文件就表示对设备的属性进行设置、以控制设备的状态。

    LED.c 源码

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    
    #define  LED_TRIGGER    "/sys/class/leds/sys-led/trigger"
    #define  LED_BRIGHTNESS "/sys/class/leds/sys-led/brightness"
    #define  USAGE()    fprintf(stderr, "usage:\n"  \
                    "    %s \n"   \
                    "    %s  \n", argv[0], argv[0])
    
    
    int main(int argc, char *argv[])
    {
        int fd1, fd2;
    
    
        /* 校验传参 */
        if (2 > argc) {
            USAGE();
            exit(-1);
        }
    
    
        /* 打开文件 */
        fd1 = open(LED_TRIGGER, O_RDWR);
        if (0 > fd1) {
            perror("open error");
            exit(-1);
        }
    
    
        fd2 = open(LED_BRIGHTNESS, O_RDWR);
        if (0 > fd2) {
            perror("open error");
            exit(-1);
        }
    
    
        /* 根据传参控制LED */
        if (!strcmp(argv[1], "on")) {
            write(fd1, "none", 4);     //先将触发模式设置为none
            write(fd2, "1", 1);         //点亮LED
        }
        else if (!strcmp(argv[1], "off")) {
            write(fd1, "none", 4);     //先将触发模式设置为none
            write(fd2, "0", 1);         //LED灭
        }
        else if (!strcmp(argv[1], "trigger")) {
            if (3 != argc) {
                USAGE();
                exit(-1);
            }
    
    
            if (0 > write(fd1, argv[2], strlen(argv[2])))
                perror("write error");
        }
        else
            USAGE();
    
    
        exit(0);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    编译

    arm-linux-gnueabihf-gcc -o led led.c
    
    • 1

    注意和https://blog.csdn.net/feiwatson/article/details/127352356?spm=1001.2014.3001.5501
    中的开发环境的异同

    下载到板上运行

    ./testApp on # 点亮 LED 
    ./testApp off # 熄灭 LED 
    ./testApp trigger heartbeat # 将 LED 触发模式设置为 heartbeat
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    POL890 LVDS&RGB TO MIPI&LVDS
    13、IOC 之环境抽象
    2530. 执行 K 次操作后的最大分数
    GitHub标星75k,阿里15W字的Spring高级文档(全彩版),真的太香了
    java中 得到两个数组中不同的元素 有效
    高并发下秒杀商品,你必须知道的9个细节
    大端模式与小端模式
    Web应用系统的小安全漏洞及相应的攻击方式
    【LeetCode-简单题】367. 有效的完全平方数
    实践出真知:全网最强秒杀系统架构解密,不是所有的秒杀都是秒杀!!
  • 原文地址:https://blog.csdn.net/feiwatson/article/details/128065529