У меня есть задача провести побайтные операции с двумя массивами данных в памяти (SDRAM или DDR3) и записать их в новую область памяти.
Варианты исполнения такой функции (например, вычитание), написанные мною в "лоб" приведены ниже. Объявления переменных и т.п. опустил.
В первом случае из памяти данные считываются побайтно и побайтно же записываются. Во втором считывается 4 байта, идет шаманство со сдвигами и запись результата как 4х байт.
Код
void difference(alt_u8* buffer1, alt_u8* buffer2, alt_u8* buffer3)
{
for (cntr = 0; cntr < 4; cntr++)
{
*buffer3 = *buffer2 - *buffer1
buffer1 = buffer1 + 1;
buffer2 = buffer2 + 1;
buffer3 = buffer3 + 1;
}
}
{
for (cntr = 0; cntr < 4; cntr++)
{
*buffer3 = *buffer2 - *buffer1
buffer1 = buffer1 + 1;
buffer2 = buffer2 + 1;
buffer3 = buffer3 + 1;
}
}
Код
void difference2(alt_u32* buffer1, alt_u32* buffer2, alt_u32* buffer3)
{
buf_1_1 = *buffer1;
buf_1_2 = *buffer2;
buf_2_1 = *buffer1 >> 8;
buf_2_2 = *buffer2 >> 8;
buf_3_1 = *buffer1 >> 16;
buf_3_2 = *buffer2 >> 16;
buf_4_1 = *buffer1 >> 24;
buf_4_2 = *buffer2 >> 24;
buf_1 = abs (buf_1_2 - buf_1_1);
buf_2 = abs (buf_2_2 - buf_2_1);
buf_3 = abs (buf_3_2 - buf_3_1);
buf_4 = abs (buf_4_2 - buf_4_1);
buf_0 = 0x00000000;
buf_0 |= buf_4;
buf_0 = buf_0 << 8;
buf_0 |= buf_3;
buf_0 = buf_0 << 8;
buf_0 |= buf_2;
buf_0 = buf_0 << 8;
buf_0 |= buf_1;
*buffer3 = buf_0;
}
{
buf_1_1 = *buffer1;
buf_1_2 = *buffer2;
buf_2_1 = *buffer1 >> 8;
buf_2_2 = *buffer2 >> 8;
buf_3_1 = *buffer1 >> 16;
buf_3_2 = *buffer2 >> 16;
buf_4_1 = *buffer1 >> 24;
buf_4_2 = *buffer2 >> 24;
buf_1 = abs (buf_1_2 - buf_1_1);
buf_2 = abs (buf_2_2 - buf_2_1);
buf_3 = abs (buf_3_2 - buf_3_1);
buf_4 = abs (buf_4_2 - buf_4_1);
buf_0 = 0x00000000;
buf_0 |= buf_4;
buf_0 = buf_0 << 8;
buf_0 |= buf_3;
buf_0 = buf_0 << 8;
buf_0 |= buf_2;
buf_0 = buf_0 << 8;
buf_0 |= buf_1;
*buffer3 = buf_0;
}
Вопрос. Что из этого работает быстрее (в т.ч. с точки зрения обращения к памяти). Или же как по-другому адекватно проводить такие побайтные операции именно в Nios?