Код
typedef struct {
uint8_t type;
uint16_t len;
uint8_t *info;
} pack_s;
...
pack_s *p_src, *p_dst;
uint8_t info[SIZE];
// оба p уже установлены к этому моменту, причем, p_dst, где-то внутри info, поэтому стоит адрес
// учтите, логика, проверена и работает на х86
memcpy(&p_dst->data, p_src->data, p_src->len);
uint8_t type;
uint16_t len;
uint8_t *info;
} pack_s;
...
pack_s *p_src, *p_dst;
uint8_t info[SIZE];
// оба p уже установлены к этому моменту, причем, p_dst, где-то внутри info, поэтому стоит адрес
// учтите, логика, проверена и работает на х86
memcpy(&p_dst->data, p_src->data, p_src->len);
Так как пакеты создаются извне и размещается в памяти последовательно, т.е. начало пакета может случиться по любому адресу, необходимо использовать, например, #pragma __pack(1), но тогда идет ошибка компиляции из-за __restrict. Прошу заметить, оптимизация отключена, как и С99, т.е. ANSI-C без прибамбасов. Если убрать прагму, то ARMCC НЕПОНЯТНО ЗАЧЕМ выравнивает поинтер на границу 32-битного слова и, по-сему, портит структуру. Не желаю вместо memcpy использовать свой С-код.
Вопросы к публике: есть ли у кого инлайн ассемблер для менее привередлигого memcpy или другие разумные предложения.
PS: НЕПОНЯТНО ЗАЧЕМ употребил потому, что НЕ понимаю как выравнивание может играть роль в случае указателя, который может быть установлен на любой адрес.
Спасибо.