当前位置:网站首页>韦东山第三期课程内容概要
韦东山第三期课程内容概要
2022-07-07 22:21:00 【拾柒47】
韦东山第三期课程内容概要
- 1文件浏览器&数码相框
- 1.1 数码相框之系统框架
- 2.1 数码相框-字符的编码方式
- 2.2 数码相框-字符的点阵表示
- 2.3.1 数码相框-freetype理论介绍
- 2.3.3 数码相框-在LCD上显示一个矢量字体
- 6.1 一个小时学会网络编程
- 7 libjpeg的使用
- 8.1 数码相框功能及程序框架
- 8.2 数码相框程序编写-先写框架
- 8.3.1 数码相框程序编写-图标显示之bmp数据提取
- 8.3.2 数码相框程序编写-图标显示之缩放
- 8.3.3 数码相框程序编写-图标显示之测试
- 8.4.1 数码相框程序编写-MainPage显存管理
- 8.4.2 数码相框程序编写-MainPage页面规划
- 8.4.3 数码相框程序编写-MainPage输入功能
1文件浏览器&数码相框
1.1 数码相框之系统框架
介绍整个项目的需求和设计框架,最后33min处简单解释了为什么要写多进程、多线程的程序。
2.1 数码相框-字符的编码方式
讲ASCII码,中文的编码,一个字节表示ASCII码,内地中文一般用两个字节,全世界统一的unicode编码表,用三字节表示。unicode三字节,太浪费,解决方法是演化出UTF-8 UTF-16LE(小端) UTF-16BE(大端)等表示Unicode的方法。 UTF-16用16位表示Unicode,也就是省略了高位。UTF-8不是用8位表示Unicode,而是变长度的方式,可大可小,用的最广,会根据是英文字符还是中文来变长度的表示。
上面只是编码,也就是某个二进制对应什么具体字符,但是这个字符如何通过点阵显示成不同的字,这些字又是什么字体,比如宋体等。
实际上,不同的字体,比如宋体,楷体等,代表不同的字体文件(不同的点阵方式),这些字体文件里也包含了编码表。也就是说最终只需要一个字体文件。
源文件用不同的编码方式编写,会导致不同结果,比如中文的表示不同,导致printf出来结果不同,因此在编译程序时要指定字符集,具体设置在视频48min,如果不设置,默认是UTF-8。
2.2 数码相框-字符的点阵表示
2.1讲的是计算机如何通过二进制辨识出其代表的字符,对于字符在LCD上的显示来说,LCD是一个个像素点,单个像素点只能表示一个颜色点,不能表示字符,字符一般都是通过许多像素点组合起来表示的。在Linux内核中已经有了关于字符点阵表示的文件,font_xx.c,比如font_8x16.c表示一个字符用8乘16个像素点来表示,这些像素点的亮灭组成一个字符,所以存储一个字符的点阵信息需要8乘16个位,也即是16个字节,这些信息都已经放在了font_8x16.c中。
14min以后,开始编程,通过LCD驱动,在LCD上显示某个字符,里面有设计HZK16的一些使用,点阵实现输出中文有点难,建议会用就行,不用看具体函数实现。43min起开始将怎么通过LCD为单个像素上色的函数lcd_put_pixel。
整个视频是在LCD驱动之上,写了一个用到LCD驱动的应用程序,视频最后部分是这个应用程序的测试。
2.3.1 数码相框-freetype理论介绍
2.2通过点阵进行显示有一个缺点,就是每个字的大小是固定的,不能进行缩放。改进为矢量字体,矢量字体只存放字体的关键节点,显示时再用数学曲线(贝塞尔曲线)将关键点连接起来。
freeetype是别人做好的库,用于实现矢量字体,视频主要是介绍怎么用这个库。
2.3.3 数码相框-在LCD上显示一个矢量字体
6.1 一个小时学会网络编程
为什么要用网络编程: 我们单板上的输出一般通过串口进行输出,如果有成千上百个设备需要打印调试信息,用串口太麻烦而且也不好管理;而且串口打印很慢,如果需要打印信息的设备太多,程序会很慢;而且串口打印一般是在调试的时候,调试完成了会去掉,这样实际运行时如果出现问题,就没有错误打印这个功能了,解决方法就是通过网络编程将信息打印到另一台机器,方便随时观察。
所谓网络编程,实际上就是通过网络进行数据的传输。所有数据的传输都可以概括为三个方面:传送方、接收方、传输协议。在网络编程中,传送方和接收方一般是服务器和客户端,客户端主动的发起数据传输请求,服务器被动的响应数据传输。服务器和客户端之间通过网络进行数据传输的协议为TCP或者UDP。客户端和服务端实际上指的是两个程序,客户端程序和服务端程序,这两个程序可以运行在两个机器上(实现两个机器之间的网络传输),也可以运行在同一台机器上(自发自收)。
TCP协议: TCP协议是可靠型的,会有一些验证信息,比如三次或者四次握手等,通过验证机制发现某一帧传输错误会重新传送。TCP在发数据之前需要服务器和客户端建立链接。TCP协议涉及的函数调用总结在17:00
UDP协议: UDP协议是不可靠型的,没有验证信息,只管不断的传。UDP在发数据之前不需要服务器和客户端建立链接
7 libjpeg的使用
想要在LCD上显示图片,需要把jpg图片解压出其中的RGB数据,再把这些RGB数据放到显存中,解压需要用到libjpeg这个库。
整个视频都在讲解怎么用这个库显示图片,视频最后能够在LCD上显示图片了。
8.1 数码相框功能及程序框架
10min左右讲解了所谓的面向对象的编程思想,结合C++类和对象的思想;多线程用于实现提前准备在当前界面下,下一步可能进行的操作。
8.2 数码相框程序编写-先写框架
10min左右讲解了所谓的面向对象的编程思想,结合C++类和对象的思想;多线程用于实现提前准备在当前界面下,下一步可能进行的操作(韦东山本人并未实现预先准备的多线程),除此之外多线程还有用于监控触摸屏传来的信息。
8.3.1 数码相框程序编写-图标显示之bmp数据提取
主要讲bmp图标的解析,从网上找到bmp文件转换为十六进制以后的排版格式,然后malloc一个空间,将打开的bmp文件中对应位置上的像素信息拷贝到内存空间中。注意这是图标,不是图片,这个项目的图标只支持bmp格式。主要程序在bmp.c。
8.3.2 数码相框程序编写-图标显示之缩放
制作的图标太大了,需要缩小。网上查找图片缩放算法,选了一个最简单的,近邻取样插值方法缩放图片,思想为按比例缩放,根据比例算出缩放后的坐标信息,缩放的程序主要在zoom.c。38min以后,缩小后的图片所需要的显存比较小,而我们的显存很大,可以将多个缩小后的图片的像素信息合并在一起,再统一放入显存。
8.3.3 数码相框程序编写-图标显示之测试
测试前两节写的程序,注意他的操作步骤,通过shell将打开的文件名传递给main,打开bmp文件后通过mmap将文件映射到内存,再通过前两节写的程序进行缩放和显示。后面一半的视频都在调试编译。
8.4.1 数码相框程序编写-MainPage显存管理
写LCD驱动程序时,会在内存中分配一块固定的内存用于存放像素数据,称为framebuffer,LCD控制器会自动将framebuffer中的数据取出来发给LCD,从而进行显示。对于应用程序,先打开LCD驱动程序,得到framebuffer的地址,然后就可以直接将像素数据写到framebuffer中,不过如果系统运行得很慢的话,这样会导致显示出来的图片很卡(为什么卡,是因为直接向framebuffer中写数据,是一行一行的写,程序先从外存中打开图片文件,将其解析,得到像素数据,再将像素数据memcopy到内存,再从内存通过循环语句一个字节一个字节的写入framebuffer)。
改善方法是先malloc一块和framebuffer一样大的内存,事先将像素数据写到这块malloc的内存中,需要显示时再将整个malloc内存通过memcopy拷贝到framebuffer,这样一次性拷贝,会更快。更进一步的,我们可以申请几块framebuffer大小的内存,同时存储所需要的几幅页面,用一个链表来存储这些空间的地址,只有第一次显示某个页面时,才需要在该页面对应的malloc内存上描绘像素,第二次就不用了,这样会快很多,类似tlb的思想。
程序集中在disp_manager.c中的AllocVideoMem()、GetVideoMem();render.c中的FlushVideoMemToDev()
8.4.2 数码相框程序编写-MainPage页面规划
规划主界面三个图标的位置,并显示。程序集中在render.c中的GetPixelDatasForIcon()、file.c中的MapFile()、page_manager.c里面的GeneratePage()
8.4.3 数码相框程序编写-MainPage输入功能
边栏推荐
- 每日刷题记录 (十六)
- Reptile practice (VIII): reptile expression pack
- Introduction to programming hardware
- Two small problems in creating user registration interface
- C language 001: download, install, create the first C project and execute the first C language program of CodeBlocks
- Notice on organizing the second round of the Southwest Division (Sichuan) of the 2021-2022 National Youth electronic information intelligent innovation competition
- Introduction knowledge system of Web front-end engineers
- The standby database has been delayed. Check that the MRP is wait_ for_ Log, apply after restarting MRP_ Log but wait again later_ for_ log
- Set up personal network disk with nextcloud
- Development of a horse tourism website (realization of login, registration and exit function)
猜你喜欢
QT and OpenGL: load 3D models using the open asset import library (assimp)
Solutions to problems in sqlserver deleting data in tables
STM32F1与STM32CubeIDE编程实例-旋转编码器驱动
搭建ADG过程中复制报错 RMAN-03009 ORA-03113
Trust orbtk development issues 2022
Single machine high concurrency model design
从Starfish OS持续对SFO的通缩消耗,长远看SFO的价值
【编程题】【Scratch二级】2019.12 绘制十个正方形
快速上手使用本地测试工具postman
CoinDesk评波场去中心化进程:让人们看到互联网的未来
随机推荐
52歲的周鴻禕,還年輕嗎?
动态库基本原理和使用方法,-fPIC 选项的来龙去脉
Binder核心API
全自动化处理每月缺卡数据,输出缺卡人员信息
Robomaster visual tutorial (1) camera
服务器防御DDOS的方法,杭州高防IP段103.219.39.x
Daily question brushing record (16)
去了字节跳动,才知道年薪 40w 的测试工程师有这么多?
Su embedded training - Day3
【推荐系统基础】正负样本采样和构造
Solution to the problem of unserialize3 in the advanced web area of the attack and defense world
快速上手使用本地测试工具postman
用語雀寫文章了,功能真心强大!
某马旅游网站开发(登录注册退出功能的实现)
Tools for debugging makefiles - tool for debugging makefiles
Flask learning record 000: error summary
单机高并发模型设计
How to add automatic sorting titles in typora software?
[basis of recommendation system] sampling and construction of positive and negative samples
每日刷题记录 (十六)