01-基于粤嵌GEC6818实现屏幕的显示固定颜色进行自动切换

2023-12-22 14:41:07

基于GEC6818实现屏幕颜色的切换

本文使用开发板GEC6818,实现屏幕显示特定颜色并且进行自动切换的功能。

一、 初始化开发板–(开发板是新的则可以省略很多步骤)

拿到开发板GEC6818时可能需要做(开发板不是新的)

1.1 删除文件和文件夹

  • rm *: 删除当前目录下的所有文件。

1.2 查看磁盘空间

  • df -h: 显示磁盘使用情况。-h选项使输出以易读的格式显示。–查看该开发板的磁盘还有多少,如果很少了则需要再删除一些没有用的(前人的)文件夹

1.3 编辑配置文件

  • vi /etc/profile: 使用vi编辑器打开/etc/profile文件。在这里,需要手动查找并注释掉特定的行。在vi编辑器中,注释行通常是使用#字符开头的行。

  • 如果是别人使用过的开发板则看一看是否存在

        #source /IOT/driver_ko/insmod_driver.sh
        #cd/ IOT                                  
        #./iot &  
        #前面打 #   表示注释
    

1.4 创建文件夹(选做)

  • mkdir -p /var/log: 创建一个名为log的文件夹。如果var文件夹不存在,则先创建var文件夹,然后再创建log文件夹。–这个文件夹用来存放自己的文件当然这个也可以不做,看个人习惯

1.5 使用串口工具进行文件传输

  • rx 名字: 这是一个命令行工具,用于从另一个设备(如计算机)接收文件。在接收文件之前,您需要在发送端启动xmodem传输,然后使用CRT或其他串口工具发送文件。回车就会有一个C在闪,CRT -> 传输 -> 发送xmodem
    找到你要下载的文件双击/点击发送即可
    等待传输完成
  • 在这里插入图片描述

1.6 更改文件权限

  • chmod +x lcd: 赋予lcd文件可执行权限。这意味着您可以在此文件上运行它,前提是它是一个可执行文件。

二、 练习:实现循环切换颜色

在Linux系统上使用帧缓冲设备交替显示绿色和红色。每次颜色变化都会持续1秒,然后切换到另一种颜色,这样循环进行.
注意有函数:
延时 sleep(1)–>s级延迟
usleep(1)–>微秒级的延迟
当然可以。sleepusleep 是两个用于在程序中引入延迟的函数。它们都用于暂停程序的执行,但它们的时间单位和实现方式有所不同。

  1. sleep(1) - 秒级延迟

    • 原型unsigned int sleep(unsigned int seconds);
    • 参数seconds - 指定要暂停的秒数。
    • 返回值sleep 函数返回时剩余的秒数。
    • 实现sleep 函数会导致调用进程暂停执行,直到指定的秒数已过去或被捕获到信号。这是一个较为粗糙的延迟,因为它只能精确到秒。
  2. usleep(1) - 微秒级延迟

    • 原型int usleep(useconds_t useconds);
    • 参数useconds - 指定要暂停的微秒数。
    • 返回值usleep 函数没有返回值。
    • 实现usleep 函数会导致调用进程暂停执行,直到指定的微秒数已过去或被捕获到信号。这允许更细粒度的时间控制,因为它可以精确到微秒。

注意

  • 虽然 usleep 在许多系统中仍然可用,但它在某些系统和版本中已被标记为弃用。建议使用 nanosleep 函数,该函数提供了更高的时间精度,并且在不同的系统中具有更好的兼容性。

总之,这两个函数都提供了一种方式来暂停程序的执行,但它们的时间单位和精度有所不同。

2.1 解析

使用open()函数打开/dev/fb0设备文件,标志为O_RDWR,表示读写模式。
然后通过write()函数对这个设备进行写入
最后记得close()这个设备。

其中所使用的函数可以参考博客write函数与lseek函数详细解析OPEN,READ,CLOSE以及实例分析

2.2 代码实现

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

int main()
{   int  r1,r2;
    int fd =open("/dev/fb0",O_RDWR);
    if(-1 == fd)
    {
        perror("open file error");
        close(fd);
        exit(1);
    }
    int color1[800*480];
    int color2[800*480];
    int i;
    for(i=0;i<800*480;i++)
    {
        color1[i]=0x00FF00;
        color2[i]=0xFF0000;
    }
    while(1)
    {
        r1 = write(fd,color1,800*480*4);
        if (r1!=800*480*4)
        {
            perror("write error");
            return -2;
        }
        sleep(1);//延迟1s
        lseek(fd,0x00,SEEK_SET);
        printf("green\n");
        r2 = write(fd,color2,800*480*4);
        if (r2!=800*480*4)
        {
            c
            return -2;
        }
        printf("red\n");
        lseek(fd,0x00,SEEK_SET);
        sleep(1);
    }
    close(fd);
}


上面代码中使用了perror()这个函数👇。

perror是C/C++语言中的一个函数,用于将最近的系统错误信息打印到标准错误输出流(stderr)。

它的使用方法如下:

  • 包含头文件:#include <stdio.h>

  • 声明函数原型:void perror(const char *s);

在需要打印错误信息的地方调用perror函数,并传入一个用于提示的字符串参数。例如:perror(“Error:”);

perror函数的作用是将errno变量中的错误号转化为可读的错误信息,并将其打印到标准错误输出流(stderr)中。传入的参数s将会作为一个前缀字符串输出。打印的格式一般为:“s: 错误信息”。

注意

perror函数只能打印与最近的系统调用相关的错误信息。
如果系统调用成功,errno的值不会被改变,perror函数不会打印任何错误信息。
perror函数在打印错误信息后会自动换行。

文章来源:https://blog.csdn.net/qq_63831368/article/details/135151007
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。