ARM6818开发板的系统IO(文件IO)与开发板屏幕控制

简介: ARM6818开发板的系统IO(文件IO)与开发板屏幕控制

目录


一、系统IO(文件IO)

open:打开一个文件

colse: 关闭文件

read: 读取文件信息        

概念与用法

联系:读取一个文件大小

write: 向文件中写入

概念与用法

练习:读出来的数据,写入到另一个文件

二、开发板屏幕

6818屏幕介绍

概念与用法

lseek:定位光标的位置     光标定位的位置 +/- 偏移量

概念与用法

mmap:建设一个映射关系  

概念与用法

练习:屏幕单刷、循环刷颜色,画矩形,三角形,圆形


正文


一、系统IO(文件IO)


open:打开一个文件


SYNOPSIS

      #include <sys/types.h>

      #include <sys/stat.h>

      #include <fcntl.h>


      int open(const char *pathname, int flags);

       pathname:文件名 //路径

       flags:文件打开的标志,代表了我们对文件的权限

               O_RDONLY,  //只读

               O_WRONLY, //只写

               O_RDWR    //可读可写

             

       返回值:成功返回一个新的文件描述符

               文件描述符:程序运行过程中,打开文件的序号,操作文件,就是通过操作文件描述符(这个描述符很重要,我们对文件所有操作都是通过这个描述符定位再执行的 )

             

               系统默认会打开三个文件:标准输入,标准输出,标准出错

               失败返回-1,同时error被设置(perror())

       打开一个文件的代码如下

int fd = open("hello.c",O_RDONLY);   //开启描述符为fd的文件
    if(-1 == fd)
    {
        perror("open error");
        return -1;
    }


colse: 关闭文件


    NAME

      close - close a file descriptor


SYNOPSIS

      #include <unistd.h>

int close(int fd);  //关闭描述符为fd的文件

       fd: 文件描述符


read: 读取文件信息


概念与用法


NAME

      read - read from a file descriptor


SYNOPSIS

      #include <unistd.h>


      ssize_t read(int fd, void *buf, size_t count);

       fd: 文件描述符,我们要读取的那个文件

       buf:将读取的信息放在哪里

       count:读取多少字节的信息(一次性读取多少字节)

       返回值:成功返回读取到的字节数,如果返回0,说明文件已经读完了

               失败返回-1 ,同时error被设置

             

char buf[1024] = {0};   //定义一个数组,将每次读取的数据存入其中
read(fd,buf,1024);      //将描述符为fd的文件信息读到buf数组里,每次读取1024个字节


联系:读取一个文件大小


#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>
int read_wen()
{
  int fd = open("99.c",O_RDONLY);   //开启99.c文件
  if(-1 == fd)
  {
    perror("open error");
    return -1;
  }
  char buf[1024] = {0};
  int num = 0,r;
  do
  {
    r = read(fd,buf,1024);       //读取99.c文件
    if(r == -1)
    {
      perror("read error");
      return -2;
    }
    num += r;                    //将每次读取到的字节数存入num
    if(r != 0)
      printf("%s\n",buf);
  }while (r>0);                    //循环读取文件信息,直到某一次读取信息为0
  printf("num = %d\n",num);
  close(fd);                       //关闭99.c文件
  return 0;
}


write: 向文件中写入


概念与用法


NAME

      write - write to a file descriptor


SYNOPSIS

      #include <unistd.h>


      ssize_t write(int fd, const void *buf, size_t count);

       fd:文件描述符,写入的文件

       buf:要写入的东西

       count:写入的大小

     

       返回值:成功返回写入的字节数,(0 表示没有写进去)

               失败返回-1,同时error被设置


练习:读出来的数据,写入到另一个文件


int write_wen()
{
  int fd1 = open("read.c",O_RDONLY);       //开启要读取信息的文件
  int fd2 = open("1.txt",O_WRONLY);        //开启要写入信息的文件
  if(-1 == fd1 || -1 == fd2)
  {
    perror("open error");
    return -1;
  }
  int num = 0,r;
  do
  {
    char buf[1024] = {0};
    r = read(fd1,buf,1024);              //读取文件信息到buf里
    //write(fd2,buf,1024);
    if(r == -1)
    {
      perror("read error");
      return -2;
    }
    num += r;
    if(r != 0)                           //判断文件信息是否读完,否就执行写入程序
    {
      printf("%s\n",buf);
      int w = write(fd2,buf,r);        //将刚刚读取到信息的部分数组里的信息写入到fd2
      if(-1 == w)
      {
        perror("write error");
        return -3;
      }
    }
  }while (r>0);
  printf("num = %d\n",num);
  close(fd1);
  close(fd2);
  return 0;
}


