对该问题进行了一些介绍,在
发布此问题之前,我尝试在 google/stack 上搜索此问题,但其中大多数都不清楚。
我有一个基于 cortex-a8 的板,我在其上运行裸机 RTOS,显示(帧缓冲区)有点慢,因为我现在还没有为我的目标实现 DMA,但并不是那么慢,但是我注意到一个改进的机会。在我的 CPU 和工具链组合中,32 位数学,数据访问比 16 位访问快,显示是 16 位 rgb565,所以一些帧缓冲操作比它们本来可以的慢一点(其中一些使用 memcpy,memmove和 memset 负责数据对齐等。)
我试图将两个像素塞进一个 32 位数据类型并使用它来访问内存(据我记得对齐,即使没有,我的 cpu 支持硬件中的非对齐内存访问,所以问题不应该是这个。)请注意,我不是在谈论我的实现速度,而是我得到的一个奇怪的效果,我怀疑这是因为我如何将两个像素塞进一个 32 位数据类型。
这是我的 fb_putc 的大部分内容
if (((unsigned char)c > 32) && ((unsigned char) c < 127)) {
check_for_scroll(49);
// fontdata starts from ASCII 33 shifted by logarithm(base2, font_height)
c -= 33;
c <<= 4;
uint16_t pallete_16[2] = {fb.fg_color, fb.tg_color};
uint32_t y;
uint32_t *pixel_32;
uint32_t fb_shifter;
uint32_t pixel_32_holder;
uint32_t fb_bg_32 = ((pallete_16[1] << 16) | (pallete_16[1]));
/*
* Each pixel is 16 bits, we access them using 32 bit data type,
* which is faster for aligned memory access. Also many architectures
* have free bit shifts with each instruction so we use that too.
*/
pixel_32 = (uint32_t *) fb.config->base;
pixel_32 += ( ((fb.cursor.y * (FONT_HEIGHT * fb.config->width)) + ((fb.cursor.x * (FONT_WIDTH))))
/ ((sizeof(uint32_t))/(sizeof(uint16_t))) );
for (y = 0; y < 16; y++) {
for ( unsigned x = 7; x >= 0; x -= 2 )
{
if (fontdata[c + y] & (1 << x)) {
pixel_32_holder = (pallete_16[0] << 16);
} else {
pixel_32_holder = (pallete_16[1] << 16);
}
if (fontdata[c + y] & (1 << (x -1))) {
pixel_32_holder |= (pallete_16[0] & 0xffff);
} else {
pixel_32_holder |= (pallete_16[1] & 0xffff);
}
*pixel_32++ = pixel_32_holder;
}
// Panel stride = width (480) - font_width (8)
pixel_32 += (472 / ((sizeof(uint32_t))/(sizeof(uint16_t))));
}
fb.cursor.x++;
}
关于我哪里出错的任何帮助?我对编程有点陌生,并且将其作为爱好。