欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > ARM Linux C LCD屏 调用write()显示单色出现花屏、条状不消影

ARM Linux C LCD屏 调用write()显示单色出现花屏、条状不消影

2024/10/25 2:24:23 来源:https://blog.csdn.net/m0_64089565/article/details/140261736  浏览:    关键词:ARM Linux C LCD屏 调用write()显示单色出现花屏、条状不消影

        原因排查

        液晶屏出现花屏现象的原因可以有多种,其中一种可能的原因是由于在向液晶屏的设备文件写入数据时,使用了write()这个系统调用函数。

        write()是一个Linux内核提供的函数,用于应用程序与内核之间的数据交互。它允许应用程序向设备文件写入数据,包括液晶屏设备文件。然而,由于write()是通过系统调用方式来传递数据,它涉及到应用程序与内核之间的切换和数据传输,导致效率较低。

        当write()函数被调用时,应用程序会将数据传递给内核进行处理。然后,内核会根据设备文件的设置将数据发送到液晶屏。然而,由于液晶屏的刷新速度有限,如果应用程序写入数据的速度过快,可能会导致液晶屏无法及时刷新,从而产生花屏现象。

        此外,液晶屏花屏的原因还可能与其他因素相关,例如驱动程序的问题、连接线松动或损坏、液晶屏本身的故障等。因此,在排除了write()函数使用引起的问题后,还需要进一步检查其他可能原因。

        解决办法

        直接映射显存,对显存进行像素点信息的赋值。

1. 显存映射,获取应用程序中的显存首地址

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

参数说明:
- void *addr ---- 需要映射的内存中显示的首地址,如果使用NULL,系统自动获取
- size_t length ---- 需要映射的内存大小,显存大小为800*480*4
- int prot ----- 映射后内存的访问属性,通常为PROT_READ|PROT_WRITE
- int flags ---- 映射后显存的标志,MAP_SHARED表示映射后的显存多个进程都可以访问
- off_t offset ---- 映射内存的偏移量,通常为0

返回值:
- void *---- 在应用程序中,得到映射后的显存首地址,通过该地址可以访问显存。

示例代码:

int *lcd_base = NULL; // int表示每个像素点占用内存4B
lcd_base = (int *)mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED,fd_lcd, 0);
if (lcd_base == NULL)return -2;

2. 通过显存首地址将颜色数据写入显存
显存首地址:int *lcd_base
显存中任意一个像素点(x,y)的地址:int *(lcd_base + 800*y+x)

示例代码:

for (int y = 0; y < 480; y++)for (int x = 0; x < 800; x++)*(lcd_base + 800*y + x) = 0x00FF0000; // 全屏红色

3. 解除显存映射

int munmap(void *addr, size_t length);

示例代码:

munmap(lcd_base, 800*480*4);

4. 关闭液晶屏

示例代码:

close(fd_lcd);

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com