二、开发板屏幕


6818屏幕介绍


概念与用法


开发板的屏幕由像素点组成,480 * 800像素点

   像素点由一个32位(4个字节)的数据来描述的

   为了方便描述,我们将32位分为四组, a(透明度), r(红) ,g(绿), b(蓝)

   描述一个红色

   a                   r                  g                    b

   0000 0000   1111 1111     0000 0000     0000 0000

   0x00ff0000 或 0xff0000

   描述一个白色

   0000 0000 1111 1111 1111 1111 1111 1111

   0xffffff

   描述一个黑色

   0x0

 

开发板屏幕属于帧缓存设备,他也是一个文件(/dev/fb0)

open()

write()写颜色

close()


800 * 480 * 4



关闭配置

vi /etc/profile

按i进入编辑模式


注释掉 cd /IOT(如果目录在这里就不要注释)

       ./iot

用#


保存退出

       按esc结束编辑模式

       输入:wq 保存退出


lseek:定位光标的位置     光标定位的位置 +/- 偏移量


概念与用法


问题:如果是已经将屏幕用一个颜色刷过一遍后,再换一种颜色刷是无法改变屏幕颜色的,因为刷过一遍后,光标会停留再最后的像素点那,再刷一遍只会往下刷,所以要回复光标

NAME

      lseek - reposition read/write file offset


SYNOPSIS

#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

   从光标所在位置开始偏移offset

       fd:文件描述符,写入的文件

       offset:偏移量 可正可负

       whence:光标所在位置

     SEEK_SET //文件头

     The file offset is set to offset bytes.


      SEEK_CUR    //基于当前位置

             The  file  offset  is  set  to  its current location plus offset

             bytes.


      SEEK_END //文件尾

             The file offset is set to the  size  of  the  file  plus  offset

             bytes.


       返回值:成功返回光标所在位置(离文件头的位置)

                     失败返回-1,同时error被设置


mmap:建设一个映射关系  


概念与用法


问题:用文件IO形式刷新屏幕,效率过低,需要一种更高效率的方式

NAME

      mmap, munmap - map or unmap files or devices into memory


SYNOPSIS

#include <sys/mman.h>
       void *mmap(void *addr, size_t length, int prot, int flags,
                  int fd, off_t offset);

        addr:映射区的首地址,一般由系统分配,填NULL

       length:映射区的长度

       prot:映射区的权限,

           PROT_EXEC  Pages may be executed.  //可执行


           PROT_READ  Pages may be read.        //可读


           PROT_WRITE Pages may be written.    //可写


           PROT_NONE  Pages may not be accessed. //无权限

   

            PROT_READ  | PROT_WRITE  //可读可写

     

       flags:数据共享的标志

           MAP_SHARED

               公有的,共享

           

           MAP_PRIVATE 私有的

       fd:文件描述符,写入的文件

         

       offset:偏移量 映射区哪个位置开始,一般给 0

       返回值:成功返回映射区的首地址,

               失败返回MAP_FAILED,同时error被设置


munmap:解映射                

int munmap(void *addr, size_t length);


   addr:映射区的首地址

   length:映射区的长度


练习:屏幕单刷、循环刷颜色,画矩形,三角形,圆形


