为Sipeed MaixII AI开发板(base:全志V831),交叉编译C代码,利用FB在屏幕上绘制一个渐变的正方形

前言

由于工作原因,最近在调研MaixII这款开发板,Sipeed是自己非常喜欢的一个团队,极客精神下的各种开源开发板,用起来相当顺畅。

MaixII是一款基于全志V831的一款开发板,自带NPU,具有0.2T的算力,当然完整的nn工具链,我现在还没有看到。

作为前期调研,在官网示例程序跑完后,觉得还是不够带劲,既然是一款跑linux系统的板子,从底层纯C开发程序,当然是最佳选择。

为MaixII编译程序需要用到SIpeed提供的交叉编译包,这个环境是为他们的MaixPy准备的,我们只需要用到其中的gcc即可

下载链接为:

https://download.csdn.net/download/h12321hzhy/15451150

其中,toolchain下的bin文件中,包含了全志的完整工具链。

看见了gcc,g++,熟悉Linux开发的应该就知道,稳了。

 

接下来,我们设计一个程序,为在屏幕上点亮一个渐变的小方块,我非常喜欢用图形图像的例子来作为hello world。

在Linux系统中,屏幕对应的设备文件为“fb0”,在/dev目录下,我们通过操纵fb0达到对屏幕的framebuffer操控的目的。

实际代码为:

#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/fb.h>
#include <sys/mman.h>
 
int main () {
    int fp=0;
    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;
    long screensize=0;
    char *fbp = 0;
    int x = 0, y = 0;
    long location = 0;
    fp = open ("/dev/fb0",O_RDWR);
 
    if (fp < 0){
        printf("Error : Can not open framebuffer device/n");
        exit(1);
    }
 
    if (ioctl(fp,FBIOGET_FSCREENINFO,&finfo)){
        printf("Error reading fixed information/n");
        exit(2);
    }
    if (ioctl(fp,FBIOGET_VSCREENINFO,&vinfo)){
        printf("Error reading variable information/n");
        exit(3);
    }
 
    screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8;   //单帧画面空间
    /*这就是把fp所指的文件中从开始到screensize大小的内容给映射出来,得到一个指向这块空间的指针*/
    fbp =(char *) mmap (0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fp,0);
    if ((int) fbp == -1)
    {
         printf ("Error: failed to map framebuffer device to memory./n");
         exit (4);
    }
/*这是你想画的点的位置坐标,(0,0)点在屏幕左上角*/
    for(x=100;x<150;x++)
   {
        for(y=100;y<150;y++)
       {
             location = x * (vinfo.bits_per_pixel / 8) + y  *  finfo.line_length;
#if 0
             *(fbp + location) = 255;  /* 蓝色的色深 */  /*直接赋值来改变屏幕上某点的颜色*/
             *(fbp + location + 1) = 0; /* 绿色的色深*/   /*注明:这几个赋值是针对每像素四字节来设置的,如果针对每像素2字节,*/
             *(fbp + location + 2) = 0; /* 红色的色深*/   /*比如RGB565,则需要进行转化*/
             *(fbp + location + 3) = 0;  /* 是否透明*/ 
#endif
			 *(fbp + location) = 0;              //16位位深的写法控制
			 *(fbp + location + 1) = 0;   
			 *(fbp + location + 2) = 5*(y-100);         
         } 
    }
    munmap (fbp, screensize); /*解除映射*/
    close (fp);    /*关闭文件*/
    return 0;
 
}
 

接下来是编译过程

我们把代码创建为一个hello.c的文件,然后借助gcc去编译它

toolchain/bin/arm-openwrt-linux-gcc -g -O2 hello.c 

编译成功,生成一个a.out的文件

 

将a.out发送到板子中,更改权限为777之后,开始执行

执行效果为

 

 

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

碳纤维石头君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值