문제 소개 소개 비트,
글을 게시하기 전에 이것에 대한 검색을 시도했지만 대부분은 분명하지 않았습니다.
필자는 bort metal RTOS를 실행하는 cortex-a8 기반 보드를 가지고 있습니다. 디스플레이 (framebuffer)는 약간 느립니다. 왜냐하면 필자는 지금 목표를 위해 DMA를 구현하지 않았지만 그다지 느리지는 않습니다. 나는 개선의 기회를 발견했다. 내 CPU와 툴체인 콤보에서 32 비트 수학, 데이터 액세스는 16 비트 액세스보다 빠르며 디스플레이는 16 비트 rgb565이므로 일부 프레임 버퍼 연산은 느린 연산입니다 (일부는 memcpy, memmove) 데이터 정렬을 담당하는 memset 등)두 개의 데이터 형식을 하나의 더 큰 데이터 형식으로 저장합니다.
내가 시도한 것은 하나의 32 비트 데이터 유형으로 두 개의 픽셀을 과도하게 밀어 넣어 메모리에 액세스하는 것입니다. 하드웨어에서 정렬되지 않은 메모리 액세스를 지원하므로 문제가되어서는 안됩니다.) 구현 속도는 중요하지 않지만 이상한 결과는 내가 두 픽셀을 하나의 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++;
}
내가 잘못 어디로 갔는지에 관한 어떤 도움의 대부분입니까? 나는 약간 프로그래밍에 익숙하며 취미로 이것을하고 있습니다.
하지만, 왜? 도움과 노력에 감사드립니다. – sgupta
오, 알겠습니다. r5를 사용하여 병합 결과를 임시로 저장하기 전에 쓰기 전에 완전히 읽었어야합니다. 다시 한 번 감사드립니다. – sgupta