一、结构体占用的内存
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++) ---->只有C99标准才支持的。有些编译器默认的不支持C99

解决方法1:
int i=0;
for(i=0;i<10;i++)

解决方法2:
arm-linux-gcc test.c -o test -std=c99

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
//int open(const char *pathname, int flags);
//int close(int fd);
//ssize_t write(int fd, const void *buf, size_t count);
int main(void)
{int fd_lcd;int red = 0x00FF0000;int green = 0x0000FF00;int blue = 0x000000FF;fd_lcd = open("/dev/fb0", O_RDWR);if(fd_lcd == -1){perror("open lcd");return -1;}int i=0;for(i=0;i<800*480;i++){write(fd_lcd, &red, sizeof(int));}sleep(500);lseek(fd_lcd, 0, SEEK_SET);for(i=0;i<800*480;i++){write(fd_lcd, &green, sizeof(int));}sleep(500);lseek(fd_lcd, 0, SEEK_SET);for(i=0;i<800*480;i++){write(fd_lcd, &blue, sizeof(int));}sleep(500);close(fd_lcd);return 0;}
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
//int open(const char *pathname, int flags);
//int close(int fd);
//ssize_t write(int fd, const void *buf, size_t count);
int main(void)
{int fd_lcd;int c1,c2,c3;fd_lcd = open("/dev/fb0", O_RDWR);if(fd_lcd == -1){perror("open lcd");return -1;}int i=0;c1 = 0x00000000;c2 = 0x00FF0000;c3 = 0x00FFCC33;for(i=0;i<800*160;i++){write(fd_lcd, &c1, sizeof(int));}for(i=0;i<800*160;i++){write(fd_lcd, &c2, sizeof(int));}for(i=0;i<800*160;i++){write(fd_lcd, &c3, sizeof(int));}sleep(5);c1 = 0x000000FF;c2 = 0x00FFFFFF;c3 = 0x00FF0000;lseek(fd_lcd, 0, SEEK_SET);for(i = 0;i<800*480;i++){int y = 0;for(y = 0;y<266;y++){write(fd_lcd, &c1, sizeof(int));}for(y = 0;y<267;y++){write(fd_lcd, &c2, sizeof(int));}for(y = 0;y<267;y++){write(fd_lcd, &c3, sizeof(int));}}sleep(5);close(fd_lcd);return 0;}

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

  1. Linux系统编程之文件IO

    Linux系统编程之文件IO 文件IO第一天 一.标准IO基本概念 1.1c语言函数 (c库函数) 调用实现某一个功能,(API) 1.2系统调用:内核中的程序接口,应用程序和硬件设备之间的中间层 1 ...

  2. 【Linux系统编程】文件IO操作

    文件描述符 在 Linux 的世界里,一切设备皆文件.我们可以系统调用中 I/O 的函数(I:input,输入:O:output,输出),对文件进行相应的操作( open().close().writ ...

  3. Linux高级编程--05.文件读写

    缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...

  4. Linux编程(8)_文件IO

    1 C库IO函数工作流程 2 Linux 系统函数 1.open/close 函数原型: int open(const char *pathname, int flags); int open(con ...

  5. Linux Ubuntu下的文件IO介绍及实例应用(C语言)

           大家好,我是练习编程时长两年半的个人练习生昆工第一ikun,昨天咋们说了标准IO,今天咋们来分享文件IO,以及一个很有趣的实例,给图片加密,使其无法打开.话不多说,上代码. 一.文件IO ...

  6. Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】

    linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...

  7. mysql自定义函数多参数_MySQL数据库高级(二)——自定义函数

    MySQL数据库高级(二)--自定义函数 一.自定义函数简介 自定义函数 (user-defined function UDF)是一种对MySQL扩展的途径,其用法和内置函数相同. 自定义函数的两个必 ...

  8. IOS学习笔记之二十二(文件io)

    1.NSData和NSMutableData和NSURL NSData和NSMutableData表示oc的数据缓冲区 作用: 1).对数据读取NSData 2).输出NSData的数据 NSURL可 ...

  9. linux 如何产生so文件,printf()函数 【转】Linux下gcc编译生成动态链接库*.so文件并调用它(2)...

    本文仅限于介绍 linux 下的库. 1.2. 库的种类 linux 下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因 ...

最新文章

  1. 【程序员基础篇】开源中国私有库代码更新
  2. 微软解释Edge浏览器比Chrome更加安全的原因
  3. mysql after 不起作用_我的MySQL触发器不起作用,语法简单,不复杂
  4. html无限添加元素,jquery--html【添加元素】
  5. 【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)
  6. REVERSE-PRACTICE-BUUCTF-14
  7. linux mysql dump命令_linux下mysql命令
  8. [Web Chart系列之五] 图形布局-Circle Layout 之实现
  9. python dataframe 重命名列_Python-重命名pandas列
  10. ZOJ2833*(并查集)
  11. nginx——ngx_http_gzip_module
  12. 层次聚类算法_机器学习理论(十四)聚类
  13. java arraylist_Java 集合框架之 ArrayList 源码图示法简要剖析
  14. webpack 多入口打包配置示例
  15. 微信小程序云开发入门详细教程
  16. RESTFUL API 安全设计指南
  17. 测试网速_怎样测试两台电脑之间的网速
  18. js ajax同步请求造成浏览器假死的问题
  19. 密码应用安全性评估实施要点之三密钥管理要求与实现要点
  20. NOI / 2.1基本算法之枚举 1809:两倍

热门文章

  1. Doctype作用及兼容模式与标准模式的区别
  2. 专家解析跑步危害概率 过量运动同样对心脏不利
  3. 集 成 运 算 同 相放大器和反 向放大器的选择
  4. 经验指导:全国信息学竞赛(NOI)之成功诀窍
  5. 前端:一篇彻底搞懂vuex (mapState、mapGetters、mapMutations、mapActions)
  6. 全球与中国干法制粒机市场深度研究分析报告
  7. 花神游历各国(线段树)
  8. 2021年盐城中考高考成绩查询,2021年盐城中考各学校录取分数线,历年盐城中考分数线汇总...
  9. java时间戳转Date类型精确到毫秒或微秒存储到mysql
  10. 使用frida破解native层算法