回答

收藏

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

#板卡评测 #板卡评测 1706 人阅读 | 0 人回复 | 2023-12-17

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


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

3.2 write

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


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


3.4 close
函数形参原型如下,函数形参为fd,文件描述符。
3.5 ioctrl
ioctl 函数用于系统调用操作特殊文件的底层设备参数。例如终端的许多操作特性可以用ioctl()请求来控制。不能用于read()、write()、open()、close()函数表示的 I/O 操作通常都 能用 ioctl 表示。
函数原型如下,fd为文件描述符,request为指定在fd上执行控制操作,第三个参数为任意数据类型,根据request的参数值来确定第三个参数所期望的类型。
4.LED验证
学习了上面的文件I/O操作,接下来使用板载的LED进行进行测试,这是板载的3个LED硬件原理图:
本次使用LED_R进行测试,连接到了芯片P15_JTAG_MOD引脚
打开ELF引脚复用对照表,对应gpio1_IO10:
在虚拟机中新建文件,进行测试,测试代码如下:
  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,生产可执行文件:
将可执行文件拖入开发板,并添加可执行权限,然后运行,就可以看到效果了

分享到:
回复

使用道具 举报

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

本版积分规则

1326 积分
16 主题
+ 关注
热门推荐
关闭

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