当前位置: 首页 > news >正文

【正点原子I.MX6U-MINI应用篇】2、点亮开发板的LED

Linux 系统的文件

在Linux 系统下,一切皆文件!应用层如何操控底层硬件,同样也是通过文件 I/O 的方式来实现。开发板是如何访问磁盘、Flash、SD卡、U盘的呢?是通过将这个硬件设备挂载在linux的文件系统上,一般这些挂载的操作被人已经帮我们做好了,插上就能自动挂载,但是有时候也需要我们手动挂载。
使用df -h命令就可以查看当前板子挂在了哪些设备。

应用层通过对设备文件的 I/O 操作来操控硬件设备,譬如 LCD 显示屏、串口、按键、摄像头等等,所以设备文件其实是与硬件设备相互对应的。设备文件通常在/dev/目录下,我们把/dev 目录下的文件称为设备节点。另外我们还可以通过 sysfs 文件系统对硬件设备进行操控。

一、编写程序

源码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#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 <on|off>\n"   \
                "    %s <trigger> <type>\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);
}

二、编译程序

gcc -o led led.c
./led on

上述命令编译得到的可执行程序 hello 可以在Ubuntu 中运行,

执行file led命令就可以看到led是64位LSB的ELF格式文件,目标机架构为x86-64,说明这个可执行文件只能在PC机上执行。

但是如果把它放到 ARM 板子上去,它是无法执行的。因为它是使用gcc编译的,是给PC机编译的,里面的机器指令是x86 的。我们要想给 ARM 板编译出 hello 程序,需要使用交叉编译工具链,交叉编译的工具链我们已经安装过了,详细请看【正点原子】I.MX6U 嵌入式Linux驱动开发指南V1.x.pdf 的第 4.3 小节。我是用的是arm-linux-gnueabihf交叉编译工具链。使用arm-linux-gnueabihf-gcc -v可以查看交叉编译工具链的版本号。

然后就可以使用下面命令编译出可以在ARM板子上运行的可执行文件了。

arm-linux-gnueabihf-gcc -o led led.c
  • 1、arm 表示这是编译 arm 架构代码的编译器。
  • 2、linux 表示运行在 linux 环境下。
  • 3、gnueabihf 表示嵌入式二进制接口。
  • 4、gcc 表示是 gcc 工具。

这样编译出来的 led程序才可以在 ARM 板子上运行。执行file led命令就可以看出hello是32位 LSB 的 ELF 格式文件,目标机架构为ARM,说明这个交叉编译正常,可执行文件可以在ARM板上执行。

三、上传程序到开发板

开发板启动后通过nfs挂载Ubuntu目录的方式,将相应的文件拷贝到开发板上。简单来说,就是通过NFS在开发板上通过网络直接访问ubuntu虚拟机上的文件,并且就相当于自己本地的文件一样。
开发板想访问/home/zhiguoxin/myproject/alientek_app_development_source这个目录中的文件,就要把/home/zhiguoxin/myproject/alientek_app_development_source挂载到开发板的mnt目录,这样就可以通过nfs来访问/home/zhiguoxin/myproject/alientek_app_development_source了。

因为我的代码都放在/home/zhiguoxin/myproject/alientek_app_development_source这个目录下,所以我们将这个目录作为NFS共享文件夹。设置方法参考移植SQLite3、OpenCV到RV1126开发板上开发人脸识别项目第一章。

Ubuntu IP为 192.168.10.100,然后一般都是挂载在开发板的mnt目录下,这个目录是专门用来给我们作为临时挂载的目录。

文件系统目录简介

然后使用MobaXterm软件通过SSH访问开发板。

ubuntu ip:192.168.10.100
windows ip:192.168.10.200
开发板ip:192.168.10.50

在开发板上执行以下命令:

mount -t nfs -o nolock,vers=3 192.168.10.100:/home/zhiguoxin/myproject/alientek_app_development_source /mnt

就将开饭的mnt目录挂载在ubuntu的/home/zhiguoxin/myproject/alientek_app_development_source目录下了。这样我们就可以在Ubuntu下修改文件,然后可以直接在开发板上执行可执行文件了。当然我这里的/home/zhiguoxin/myproject/windows之间是一个共享目录,我也可以直接在windows上面修改文件,然后ubuntu和开发板直接进行文件同步了。

然后编译,可以编译成功

查看LED 状态是否与程序执行的效果一致!

相关文章:

  • 【C++】第五章 数组:一维数组/二维数组
  • 阿里云大数据开发一面面经,已过,面试题已配答案
  • 自定义模块和第三方模块,cnmp
  • 【正点原子I.MX6U-MINI应用篇】3、Framebuffer应用编程,操作屏幕
  • 区间预测 | MATLAB实现GRU门控循环单元分位数回归多输入单输出
  • 大学网上课程查题系统搭建使用-公众号使用
  • 若依前后端分离版入门
  • DRV8812芯片被国产激光打印机驱动芯片TMI8262取代
  • 三十三、《大数据项目实战之用户行为分析》Spark SQL读写MySQL
  • 负载开关、高侧开关、低侧开关等
  • 【LeetCode】146、LRU 缓存【中等】
  • 【JavaWeb项目】基于WebSocket的Web聊天室
  • File对象转MultipartFile 如何new出高仿MultipartFile对象
  • VScode配置运行C/C++、python,及快捷键配置
  • 【threejs】可视化大屏酷炫3D地图附源码
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • CentOS7 安装JDK
  • Java IO学习笔记一
  • JAVA并发编程--1.基础概念
  • Java程序员幽默爆笑锦集
  • leetcode388. Longest Absolute File Path
  • Material Design
  • SegmentFault 2015 Top Rank
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Transformer-XL: Unleashing the Potential of Attention Models
  • XML已死 ?
  • 前端学习笔记之观察者模式
  • 前端之React实战:创建跨平台的项目架构
  • 如何胜任知名企业的商业数据分析师?
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 微服务入门【系列视频课程】
  • 怎样选择前端框架
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • #162 (Div. 2)
  • #FPGA(基础知识)
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #stm32驱动外设模块总结w5500模块
  • #考研#计算机文化知识1(局域网及网络互联)
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (三十)Flask之wtforms库【剖析源码上篇】
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (一一四)第九章编程练习
  • (转)原始图像数据和PDF中的图像数据
  • .Family_物联网
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .Net 4.0并行库实用性演练
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • .net中我喜欢的两种验证码
  • .so文件(linux系统)
  • [001-03-007].第07节:Redis中的管道