Types 在一个较大的数据类型中存储两个数据类型

Types 在一个较大的数据类型中存储两个数据类型,types,arm,framebuffer,Types,Arm,Framebuffer,关于这个问题的一点介绍, 在我发布这篇文章之前,我试着在google/stack上搜索这篇文章,但大多数都不清楚。 我有一个基于cortex-a8的板,我在上面运行一个裸机RTOS,显示器(帧缓冲区)有点慢,因为我现在还没有为我的目标实现DMA,但不是那么慢,但是我注意到了一个改进的机会。在我的CPU和toolchain combo上,32位数学,数据访问比16位访问快,显示为16位rgb565,因此一些帧缓冲区操作比可能的要慢一些(其中一些使用memcpy、memmove和memset,负责数

关于这个问题的一点介绍,
在我发布这篇文章之前,我试着在google/stack上搜索这篇文章,但大多数都不清楚。
我有一个基于cortex-a8的板,我在上面运行一个裸机RTOS,显示器(帧缓冲区)有点慢,因为我现在还没有为我的目标实现DMA,但不是那么慢,但是我注意到了一个改进的机会。在我的CPU和toolchain combo上,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++;
}
if(((无符号字符)c>32)&((无符号字符)c<127)){
检查滚动条的滚动条(49);
//fontdata从ASCII 33开始,按对数移位(基数2,字体高度)
c-=33;
c=0;x-=2)
{

如果(fontdata[c+y]&(1在编译器吃掉我的脑袋后,我已经通过使用asm修复了一次存储两个像素的问题,但是现在似乎还有一些其他问题,因为除了少数字符外,字符看起来乱七八糟,我不确定究竟是什么原因造成了这一问题

至于像素的包装,这里是我最后使用的(以防万一将来有人可能需要这样做)

if(((无符号字符)c>32)&((无符号字符)c<127)){
检查滚动条(FB\u MAX\u Y\u下);
uint32像素32像素tmp;
uint16_t pallete[2]={(fb.fg_color),(fb.tg_color)};

uint32_t*像素(uint32_t*)fb.base+((((fb.cursor.y您在将2个像素写入内存之前组合它们的想法是正确的。ARM的写入缓冲区硬件将以这种方式更有效地使用,代码将运行得更快。我不认为以这种形式混合使用C和ASM将产生最佳效果。坚持使用纯ASM将保证您使用的是有条件执行的ins说明。此外,在调色板中使用数组可能会导致编译器输出效率非常低的代码。以下是一种在纯ASM中更有效地执行此操作的方法。展开循环是一个好主意。这是处理双字节字体数据的代码

@ Register usage
@ R0 = source data pointer
@ R1 = destination data pointer
@ R2 = foreground color (loaded outside of loop)
@ R3 = background color (loaded outside of loop)
@ R4,R5 = temp registers
@ Assumes that the most significant short of each 32-bit word is on the left

  ldrb r4,[r0],#1  @ source bitonal image data
@ first pair of pixels
  tst r4,#0x80
  movne r5,r5,r2,LSL #16
  moveq r5,r5,r3,LSL #16
  tst r4,#0x40
  orrne r5,r5,r2
  orreq r5,r5,r3
  str r5,[r1],#4
@ second pair of pixels
  tst r4,#0x20
  movne r5,r5,r2,LSL #16
  moveq r5,r5,r3,LSL #16
  tst r4,#0x10
  orrne r5,r5,r2
  orreq r5,r5,r3
  str r5,[r1],#4
@ third pair of pixels
  tst r4,#0x8
  movne r5,r5,r2,LSL #16
  moveq r5,r5,r3,LSL #16
  tst r4,#0x4
  orrne r5,r5,r2
  orreq r5,r5,r3
  str r5,[r1],#4
@ fourth pair of pixels
  tst r4,#0x2
  movne r5,r5,r2,LSL #16
  moveq r5,r5,r3,LSL #16
  tst r4,#0x1
  orrne r5,r5,r2
  orreq r5,r5,r3
  str r5,[r1],#4

更新稍微简单一点的代码

据我所知,第二条指令应该将r5归零,但为什么?感谢您的帮助和努力。哦,明白了,所以您在编写之前使用r5临时存储合并的结果。应该在编写之前完全阅读。再次感谢。
@ Register usage
@ R0 = source data pointer
@ R1 = destination data pointer
@ R2 = foreground color (loaded outside of loop)
@ R3 = background color (loaded outside of loop)
@ R4,R5 = temp registers
@ Assumes that the most significant short of each 32-bit word is on the left

  ldrb r4,[r0],#1  @ source bitonal image data
@ first pair of pixels
  tst r4,#0x80
  movne r5,r5,r2,LSL #16
  moveq r5,r5,r3,LSL #16
  tst r4,#0x40
  orrne r5,r5,r2
  orreq r5,r5,r3
  str r5,[r1],#4
@ second pair of pixels
  tst r4,#0x20
  movne r5,r5,r2,LSL #16
  moveq r5,r5,r3,LSL #16
  tst r4,#0x10
  orrne r5,r5,r2
  orreq r5,r5,r3
  str r5,[r1],#4
@ third pair of pixels
  tst r4,#0x8
  movne r5,r5,r2,LSL #16
  moveq r5,r5,r3,LSL #16
  tst r4,#0x4
  orrne r5,r5,r2
  orreq r5,r5,r3
  str r5,[r1],#4
@ fourth pair of pixels
  tst r4,#0x2
  movne r5,r5,r2,LSL #16
  moveq r5,r5,r3,LSL #16
  tst r4,#0x1
  orrne r5,r5,r2
  orreq r5,r5,r3
  str r5,[r1],#4