这里写目录标题
| 像素点 | A(透明度) | R(red) | G(green) | B(blue) |
|---|---|---|---|---|
| color | 00 | ff | 00 | 00 |
unsigned int color = 0x00ff0000;
int lcd_fd;
lcd_fd = open("/dev/fb0",O_RDWR);
if(lcd_fd == -1)
{
printf("open error\n");
return -1;
}
int *plcd; //假设这个指针是指向lcd屏幕的首地址!
*plcd = 0x00ff0000; //给第一个像素点写入红色
*(plcd+1) = 0x00ff0000 ; //这是给lcd屏幕第二个像素点写入红色
for(int y = 0 ; y < 480 ; y++)
{
for(int x = 0 ; x < 800 ; x++)
{
*(plcd + y * 800 + x) = 0x00ff0000; // color
}
}
//写一个画点的封装函数!
void Lcd_Draw_point(int x , int y , int color)
{
if(x<800&&x>=0&&y<480&&y>=0)
{
*(plcd + y * 800 + x) = color;
}
}
NAME
mmap, munmap - map or unmap files or devices into memory
映射 ,把屏幕的首地址,镜像给我们!!
SYNOPSIS
#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 :映射的文件的大小 480*800*4
int prot : 权限
PROT_READ : 可读
PROT_WRITE : 可写
PROT_EXEC : 可执行
PROT_READ | PROT_WRITE | PROT_EXEC
int flags : 属性 MAP_SHARED
int fd : 文件描述符
off_t offset : 偏移量 , 0
返回值:
例子:
int *plcd = mmap(NULL , 480*800*4 , PROT_READ | PROT_WRITE | PROT_EXEC , MAP_SHARED , lcd_fd , 0);
int munmap(void *addr, size_t length);
void *addr : plcd 是我们映射lcd屏幕过来的首地址
size_t length :480*800*4
int bmp_fd ;
bmp_fd = open("./1.bmp",O_RDWR);
if(bmp_fd == -1)
{
printf("open bmp error\n");
return -1;
}
BITMAP头:
0x00 2字节 保存BM
DIB:
0x12 4字节 表示是位图的宽度
位图的宽度:每一行有多少个像素点!
int width;
lseek(bmp_fd,0x12,SEEK_SET);
int r = read(bmp_fd,&width,4);
if(r == -1)
{
printf("read error\n");
return -1;
}
printf("width == %d\n", width);
width > 0 :它的像素点的保存顺序就是从左边到右边
< 0 :则反之
0x16 4字节 表示是位图的高度
位图的高度:每一列有多少个像素点!
high > 0
< 0
0x1C 两个字节 表示是位图的色深
short depth;
depth == 24 //3个字节
保存的东西为 R G B A:默认为0
depth == 32 //四个字节
保存的东西为 A R G B
像素数组的大小:abs(width) * abs(high) * (depth/8)
0x36 像素数组:保存每个像素点
在开发板上任意坐标显示一张任意分辨率的bmp图片
触摸屏的路径名: “/dev/input/event0”
int touch_fd = open("/dev/input/event0",O_RDONLY);
if(touch_fd == -1)
{
printf("open touch error\n");
return -1;
}
NOTE:
触摸板文件跟其他文件不同的是,它的内容吧,不是用数组保存,而是用一个结构体!
在linux系统下面,所以的输入事件(鼠标,键盘,触摸板。。。)都用一个结构体来表示的
struct input_event
{
struct timeval time; //输入事件的时间
_u16 type ; //事件的类型,如下:
type == EV_KEY 表示这是一个按键事件
type == EV_REL 表示这是一个鼠标事件
type == EV_ABS 表示的是一个触摸板事件
type == EV_SYN 事件的分割标志
_u16 code; //要根据type的不同,它表示的含义也就不一样了
type == EV_KEY 表示这是一个按键事件
code 表示的是按键事件的键值 code == BTN_TOUCH
type == EV_REL 表示这是一个鼠标事件
//这个暂时我们不讲!!因为我们用不到!
type == EV_ABS 表示的是一个触摸板事件
code 有几个值
code == ABS_X 表示这是X轴的坐标
code == ABS_Y 表示这是Y轴的坐标
code == ABS_PRESSURE 表示这是给触摸板的压力
_u16 value; //要根据type和code的不同,它表示的含义就不一样
type == EV_KEY
code == BTN_TOUCH
value == 1 或者value == 0 表示按键按下/按键弹起
type == EV_ABS
code == ABS_X
value == x轴坐标
code == ABS_Y
value == y轴坐标
code == ABS_PRESSURE
value == 压力值
};
int xy_read()
{
int x_read = -1;
int y_read = -1;
struct input_event ev;
while(1)
{
read();
if(ev.type && ev.code)
{
}
}
}
//获取坐标
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <unistd.h>
#include <string.h>
#define TOUCH_PATH "/dev/input/event0"
int touch_fd;
int xy_read()
{
//1.打开触摸屏
touch_fd = open(TOUCH_PATH,O_RDONLY);//只读打开
if(touch_fd<0)
{
perror("open fail");
return 0;
}
int x_read = -1;
int y_read = -1;
//定义一个结构体叫ev
struct input_event ev;
//一直读取触摸板信息
while(1)
{
//读取屏幕
read(touch_fd, &ev, sizeof(struct input_event));//第三个参数ev
if(ev.type == EV_KEY && ev.code == BTN_TOUCH)
{
if(ev.value == 1)
{
printf("down\n");
}
else
{
printf("up\n");
}
}
if(ev.type == EV_ABS) //触摸事件
{
if(ev.code == ABS_X)
{
x_read = ev.value; //x轴
}
if(ev.code == ABS_Y) //y轴
{
y_read = ev.value;
}
printf("(%d,%d)\n", x_read, y_read);
}
}
}
int main()
{
xy_read();
close(touch_fd);
}
我们的一个main就是一个进程
并发:同时进行两个或者两个以上的执行任务
线程就是我们主函数的一个分支,是比进程更加小的活动的单位,执行分支。
线程和进程都是我们平时所说的并发的一种方式!
指令它必须在函数的内部,线程的指令也会封装在函数的内部, 那么我们封装线程的指令函数叫做线程函数!!!
线程函数的原型:
typedef void * (*start_routine_t)(void *)
这样子的一个指针会指向我们的线程函数!!!
那么线程函数是该长什么样子呢??
参数:void *
返回值:void *
void * display_adv(void *)
{
while(1)
{
//在你们的2048棋盘的旁边显示一个电子相册,用来播放小广告
//显示第一个广告
sleep(5);
//显示第二个广告
sleep(5);
}
}
NAME
pthread_create - create a new thread
创建一个新的线程
SYNOPSIS
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
pthread_t *thread : 指向你保存id号的那个空间!!!
const pthread_attr_t *attr : 表示线程的属性,一般为NULL,采用的是默认的属性
void *(*start_routine) (void *) : *start_routine : 指向它对应的线程函数
我们上面开创线程的目的就是为了人这个线程去执行线程函数!!
void * arg :其实它就是将要作为线程函数的实参传入!!!
Compile and link with -pthread.编译时加上-pthread
gcc xxx.c -o xxx -pthread
例子:
int main()
{
pthread_t id;
pthread_create(&id,NULL,&display_adv,NULL);
while(1)
{
show();
}
}
pthrad_t ad_th_num; // 定义一个线程号
pthread_create(&ad_th_num,NULL,&ad,NULL);
//线程任务函数 --- 广告
void * ad(void * arg)
{
while(1)
{
bmp_show("");
sleep(3);
bmp_show("");
sleep(3);
}
}
madplay的用法:madplay 路径
madplay ./mp3/1.mp3
* system
NAME
system - execute a shell command
SYNOPSIS
#include <stdlib.h>
int system(const char *command);
const char *command : 是一个字符串,然后整个字符串就是我们要执行的那个命令!
char cmd[100];
sprintf(cmd,"madplay ./mp3/1.mp3");
sprintf(cmd,"madplay %s" , p);
上一篇:
粤嵌GEC6818-学习笔记1-基础篇https://blog.csdn.net/weixin_45735391/article/details/125350683
下一篇:
粤嵌GEC6818-学习笔记3-相关项目https://blog.csdn.net/weixin_45735391/article/details/125820496
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我
如何学习ruby的正则表达式?(对于假人) 最佳答案 http://www.rubular.com/在Ruby中使用正则表达式时是一个很棒的工具,因为它可以立即将结果可视化。 关于ruby-我如何学习ruby的正则表达式?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1881231/
我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。
假设您有一个可执行文件foo.rb,其库bar.rb的布局如下:/bin/foo.rb/lib/bar.rb在foo.rb的header中放置以下要求以在bar.rb中引入功能:requireFile.dirname(__FILE__)+"../lib/bar.rb"只要对foo.rb的所有调用都是直接的,这就可以正常工作。如果你把$HOME/project和符号链接(symboliclink)foo.rb放入$HOME/usr/bin,然后__FILE__解析为$HOME/usr/bin/foo.rb,因此无法找到bar.rb关于foo.rb的目录名.我意识到像rubygems这