Linux高级应用(二)文件IO函数与液晶屏显示
一、结构体占用的内存
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++) ---->只有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函数与液晶屏显示相关推荐
- Linux系统编程之文件IO
Linux系统编程之文件IO 文件IO第一天 一.标准IO基本概念 1.1c语言函数 (c库函数) 调用实现某一个功能,(API) 1.2系统调用:内核中的程序接口,应用程序和硬件设备之间的中间层 1 ...
- 【Linux系统编程】文件IO操作
文件描述符 在 Linux 的世界里,一切设备皆文件.我们可以系统调用中 I/O 的函数(I:input,输入:O:output,输出),对文件进行相应的操作( open().close().writ ...
- Linux高级编程--05.文件读写
缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...
- Linux编程(8)_文件IO
1 C库IO函数工作流程 2 Linux 系统函数 1.open/close 函数原型: int open(const char *pathname, int flags); int open(con ...
- Linux Ubuntu下的文件IO介绍及实例应用(C语言)
大家好,我是练习编程时长两年半的个人练习生昆工第一ikun,昨天咋们说了标准IO,今天咋们来分享文件IO,以及一个很有趣的实例,给图片加密,使其无法打开.话不多说,上代码. 一.文件IO ...
- Linux系统编程【文件IO、进程、进程间通信、信号、线程、互斥】
linux系统编程 个人通过学习,手打了一份48000字的Linux系统编程的笔记,包含了[文件IO.进程.进程间通信.信号.多线程.互斥]等知识点,并给出了大量的代码案例对每个重要的知识点进行了代码 ...
- mysql自定义函数多参数_MySQL数据库高级(二)——自定义函数
MySQL数据库高级(二)--自定义函数 一.自定义函数简介 自定义函数 (user-defined function UDF)是一种对MySQL扩展的途径,其用法和内置函数相同. 自定义函数的两个必 ...
- IOS学习笔记之二十二(文件io)
1.NSData和NSMutableData和NSURL NSData和NSMutableData表示oc的数据缓冲区 作用: 1).对数据读取NSData 2).输出NSData的数据 NSURL可 ...
- linux 如何产生so文件,printf()函数 【转】Linux下gcc编译生成动态链接库*.so文件并调用它(2)...
本文仅限于介绍 linux 下的库. 1.2. 库的种类 linux 下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在编译过程中已经被载入可执行程序,因 ...
最新文章
- 【程序员基础篇】开源中国私有库代码更新
- 微软解释Edge浏览器比Chrome更加安全的原因
- mysql after 不起作用_我的MySQL触发器不起作用,语法简单,不复杂
- html无限添加元素,jquery--html【添加元素】
- 【LCT】【树状数组】Matches Are Not a Child‘s Play(luogu CF1137F)
- REVERSE-PRACTICE-BUUCTF-14
- linux mysql dump命令_linux下mysql命令
- [Web Chart系列之五] 图形布局-Circle Layout 之实现
- python dataframe 重命名列_Python-重命名pandas列
- ZOJ2833*(并查集)
- nginx——ngx_http_gzip_module
- 层次聚类算法_机器学习理论(十四)聚类
- java arraylist_Java 集合框架之 ArrayList 源码图示法简要剖析
- webpack 多入口打包配置示例
- 微信小程序云开发入门详细教程
- RESTFUL API 安全设计指南
- 测试网速_怎样测试两台电脑之间的网速
- js ajax同步请求造成浏览器假死的问题
- 密码应用安全性评估实施要点之三密钥管理要求与实现要点
- NOI / 2.1基本算法之枚举 1809:两倍
热门文章
- Doctype作用及兼容模式与标准模式的区别
- 专家解析跑步危害概率 过量运动同样对心脏不利
- 集 成 运 算 同 相放大器和反 向放大器的选择
- 经验指导:全国信息学竞赛(NOI)之成功诀窍
- 前端:一篇彻底搞懂vuex (mapState、mapGetters、mapMutations、mapActions)
- 全球与中国干法制粒机市场深度研究分析报告
- 花神游历各国(线段树)
- 2021年盐城中考高考成绩查询,2021年盐城中考各学校录取分数线,历年盐城中考分数线汇总...
- java时间戳转Date类型精确到毫秒或微秒存储到mysql
- 使用frida破解native层算法