#include "lcd.h"
unsigned int *plcd = NULL;
int Display(int color,int x,int y)
{
  if(x >= 0 && x <= 800 && y >= 0 && y <= 480)  //全屏幕遍历
  {
    *(plcd + y * 800 + x) = color;            //y代表第几行,一行800像素,y*800代表这个像素点上面Y行的像素点个数
                                                  //x代表第几列,Y*800再加上x后,就定位到了这个像素点
                                                  //然后将color颜色赋值给这个像素点,完成这个像素点的颜色改变
  }
}
int Lcd_Init()
{
  int fd = open("/dev/fb0",O_RDWR);
  if(-1 == fd)
  {
    perror("open error");
    return -1;
  }
  plcd = mmap(NULL,800 * 480 * 4,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
}
void Dis_wh()
{
  for(int i = 0;i < 480;i++)
  {
    for(int j = 0;j < 800;j++)
    {
      Display(0xffff, j, i);    //将每个点都赋值0xffff这个颜色,实现颜色刷满全屏
    }
  }
}
//画矩形
void Dis_qu()
{
  for(int i = 100;i < 400;i++)
  {
    for(int j = 100;j < 600;j++)
    {
      Display(0xff5577, j, i);
    }
  }
}
//画圆
void Dis_yuan()
{
  for(int i = 0;i < 480;i++)
  {
    for(int j = 0;j < 800;j++)
    {
      if((j - 400) * (j - 400) + (i - 240) * (i - 240) <= 10000)
      {
        Display(0xffff, j, i);
      }
      else
      {
        Display(0xff2467, j, i);
      }
    }
  }
}
//(y - y0)/(y2 - y0) = (x - x0)/(x2 - x0)
//(350,350)   (275,425)       (350, 500)
//(y - 300)/-100 = (x - 100)/100   y = - x + 400 
//(y - 100)/100 = (x - 300)/-100  y = -x + 400
//画三角
void Dis_jiao()
{
  for(int y = 0;y < 480;y++)
  {
    for(int x = 0;x < 800;x++)
    {
      if( x >= 100 && y <= 300  && y >= 100 && y <= -x + 400 && y >= x)
      {
        Display(0xff2467, x, y);
      }
    }
  }
}


相关文章
|
2月前
|
Java Unix Go
【Java】(8)Stream流、文件File相关操作,IO的含义与运用
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。!但本节讲述最基本的和流与 I/O 相关的功能。我们将通过一个个例子来学习这些功能。
206 1
|
6月前
|
XML JSON Go
Go语言中的文件与IO:JSON、CSV、XML处理
本文介绍了 Go 语言中对 JSON、CSV 和 XML 三种常见数据格式的处理方法。通过标准库 `encoding/json`、`encoding/csv` 和 `encoding/xml`,可以实现结构体与数据格式之间的序列化与反序列化。JSON 适合 Web API 和前后端通信,因其清晰易读;CSV 适用于表格数据和轻量级交换;XML 则支持复杂嵌套结构,常用于配置文件和 SOAP 协议。文中提供代码示例,涵盖基本使用、嵌套结构处理及实战建议,帮助开发者高效操作这些格式。
|
6月前
|
Unix Go
Go语言中的文件与IO:文件读写
本文介绍了 Go 语言中文件操作的基础方法,涵盖打开与关闭文件、读取和写入文件内容、追加写入以及复制文件等功能。通过 `os`、`bufio` 和 `io` 等标准库包,提供了高效且灵活的实现方式,如使用 `os.ReadFile` 读取整个文件、`bufio.Scanner` 逐行读取、`os.Create` 创建文件以及 `io.Copy` 复制文件内容。同时强调了错误处理的重要性,例如使用 `defer` 确保文件关闭,并推荐注意文件权限设置(如 UNIX 系统中的 `0644`)。最后以表格形式总结了常用操作及其推荐方法,便于快速查阅和应用。
|
6月前
|
Go 数据处理
Go语言中的文件与IO:bufio 和 scanner
Go 标准库中的 `bufio` 包高效读写功能,适用于文件和数据处理。`bufio.Reader` 支持按行或分隔符读取,`bufio.Writer` 提供高性能写入并需调用 `Flush()` 确保数据写入。`bufio.Scanner` 是处理文本文件(如日志、配置)的利器,可按行、单词等分割内容。本文详解其用法,并给出实践建议,如统计字符数、模拟 `tail -f` 和词频分析等。
|
10月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
472 34
|
Ubuntu 芯片 开发者
Ubuntu 25 ARM 桌面系统抢先版发布:第一个Ubuntu ARM桌面系统
Ubuntu 25.04 将于2025年发布,首次支持ARM Desktop桌面版系统,为ARM架构设备如Mac M系列芯片、Raspberry Pi等带来全新的桌面体验。用户可通过虚拟机或双系统安装在Mac上运行Ubuntu ARM,抢先体验版已开放下载:[链接](https://www.baihezi.com/ubuntu/arm/desktop)。此版本不仅扩展了Ubuntu的硬件兼容性,还提供了丰富的功能和流畅的操作体验,适合开发者和技术爱好者尝试。
4307 9
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
存储 Java API
【JavaEE】——文件IO(万字长文)
文件路径,文本文件,二进制文件,File类,文件流,字节流(InputStream,OutputStream)字符流(Reader,Writer)
|
搜索推荐 索引
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
【文件IO】实现:查找文件并删除、文件复制、递归遍历目录查找文件
193 2
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a