查看: 387|回复: 0

[评测分享] 【更适合初学者的开发板ELF 1】+ 1.文件IO

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-19 21:11
  • 签到天数: 66 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2023-12-17 10:19:42 | 显示全部楼层 |阅读模式
    分享到:
    1.前言
       之前接触过linux系统,在不清楚具体情况下实现了好多功能,自己做过一些开发板,系统跑起来了,基本功能也能用。实际未进行探索,很多知识点知其然不知其所以然,只跑了功能,不知道怎么来的。因此借助这次机会补充一下基础知识,慢慢补全知识结构。看了下官方的教程文档挺不错的,比某些厂的教程文档跟数据手册一样,没有重点强太多了。
    2.文件I/O
          "Linux 一切皆文件"是 Linux 操作系统中的一个重要理念和设计原则。在 Linux 系统中, 几乎所有的设备、资源都以文件的形式进行访问和操作。简化了操作系统的设计和管理,提供了一种统一的抽象模型,使得应用程序可以使用相同的方法和工具来处理各种文件和资源。 在 Linux 中,不仅普通文件(如文本文件、图像文件等)被视为文件,还有其他类型的 实体也被当作文件对待,例如: 设备文件:Linux 将硬件设备抽象为文件,可以通过设备文件进行访问和操作。如开发板上的LED硬件设备,可以对它进行读写操作LED灯的亮灭。目录:目录也被视为文件,用于组织和存储其他文件和目录。通过目录文件,可以进行 文件的查找、创建、删除和移动等操作。
    3.文件操作
    3.1 open
    在 Linux 系统中要操作一个文件,需要先打开该文件,得到文件描述符,然后再对文件进行相应的读写操作(或其他操作),最后在关闭该文件;open 函数用于打开文件,当然除了打开已经存在的文件之外, 还可以创建一个新的文件,使用man 命令查看函数原型。
    1.png

    Man命令相当于参数手册,man 后面的参数 1代表linux命令,2代表系统调用,3代表标准C库函数。
    函数形参:
    pathname:字符串类型,用于标识需要打开或创建的文件,可以包含路径(绝对路径或相对路径)信 息,譬如:"./src_file"(当前目录下的 src_file 文件)、"/home/dengtao/hello.c"等;如果 pathname 是一个符号 链接,会对其进行解引用。 flags:调用 open 函数时需要提供的标志,包括文件访问模式标志以及其它文件相关标志,这些标志使 用宏定义进行描述,都是常量,open 函数提供了非常多的标志,我们传入flags 参数时既可以单独使用某一 个标志,也可以通过位或运算(|)将多个标志进行组合。这些标志介绍如下:
    2.png
    同时通过man命令看到的open函数实际有两个函数,比较好奇为什么这么写,违背了我们的直觉,C语言是不支持函数重载的。
    原因是当我们调用open函数时, 实际上调用的是glibc封装的函数, 然后由glibc通过自陷指令, 进行真正的系统调用。 也就是说, 所有的系统调用都要先经过glibc才会进入操作系统。 这样的话, 实际上是glibc提供了一个变参函数open来满足两个函数原型, 然后通过glibc的变参函数open实现真正的系统调用来调用原型二

    3.2 write

    函数原型如下,fd为文件描述符,buf为写入数据对应的缓冲区,count为写入的字节数。
    3.png

    3.3 read
    函数原型如下:fd为文件描述符,buf为指定存储读取的数据缓冲区,count为需要读取的字节数
    4.png

    3.4 close
    函数形参原型如下,函数形参为fd,文件描述符。
    5.png
    3.5 ioctrl
    ioctl 函数用于系统调用操作特殊文件的底层设备参数。例如终端的许多操作特性可以用ioctl()请求来控制。不能用于read()、write()、open()、close()函数表示的 I/O 操作通常都 能用 ioctl 表示。
    函数原型如下,fd为文件描述符,request为指定在fd上执行控制操作,第三个参数为任意数据类型,根据request的参数值来确定第三个参数所期望的类型。
    6.png
    4.LED验证
    学习了上面的文件I/O操作,接下来使用板载的LED进行进行测试,这是板载的3个LED硬件原理图:
    7.png
    本次使用LED_R进行测试,连接到了芯片P15_JTAG_MOD引脚
    8.png
    打开ELF引脚复用对照表,对应gpio1_IO10:
    9.png
    在虚拟机中新建文件,进行测试,测试代码如下:
    1. #include "stdio.h"
    2. #include "unistd.h"
    3. #include "sys/types.h"
    4. #include "sys/ioctl.h"
    5. #include "stdlib.h"
    6. #include "termios.h"
    7. #include "sys/stat.h"
    8. #include "fcntl.h"
    9. #include "sys/time.h"

    10. #define LED_BRIGHTNESS    "/sys/class/leds/led1/brightness"
    11. #define LED1_ON       "echo 0 > /sys/class/leds/led1/brightness"
    12. #define LED1_OFF      "echo 1 > /sys/class/leds/led1/brightness"

    13. int main()
    14. {
    15.         int fd;
    16.         fd=open(LED_BRIGHTNESS, O_WRONLY);
    17.         if(fd<0)
    18.         {
    19.            perror("open device leds");
    20.                 exit(1);
    21.         }
    22.         printf("leds test show,press ctrl+c to exit \n");
    23.         while(1)
    24.         {
    25.                         system(LED1_ON);
    26.                         sleep(1);
    27.                         system(LED1_OFF);
    28.                         sleep(1);
    29.         }
    30.                 close(fd);
    31.         return 0;

    32. }
    复制代码
    编译,输出$CC led.c –o led,生产可执行文件:
    10.png
    将可执行文件拖入开发板,并添加可执行权限,然后运行,就可以看到效果了
    11.png

    2.文件IO.gif
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-5-12 09:50 , Processed in 0.122711 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.