建设c2c网站需要多少投资,深圳品牌策划公司计划书,软件技术就业前景分析,seo顾问服务 乐云践新专家编写使用多buffer的应用程序 文章目录编写使用多buffer的应用程序一、 编写一个支持单buffer、多buffer的APP二、 编译程序2.1 设置工具链2.2 编译三、上机测试3.1 恢复内核使用自带的LCD驱动3.2 禁止开发板自带的GUI程序3.3 把测试程序放到板子上、执行四、 LCD自动黑屏致谢一…编写使用多buffer的应用程序 文章目录编写使用多buffer的应用程序一、 编写一个支持单buffer、多buffer的APP二、 编译程序2.1 设置工具链2.2 编译三、上机测试3.1 恢复内核使用自带的LCD驱动3.2 禁止开发板自带的GUI程序3.3 把测试程序放到板子上、执行四、 LCD自动黑屏致谢一、 编写一个支持单buffer、多buffer的APP
循环显示整屏幕的红、绿、蓝、黑、白。
二、 编译程序
2.1 设置工具链 对于IMX6ULL export ARCHarm
export CROSS_COMPILEarm-linux-gnueabihf-
export PATH$PATH:/work/imx6ull-sdk/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin2.2 编译
#include sys/mman.h
#include sys/types.h
#include sys/stat.h
#include unistd.h
#include linux/fb.h
#include fcntl.h
#include stdio.h
#include string.h
#include sys/ioctl.h
#include time.hstatic int fd_fb;
static struct fb_fix_screeninfo fix; /* Current fix */
static struct fb_var_screeninfo var; /* Current var */
static int screen_size;
static unsigned char *fb_base;
static unsigned int line_width;
static unsigned int pixel_width;/******************************************************************************** FunctionName: lcd_put_pixel* Author: Hilbert* DateTime: 2023年2月23日T12:38:510800* Purpose: 在LCD指定位置上输出指定颜色描点* param: x坐标y坐标颜色
*******************************************************************************/
void lcd_put_pixel(void *fb_base, int x, int y, unsigned int color)
{unsigned char *pen_8 fb_basey*line_widthx*pixel_width;unsigned short *pen_16; unsigned int *pen_32; unsigned int red, green, blue; pen_16 (unsigned short *)pen_8;pen_32 (unsigned int *)pen_8;switch (var.bits_per_pixel){case 8:{*pen_8 color;break;}case 16:{/* 565 */red (color 16) 0xff;green (color 8) 0xff;blue (color 0) 0xff;color ((red 3) 11) | ((green 2) 5) | (blue 3);*pen_16 color;break;}case 32:{*pen_32 color;break;}default:{printf(cant surport %dbpp\n, var.bits_per_pixel);break;}}
}void lcd_draw_screen(void *fb_base, unsigned int color)
{int x, y;for (x 0; x var.xres; x)for (y 0; y var.yres; y)lcd_put_pixel(fb_base, x, y, color);
}/* ./multi_framebuffer_test single* ./multi_framebuffer_test double*/
int main(int argc, char **argv)
{int i;int ret;int nBuffers;int nNextBuffer 1;char *pNextBuffer;unsigned int colors[] {0x00FF0000, 0x0000FF00, 0x000000FF, 0, 0x00FFFFFF}; /* 0x00RRGGBB */struct timespec time;time.tv_sec 0;time.tv_nsec 100000000;if (argc ! 2){printf(Usage : %s single|double\n, argv[0]);return -1;}fd_fb open(/dev/fb0, O_RDWR);if (fd_fb 0){printf(cant open /dev/fb0\n);return -1;}if (ioctl(fd_fb, FBIOGET_FSCREENINFO, fix)){printf(cant get fix\n);return -1;}if (ioctl(fd_fb, FBIOGET_VSCREENINFO, var)){printf(cant get var\n);return -1;}line_width var.xres * var.bits_per_pixel / 8;pixel_width var.bits_per_pixel / 8;screen_size var.xres * var.yres * var.bits_per_pixel / 8;nBuffers fix.smem_len / screen_size;printf(nBuffers %d\n, nBuffers);fb_base (unsigned char *)mmap(NULL , fix.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd_fb, 0);if (fb_base (unsigned char *)-1){printf(cant mmap\n);return -1;}if ((argv[1][0] s) || (nBuffers 1)){while (1){/* use single buffer */for (i 0; i sizeof(colors)/sizeof(colors[0]); i){lcd_draw_screen(fb_base, colors[i]);nanosleep(time, NULL);}}}else{/* use double buffer *//* a. enable use multi buffers */var.yres_virtual nBuffers * var.yres;ioctl(fd_fb, FBIOPUT_VSCREENINFO, var);while (1){for (i 0; i sizeof(colors)/sizeof(colors[0]); i){/* get buffer */pNextBuffer fb_base nNextBuffer * screen_size;/* set buffer */lcd_draw_screen(pNextBuffer, colors[i]);/* switch buffer */var.yoffset nNextBuffer * var.yres;ioctl(fd_fb, FBIOPAN_DISPLAY, var);ret 0;ioctl(fd_fb, FBIO_WAITFORVSYNC, ret);nNextBuffer !nNextBuffer;nanosleep(time, NULL);}}}munmap(fb_base , screen_size);close(fd_fb);return 0;
}设置好工具链后把use_multi_framebuffer上传到Ubuntu在该目录下执行make即可
三、上机测试
3.1 恢复内核使用自带的LCD驱动
恢复驱动程序修改drivers/video/fbdev/Makefile恢复内核自带的mxsfb.c如下
obj-$(CONFIG_FB_MXS) mxsfb.o
#obj-$(CONFIG_FB_MXS) lcd_drv.o编译设备树 把设备村文件复制到内核arch/arm/boo/dts目录 重新编译内核、设备树 make zImage
make dtbs替换内核、设备树 把编译出来的arch/arm/boot/zImage、arch/arm/boot/dts/imx6ull-14x14.dtb放到开发板的/boot目录
3.2 禁止开发板自带的GUI程序
在开发板上执行以下命令
[originalubuntu:~]# mv /etc/init.d/S99myirhmi2 /etc/
[originalubuntu:~]# reboot3.3 把测试程序放到板子上、执行
以下命令在开发板中执行。 挂载NFS vmware使用NAT(假设windowsIP为192.168.1.100) [originalubuntu:~]# mount -t nfs -o nolock,vers3,port2049,mountport9999
192.168.1.100:/work/nfs_rootfs /mntvmware使用桥接或者不使用vmware而是直接使用服务器假设Ubuntu IP为192.168.19.25 [originalubuntu:~]# mount -t nfs -o nolock,vers3 192.168.96.25:/work/nfs_rootfs /mnt复制、执行程序 [originalubuntu:~]# cp /mnt/multi_framebuffer_test /bin
[originalubuntu:~]# multi_framebuffer_test single 或 multi_framebuffer_test double四、 LCD自动黑屏
为了省电LCD在10分钟左右会自动黑屏。 如果你正在运行multi_framebuffer_test程序可能会有如下提示(以IMX6ULL为例)
[ 961.147548] mxsfb 21c8000.lcdif: cant wait for VSYNC when fb is blank这表示当屏幕为blank(黑屏)时无法等待VSYNC。
我们可以禁止LCD自动黑屏执行以下命令即可
#close lcd sleep
echo -e \033[9;0] /dev/tty1
echo -e \033[?25l /dev/tty1致谢 以上笔记源自韦东山老师的视频课程感谢韦老师,韦老师是嵌入式培训界一股清流为嵌入式linux开发点起的星星之火也愿韦老师桃李满园。聚是一团火散是满天星 在这样一个速食的时代坚持做自己慢下来潜心琢磨心怀敬畏领悟知识才能向下扎到根向上捅破天背着世界往前行 仅此向嵌入行业里的每一个认真做技术的从业者致敬