一、结构体占用的内存
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<800480;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&#