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: 在虚拟机中新建文件,进行测试,测试代码如下: - #include "stdio.h"
- #include "unistd.h"
- #include "sys/types.h"
- #include "sys/ioctl.h"
- #include "stdlib.h"
- #include "termios.h"
- #include "sys/stat.h"
- #include "fcntl.h"
- #include "sys/time.h"
- #define LED_BRIGHTNESS "/sys/class/leds/led1/brightness"
- #define LED1_ON "echo 0 > /sys/class/leds/led1/brightness"
- #define LED1_OFF "echo 1 > /sys/class/leds/led1/brightness"
- int main()
- {
- int fd;
- fd=open(LED_BRIGHTNESS, O_WRONLY);
- if(fd<0)
- {
- perror("open device leds");
- exit(1);
- }
- printf("leds test show,press ctrl+c to exit \n");
- while(1)
- {
- system(LED1_ON);
- sleep(1);
- system(LED1_OFF);
- sleep(1);
- }
- close(fd);
- return 0;
- }
复制代码编译,输出$CC led.c –o led,生产可执行文件: 将可执行文件拖入开发板,并添加可执行权限,然后运行,就可以看到效果了
|