承接实训第二天:zigbee无线传感网实训---读、写文件操作以及LCD显示屏显示颜色(two day)
一、bmp图片的显示
1、内存映射(给开发板的LCD屏分配显存)mmap
#include
void *mmap(void *addr, //映射内存的起始地址
size_t length, //映射内存大小
int prot, //映射的方式(以什么方式操作映射内存) PROT_EXEC PROT_READ PROT_WRITE PROT_NONE
int flags, //映射内存权限(其他进程和线程访问权限) MAP_SHARED MAP_PRIVATE
int fd, //映射设备的文件描述符
off_t offset //映射内存与LCDD的偏移量,0代表完全重合
);
返回值:
成功:返回指向该映射内存首地址的指针
失败:返回NULL
2、解除映射
int munmap(void *addr, //映射内存的地址
size_t length); //映射内存的大小
返回值:
成功:0
失败:-1
3、内存拷贝
#include
const void *src, //源内容的地址
size_t n //拷贝的字节数
);
补充:
永久配置开发板的ip:
使用vi编辑器更改/etc/profile文件
在最后一行加上ip分配即可(ifconfig eth0 192.168.1.*)
若要屏蔽“物联网系统”使用“#”注释掉“cd /IOT”及“./iot &”后面可添加切换到工作路径“cd /**”
重启开发板“reboot”
-std=c99
练习:
1、通过编程实现与在命令窗口的cp(复制)功能相同的程序代码(copy.c)
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
if(argc<3)
{
printf("参数不够!\n");
exit(0);
}
int fd1 = open(argv[1], O_RDWR);
int fd2 = open(argv[2], O_RDWR|O_CREAT|O_TRUNC, 0666);
if(fd1 == -1 || fd2==-1)
{
perror("打开文件失败:\n");
exit(0);
}
char buf[1024];
int ret = 1;
int k=0;
while(ret)
{
//清空缓冲区
memcpy(buf, &k, sizeof(buf));
ret = read(fd1, buf, sizeof(buf));
if(ret>0)
{
write(fd2, buf, ret);
}
if(ret<0)
{
break;
}
}
close(fd1);
close(fd2);
return 0;
}
2、实现将bmp图片显示在开发板的显示屏上(show_bmp.c)
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
int lcd = open("/dev/fb0", O_RDWR);
if(lcd == -1)
{
perror("打开LCD失败");
exit(0);
}
// 2, 映射一块恰当大小的内存
char *p = mmap(NULL, // 不指定映射内存的位置,让系统自动选取
800*480*4, // 映射内存的大小
PROT_READ | PROT_WRITE, // 以读、写模式操作映射内存
MAP_SHARED, // 其他线程、进程可以共享访问这块内存
lcd, // LCD文件描述符
0 // 映射内存与LCD的偏移量,0代表完全重合
);
// 3, 准备数据
if(argc < 2)
{
printf("参数不对!\n");
close(lcd);
munmap(p, 800*480*4);
exit(0);
}
int bmp = open(argv[1], O_RDONLY);
if(bmp == -1)
{
perror("打开图片失败!");
close(lcd);
munmap(p, 800*480*4);
exit(0);
}
char bmp_buf[800*480*3];
int ret = read(bmp, bmp_buf, sizeof(bmp_buf));
if(ret <= 0)
{
perror("读取bmp数据失败!");
close(lcd);
close(bmp);
munmap(p, 800*480*4);
exit(0);
}
int lcd_buf[800*480];
// 4, 铺满整个映射内存
for(int i=0; i<800*480; i++)
{
lcd_buf[i]=bmp_buf[i*3] | bmp_buf[i*3+1]<<8 | bmp_buf[i*3+2]<<16;
}
for(int y=0; y<480; y++)
{
for(int x=0; x<800; x++)
{
memcpy(p+4*x+800*4*y, &lcd_buf[x+(479-y)*800], 4);
}
}
// 5, 释放资源
munmap(p, 800*480*4);
close(lcd);
return 0;
步骤:
(1)编译程序:
(2)打开tftp
(3)在开发板上下载编译程序并执行
(4)效果显示
3、计算数据类型所占字节(size.c)
#include
int main(void)
{
printf("int32_t size: %lu\n", sizeof(int));
printf("char size: %lu\n", sizeof(char));
printf("float size: %lu\n", sizeof(float));
printf("double size: %lu\n", sizeof(double));
return 0;
}
4、两数相加(sum.c)
#include
#include
int fun(int a, int b)
{
return a+b;
}
int main(int argc, char *argv[])
{
printf("argc = %d\n", argc);
for(int i=0; i
注:习题2中存在bug,将在第四天解决。
实训第四天将学习:在LCD屏上显示JPG图片、 触摸屏、相册:zigbee无线传感网实训---在LCD屏上显示JPG图片、 触摸屏、相册(The fourth day)