当前位置:网站首页>韦东山第三期课程内容概要

韦东山第三期课程内容概要

2022-07-07 22:21:00 拾柒47

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输入功能

原网站

版权声明
本文为[拾柒47]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_42403122/article/details/125006336