реклама на сайте
подробности

 
 
> memcpy(void * __restrict , const void * __restrict, size_t );
pitt
сообщение Mar 1 2013, 23:33
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



имеется
Код
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);

Так как пакеты создаются извне и размещается в памяти последовательно, т.е. начало пакета может случиться по любому адресу, необходимо использовать, например, #pragma __pack(1), но тогда идет ошибка компиляции из-за __restrict. Прошу заметить, оптимизация отключена, как и С99, т.е. ANSI-C без прибамбасов. Если убрать прагму, то ARMCC НЕПОНЯТНО ЗАЧЕМ выравнивает поинтер на границу 32-битного слова и, по-сему, портит структуру. Не желаю вместо memcpy использовать свой С-код.
Вопросы к публике: есть ли у кого инлайн ассемблер для менее привередлигого memcpy или другие разумные предложения.

PS: НЕПОНЯТНО ЗАЧЕМ употребил потому, что НЕ понимаю как выравнивание может играть роль в случае указателя, который может быть установлен на любой адрес.

Спасибо.


--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Mar 2 2013, 11:06
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(pitt @ Mar 2 2013, 00:33) *
// учтите, логика, проверена и работает на х86
memcpy(&p_dst->data, p_src->data, p_src->len);

Работает? Это же просто каша в коде написана!
1. Где поле data в в структуре типа pack_s? Может, имеется ввиду ->info?
2. Если поле info есть указатель, почему первый параметр по ссылке (с &)?

Мои догадки:
1. info[SIZE] есть, видимо, какой-то общий буфер, в котором где-то "вложена" структура pack_s, которая, похоже, представляет собой блок данных, предваренный его типом и длиной. В этом случае структуру следует записать как
Код
typedef __packed struct {
  uint8_t  type;
  uint16_t len;
  uint8_t   data[1];
} pack_s;

понимая, что data[1] на самом деле есть сам буфер переменной длины, а не указатель на куда-то еще.

2. Возможен и другой вариант: структура pack_s в виде от автора есть просто некий универсальный описатель, который, будучи наложен на последовательность байт, выглядит как я описал выше, а будучи использован где-то внутри кода, - действительно не содержит данные, а указывает на еще один буфер с ними посредством *info. Это подозрение следует из memcpy(&p_dst->data, p_src->data, p_src->len), где, к слову, вместо data должно быть info, а имя для info[SIZE] есть просто катастрофа с бодуна, и должно быть выбрано иным. Ну тогда уж надо бы написать:

Код
#pragma anon_unions
typedef __packed struct {
  uint8_t  type;
  uint16_t len;
  __packed uinon {
    uint8_t   data[1];
    uint8_t  *info;
  }
} pack_s;
...
memcpy(p_dst->data, p_src->info, p_src->len);
// или
memcpy(p_dst->info, p_src->data, p_src->len);

Я написал два варианта memcpy, т.к. это автор знает, что на что у него "положено", пусть уточнит.

Сообщение отредактировал KnightIgor - Mar 2 2013, 11:09
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 10:46
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016