對此問題進行了一點介紹,
在我發佈此文檔之前,我試圖在google/stack上搜索這些內容,但大多數內容都不清楚。
我有一個基於cortex-a8的電路板,我正在其上運行裸機RTOS,顯示器(framebuffer)有點慢,因爲我目前還沒有爲我的目標實現DMA,但並不是那麼慢,但是我注意到了一個改進的機會。在我的CPU和工具鏈組合中,32位數學運算,數據訪問比16位訪問快,顯示器是16位rgb565,所以一些framebuffer操作比他們可能會慢一些(其中一些使用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++;
}
關於我哪裏錯了任何幫助的大部分?我對編程有點新,並且以此爲愛好。
從我相信,第二個指令應該歸零R5,但爲什麼呢?感謝您的幫助和努力。 – sgupta
哦,明白了,所以你在使用r5來臨時存儲合併的結果之前..應該在寫之前完全閱讀。 再次感謝。 – sgupta