当前位置:网站首页>韦东山第三期课程内容概要
韦东山第三期课程内容概要
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输入功能
边栏推荐
- Su embedded training - Day3
- Single machine high concurrency model design
- 51与蓝牙模块通讯,51驱动蓝牙APP点灯
- PostGIS learning
- 2022-07-07:原本数组中都是大于0、小于等于k的数字,是一个单调不减的数组, 其中可能有相等的数字,总体趋势是递增的。 但是其中有些位置的数被替换成了0,我们需要求出所有的把0替换的方案数量:
- Solutions to problems in sqlserver deleting data in tables
- Tencent security released the white paper on BOT Management | interpreting BOT attacks and exploring ways to protect
- 【编程题】【Scratch二级】2019.09 制作蝙蝠冲关游戏
- DNS 系列(一):为什么更新了 DNS 记录不生效?
- Jouer sonar
猜你喜欢
爬虫实战(八):爬表情包
When creating body middleware, express Is there any difference between setting extended to true and false in urlencoded?
Install sqlserver2019
Basic learning of SQL Server -- creating databases and tables with the mouse
[basis of recommendation system] sampling and construction of positive and negative samples
单机高并发模型设计
[programming questions] [scratch Level 2] March 2019 garbage classification
PostGIS learning
C language 005: common examples
【编程题】【Scratch二级】2019.09 制作蝙蝠冲关游戏
随机推荐
Anaconda+pycharm+pyqt5 configuration problem: pyuic5 cannot be found exe
Common selectors are
Introduction to programming hardware
[研发人员必备]paddle 如何制作自己的数据集,并显示。
paddle入门-使用LeNet在MNIST实现图像分类方法二
Go learning notes (2) basic types and statements (1)
The difference between get and post
52岁的周鸿祎,还年轻吗?
Development of a horse tourism website (optimization of servlet)
Zhou Hongqi, 52 ans, est - il encore jeune?
快速上手使用本地测试工具postman
LinkedBlockingQueue源码分析-新增和删除
【编程题】【Scratch二级】2019.09 绘制雪花图案
How does starfish OS enable the value of SFO in the fourth phase of SFO destruction?
大数据开源项目,一站式全自动化全生命周期运维管家ChengYing(承影)走向何方?
去了字节跳动,才知道年薪 40w 的测试工程师有这么多?
【编程题】【Scratch二级】2019.03 垃圾分类
Installation and configuration of sublime Text3
测试流程不完善,又遇到不积极的开发怎么办?
他们齐聚 2022 ECUG Con,只为「中国技术力量」