6课screen01
欢迎屏幕课程系列。在这个系列中,您将学习如何使用Raspberry Pi在汇编代码控制屏幕,起价仅显示随机数据,然后移动到一个固定的图像显示,显示文本格式的数字转换成文本,然后。这是假定你已经完成了OK系列,所以覆盖在这一系列的事情将不会在这里重复。
这第一屏课教图形的一些基本理论,并将其应用于显示梯度模式的屏幕或电视。
1开始
希望你已经完成了OK系列,并在“GPIO功能。的文件,的文件从systemtimer。该系列将被称为。如果你没有这些文件,或选择使用正确的实施,下载解决美国“ok05。主要的文件。从这里也将是有益的,直至并包括MOV SP,# 0x8000。请在这条线删除任何东西。
2计算机图形学
有代表颜色为数很少的系统。在这里,我们专注于RGB系统,但HSL是另一种常见的系统。
当你希望开始意识到,在最基本的层面上,计算机是非常愚蠢的。他们有一个有限数量的指示,几乎只做数学,但是他们能够做很多事情。目前我们想了解的东西就是计算机可以让图像在屏幕上。我们将如何把这个问题转化为二进制?答案是显而易见的;我们设计一些系统编号每种颜色,然后我们店一号屏幕上的每个像素。一个像素在屏幕上的一个小点。如果你移动的距离很近,你可能会使个别像素在屏幕上,能够看到一切都像是做出来的这些像素的组合。
随着计算机时代的先进,人们想要更多的和更复杂的图形,这样的图形卡的概念被发明。显卡是您的计算机上只存在绘制到屏幕上一次处理器。它把像素值的信息转化为光强度水平被发送到屏幕的工作。在现代的电脑,显卡也可以做的更多,如绘制三维图形。在本教程中,我们将专注于图形卡的第一次使用;得到像素颜色从内存到屏幕上。
一个是由所有这立即引发的问题是我们使用的系统编号的颜色。有几种选择,每一个生产不同质量的输出。我将概述一些这里的完整性。
虽然这里的一些图像中有几个颜色他们使用的技术称为空间抖动。这使他们仍然显示出很好的代表性的图像,用很少的颜色。许多早期的操作系统,使用这种技术。
表2.1几种颜色调色板[ TD ]
| Name | Unique Colours | Description | Examples | | Monochrome | 2 | Use 1 bit to store each pixel, with a 1 being white, and a 0 being black. | ![]() | | Greyscale | 256 | Use 1 byte to store each pixel, with 255 representing white, 0 representing black, and all values in between representing a linear combination of the two. | ![]() | | 8 Colour | 8 | Use 3 bits to store each pixel, the first bit representing the presence of a red channel, the second representing a green channel and the third a blue channel. | ![]() | | Low Colour | 256 | Use 8 bits to store each pixel, the first 3 bit representing the intensity of the red channel, the next 3 bits representing the intensity of the green channel and the final 2 bits representing the intensity of the blue channel. | ![]() | | High Colour | 65,536 | Use 16 bits to store each pixel, the first 5 bit representing the intensity of the red channel, the next 6 bits representing the intensity of the green channel and the final 5 bits representing the intensity of the blue channel. | ![]() | | True Colour | 16,777,216 | Use 24 bits to store each pixel, the first 8 bits representing the intensity of the red channel, the second 8 representing the green channel and the final 8 bits the blue channel. | ![]() | | RGBA32 | 16,777,216 with 256 transparency levels | Use 32 bits to store each pixel, the first 8 bits representing the intensity of the red channel, the second 8 representing the green channel, the third 8 bits the blue channel, and the final 8 bits a transparency channel. The transparency channel is only considered when drawing one image on top of another and is stored such that a value of 0 indicates the image behind's colour, a value of 255 represents this image's colour, and all values between represent a mix.
|
在本教程中,我们最初使用的高色。正如你所看到的图像的形式,它是产生明显的,良好的图像质量,但它不占用为真彩色空间。就是说,相当小的显示800x600像素,它仍然只是在1 MB的空间。它也有优势的大小是2的幂的倍数,这大大降低了获取信息的复杂性与真实颜色比较。
存储的帧缓冲的地方的计算机上的沉重的记忆负担。因为这个原因,早期的电脑经常作弊,通过,例如,存储一个屏幕的文本价值,只是画的每一封信每次刷新屏幕分别为。
木莓派有一个非常特殊的,而奇怪的是图形处理器的关系。在Raspberry Pi,图形处理器实际运行的第一,并负责启动主处理器。这是非常不寻常的。最终没有多大区别,但在许多相互作用,它常常感觉像处理器和图形处理器是次要的,最重要的是。两沟通在Raspberry Pi的所谓的“邮箱”。每一个可以存放邮件的,这将在不久的将来收集并处理。我们将用邮箱向图形处理器的地址。地址是一个位置,我们可以写为屏幕像素的颜色信息,称为帧缓冲,和图形卡,将定期检查该位置,并更新屏幕上的像素进行适当的。
3编程邮递员
消息传递是非常常见的成分。一些操作系统允许程序使用虚拟信息传递沟通。
我们需要程序的第一件事是“邮递员”。这只不过是两个方法:mailboxread,从R0邮箱通道读取一个消息。mailboxwrite写作的价值和,排名前28位的R0 R1邮箱通道。树莓PI 7与图形处理器通信的邮箱通道,其中只有第一对我们是有用的,因为它是谈判的帧缓冲。
下面的表格和图表描述了邮箱的操作。
为了发送邮件到特定的邮箱: 发件人等待状态,直到该场有0位的顶部。 该传感器是这样写,这样的最低4位是写在邮箱上,28位和写是消息。 为了读取的消息: 在接收状态等待直到有一场在30 0位。 接收器读取从在读。 证实了该消息的接收是正确的,如果我们不tries和邮箱。 特别是如果你感觉你现在有足够的信息confident,我们需要写两个方法。如果不是,看在线。 我的建议是永远的第一法的实施是一个邮箱的地址,以获得该地区。 .globl getmailboxbase getmailboxbase: 0x2000b880 LDR R0 = 从子程序返回 本程序是操作系统的复杂性的最小的状态,我们将实现第一。当你成为更多和更复杂的方法,你将需要预先规划他们的启动。很好的方式来写出来的,这可能是简单的列表的步骤,需要做的是,在交易金额的细节,像下面。 我们将怎么写输入(R0),它写什么邮箱(R1)。这是一个我们必须经检查确认它是真实的,邮箱,和低4位的值是0。别忘了来验证输入。 使用getmailboxbase检索到的地址。 从读取状态字段。 检查顶位是0。如果没有,回到3。 把值写的信道。 写的写的。 让我们把这些中的每个命令。 .globl mailboxwrite mailboxwrite: TST的R0,# 0b1111 movne PC,LR CMP的R1,# 15 movhi PC,LR 尖沙咀区,# valcomputes和注册,和比较的结果与# NPV为0。 本研究达到了我们的在线R0和R1。这是一个功能比较全的TST)计算的逻辑和操作数的数,然后比较结果与0。在这个案例,它检查输入的4位中的最低值都是0。 信道.req R1 .req R2值 MOV R0值。 LR推{ } getmailboxbase BL 邮箱.req R0 这将确保我们不重写代码或链接寄存器的值,或getmailboxbase和调用。 wait1美元: .req R3的地位 LDR的地位,# 0x18 ] [邮箱 本代码在当前负载状态。 TST的地位,# 0x80000000 .unreq状态 国家统计局wait1美元 该代码检查状态位是最高的领域是0,和循环回3。如果它是不的。 附加值,信道 .unreq频道 这种结合的信道码和值在一起。 str的值,# 0x20(邮箱) .unreq值 .unreq邮箱 流行的CP } { 此代码的结果写入到存储领域。 该代码是mailboxread是很相似的。 我们将去读是输入邮箱中(R0)。这是我们必须通过检查确认它是真实的邮箱。别忘了来验证输入。 使用getmailboxbase检索到的地址。 从读取状态字段。 检查30位是0。如果没有,回到3。 从读读取领域。 检查邮箱一个我们想要的是,如果不回到3。 返回的结果。 让我们把这些中的每个命令。 .globl mailboxread mailboxread: CMP的R0,# 15 movhi PC,LR 本研究达到了我们的在线R0。 信道.req R1 MOV R0,频道 LR推{ } getmailboxbase BL 邮箱.req R0 这将确保我们不重写代码或链接寄存器的值,或getmailboxbase和调用。 rightmail美元: wait2美元: .req R2的状态 LDR的地位,# 0x18 ] [邮箱 本代码在当前负载状态。 TST的地位,# 0x40000000 .unreq状态 国家统计局wait2美元 该代码检查,30位场的状态是0,和循环回3。如果它是不的。 邮件.req R2 这下一个项目的代码读取从邮箱。 inchan .req R3 与inchan、邮件、# 0b1111 inchan时域均衡器,信道 .unreq inchan 国家统计局rightmail美元 .unreq邮箱 .unreq频道 本代码是检查通道读取邮件,我们只是是我们提供的一个方法。如果没有它的环回3。 #和R0,邮件,0xfffffff0 .unreq邮件 流行的CP } { 这行代码(在前28位的答复邮件到(R0)。 4我亲爱的图形处理器 通过我们的新的即将来临,我们现在有能力发送邮件到该图形卡。不过,我们应该送什么?这是很难的问题,我一定是在寻找到的答案,它是不是在任何一个在线的手册,我发现。然而,通过寻找在GNU / Linux的树莓派的,是我们的工作,我们需要能够发送出去。 由于是在图形处理器之间共享内存和处理器的IP网上,我们能找到我们,只是发送消息。这一个被称为DMA设备使用复杂的多,这对加快访问时间。
|