Linux高级应用(二)文件IO函数与液晶屏显示

本文探讨了Linux系统中结构体内存占用的计算,并详细介绍了如何使用文件IO函数在液晶屏上显示颜色。讲解了open(), read(), write(), lseek(), close()等文件操作函数,以及液晶屏的像素结构。并通过示例展示了如何打开液晶屏设备文件,写入数据实现全屏单色显示,并提供了延时函数和编译器使用的相关知识。" 110910904,10294314,Python 3.8与PyCharm连接SQL Server数据库教程,"['Python开发', '数据库管理', 'PyCharm集成', 'SQL', 'pymssql库']
摘要由CSDN通过智能技术生成

一、结构体占用的内存
struct test {
char a;
int b;
short c;
long d;
char *p;
};
求该结构体占用的内存?sizeof(struct test)
1、在32bits的系统下—(试验箱)
2、在64bits的系统下—(ubuntu12.04)

注意:
求一个结构体占用内存的大小不是简单的每个成员大小的和。需要满足一定的地址对齐方式。
char—不需要对齐
short ----地址除以2可以整除
int ----地址除以4可以整除
long(指针)—地址除以4(或者8)可以整除

二、使用Linux的文件IO函数在液晶屏上显示颜色
1、文件操作的函数
在Linux系统中“一切皆文件”,访问Linux系统中的设备和访问文件的方法是一致的。
文件IO函数:
open()
read()
write()
lseek()
close()
其他:
ioctl()
mmap()

查看函数的帮助:
gec@ubuntu:~$ man 2 open


2、液晶屏

1)处理器、显存和液晶屏的关系。

2)液晶屏的组成

液晶屏是由一个个像素点组成的,所有的像素点组成了分辨率(试验箱800*480)
像素点是液晶屏控制的最小单位。液晶屏的像素点和显存是一一对应的。
一个像素点在显存中占用4个字节:ARGB各一个字节
A—透明度 [31:24]
R—红 [23:16]
G—绿[15:8]
B—蓝[7:0]

基本颜色:
红—0x00FF0000
绿—0x0000FF00
蓝—0x000000FF


3、控制液晶屏显示单色
1)打开液晶屏—open()
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

   int open(const char *pathname, int flags);

例:
int fd_lcd;
fd_lcd = open("/dev/fb0", O_RDWR)
if(fd_lcd == -1)
{
perror(“open lcd”);
return -1;
}
printf(“fd_lcd = %d\n”,fd_lcd);
注意:
/dev/fb0 ----- 试验箱上液晶屏的设备文件(液晶屏的驱动),我们通过这个文件可以访问到液晶屏。所有的设备文件都在/dev目录下。
O_RDWR ----文件的访问属性。O_RDONLY、O_WRONLY
fd_lcd ---- 文件描述符,是一个32bits的整型值,0–STDIN,1–STDOUT,2—STDERR,3—开始分给文件。一个进程同时打开文件的数量是有限制的。

gec@ubuntu:~$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7771
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7771
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
perror(“open lcd”);----根据系统返回的错误码输出错误的原因。

注意:
open()打开文件的时候,文件的指针是指向文件的最开始的。每次写入数据,文件指针自动的移动。如何将文件指针移动到文件的最开始?
1)close()—>open()
2)lseek(fd_lcd, 0, SEEK_SET);


2)向液晶屏写入数据----write()
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

方法1----显示全屏的红色
int red = 0x00FF0000;
for(int i=0;i<800*480;i++)
{
write(fd_lcd, &red, sizeof(int));
}

方法2----显示全屏的绿色
int lcd_buf[800480];
for(int i=0;i<800
480;i++)
lcd_buf[i]=0x0000FF00;
write(fd_lcd, lcd_buf, sizeof(lcd_buf));

方法3----显示全屏的蓝色
int lcd_buf[480][800];
for(int j=0;j<480;j++)
for(int i=0;i<800;i++)
lcd_buf[j][i] = 0x000000FF;

write(fd_lcd, lcd_buf, sizeof(lcd_buf));


3)关闭液晶屏—close()
#include <unistd.h>

   int close(int fd);

例:
close(fd_lcd);

实验1:一定要理解原理。

struct test {
char a;
int b;
short c;
long d;
char *p;
};
求该结构体占用的内存?sizeof(struct test)
1、在32bits的系统下—(试验箱)
2、在64bits的系统下—(ubuntu12.04)

注意:
求一个结构体占用内存的大小不是简单的每个成员大小的和。需要满足一定的地址对齐方式。
char—不需要对齐
short ----地址除以2可以整除
int ----地址除以4可以整除
long(指针)—地址除以4(或者8)可以整除

变形:
struct test {
char a;
short c;
int b;
long d;
char *p;
};
sizeof(struct test)
思考:如何定义结构体比较节省内存?

实验2
在液晶屏上显示一个全屏的单色。(3个步骤)

实验3
在液晶屏上循环显示红、绿、蓝、黑、白、黄、紫、…

实验4
在液晶屏上显示德国国旗、法国国旗、日本国旗

提示:
1、延时函数
#include <unistd.h>
unsigned int sleep(unsigned int seconds); //秒级延时
int usleep(useconds_t usec); //微秒级延时

例:
500ms(0.5s)
usleep(500*1000);
msleep()没有这个函数

2、编译器
1)ubuntu
gcc test.c -o test
g++ test.cpp -o test

2)试验箱
arm-linux-gcc test.c -o test
arm-linux-g++ test.cpp -o test

注意:C语言的标准
for(int i=0;i<10;i&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值