lddongdong 2021-11-24 19:47 采纳率: 100%
浏览 164
已结题

请问这个嵌入式的代码如何理解呢?

请问这个嵌入式的代码如何理解呢?我看得不是很懂,希望大家帮忙逐行帮注释一下和分析一下,非常感谢大家!

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

#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<syslog.h>
#include<errno.h>
#include<linux/input.h>

#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/mman.h>
#include<stdbool.h>

#include<linux/fb.h>
#include<sys/mman.h>
#include<sys/ioctl.h>

#define TEST_MAGIC 'x'
#define TEST_MAX_NR 4

#define LED1 _IO(TEST_MAGIC,0)
#define LED2 _IO(TEST_MAGIC,1)
#define LED3 _IO(TEST_MAGIC,2)
#define LED4 _IO(TEST_MAGIC,3)
#define LED(i) _IO(TEST_MAGIC,i)//做循环用

//控制开关
int openorcloseLed();//控制灯全开或全关,正常返回1,错误返回-1
int openorcloseLed(int arg) {
    int fd;
    fd = open("/dev/Led", O_RDWR)
    if (fd < 0)
    {
               printf("打开驱动文件失败,请检查是否有该驱动或者路径是否正确\n");
               return -1;
    }
    for (int i = 0; i < 4; i++) {
         ioctl(fd, LED(i), arg);
    }
    return 1;
}
void loadbmp();
void loadbmp(int bmp_begin) {
    int lcd = open("/dev/fb0", O_RDWR);
    char bmp24_buf[800*480*3]={0};
    char bmp32_buf[800*480*4]={0};
    char show_buf[800*480*4]={0};
    lseek(bmp_begin, 54, SEEK_SET);
    read(bmp_begin, bmp24_buf, 800*480*3);
    for (int i = 0, j = 0; i < 800 * 480 * 4; i += 4, j += 3) {
        bmp32_buf[i + 2] = bmp24_buf[j + 2];
        bmp32_buf[i + 1] = bmp24_buf[j + 1];
        bmp32_buf[i] = bmp24_buf[j];
    }
    for(int y=0;y<480;y++){
        for (int x = 0; x < 800*4; x++) {
            show_buf[800 * 4 * y + x] = bmp32_buf[800 * 4 * (479 - y) + x];
        }
    }
    write(lcd, show_buf, 800*480*4);
}
void flashLed();
void flashLed(int s) {
int fd;
        fd = open("/dev/Led",O_RDWR);
        for (int i = 0; i < s; i++) {
            ioctl(fd, LED1, 0);
            ioctl(fd, LED2, 0);
            ioctl(fd, LED1, 0);
            ioctl(fd, LED3, 0);
            ioctl(fd, LED4, 0);
            sleep(1);
            ioctl(fd, LED1, 1);
            ioctl(fd, LED2, 1);
            ioctl(fd, LED3, 1);
            ioctl(fd, LED4, 1);
            sleep(1);
        }
}
void brushLcd();
void brushLcd(int lcd, long color) {
    unsigned char* FB = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd, 0);
    //添加我们的RGB逻辑代码

    for (int i=0; i<480; i++){
             for(int j=0;j<800;j++){
                 memcpy(FB+ 4*j+800*4*i,&color,4);
             }
    }
    munmap(FB,800*480*4);
}

int main(int argc, char* argv[]) {
        
    int fd;
    fd = open("/dev/Led", O_RDWR);
    int lcd = open("/dev/fb0", O_RDWR);
    int open_bmp=open("./1/bmp", O_RDWR);
    long red=0xFF0000, green=0x008000,yellow=0xFFFF00;

    /*      初始化所有设备(LED全灭、LCD屏幕加载一张图片(画板自己画一张),写上开始标识)
    */
    openorcloseLed(1);
    loadbmp(open_bmp);
    //四个灯一起闪烁3次: (亮-灭) *3
    flashLed(3);

/*当闪烁完毕后,屏幕刷成绿色,同时灯常亮5秒*/
        brushLcd(lcd, green);
        openorcloseLed(0);
        sleep(5);

        /*当常亮5s结束后,屏幕刷成黄色,同时开始闪烁5次。*/
        brushLcd(lcd,yellow);
        flashLed(5);
        /*当闪烁完毕后,屏幕刷成红色,灯全灭。等待3s*/
        brushLcd(lcd, red);
        openorcloseLed(1);
        sleep(3);
        /*等待结束后加装一张图片,写上结束标识
        */
        printf("%d",lcd);
        loadbmp(open_bmp);
        printf("%d",lcd);
        openorcloseLed(1);//LED全灭
        //sleep/usleep;
        close(lcd);
        close(fd);
        return 0;
}

  • 写回答

2条回答 默认 最新

  • 泡视界 2021-11-24 20:06
    关注

    ……哪行看不懂?注释不是很全了吗?
    openorcloseLed(1); 利用ioctl对每个关闭LED
    loadbmp();打开bmp文件,跳过文件头,读取了三通道数据,放到四通道的结构体里面。然后做一个翻转操作,最后写道lcd中。
    flashLed();控制led先亮后灭,输入数字控制闪烁次数。
    brushLcd(lcd, xxxxx);将xxxxx记录的寄存器值,写到lcd中以控制颜色。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月8日
  • 已采纳回答 11月30日
  • 修改了问题 11月30日
  • 修改了问题 11月25日
  • 展开全部

悬赏问题

  • ¥20 电脑鼠标键盘不好使了
  • ¥15 求糕手!用matlab求解目标规划模型🙏
  • ¥15 画出的分类图不对,求解答一下
  • ¥20 springboot和springcloud版本问题
  • ¥15 ps2手柄控制树莓派小车
  • ¥30 C#:vsto powerpoint的外接程序
  • ¥30 stata将do文件代码转化为ado文件
  • ¥15 两个同维数组相比,不同位置、出现重复比无意义,而不同位置、不出现重复比,则有意义。把有意义的两个数组放入新的集合MK中。
  • ¥15 可以远程电脑安装nvm
  • ¥15 写一个可直接调用的函数,将32位有符号数转成另一个无符号的数