|
проблемы с выравниванием ARM7 |
|
|
|
Jun 25 2009, 05:59
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Есть такой код для процессора ARM7 Код char data[256];
void foo(void) { int parametr = 0xAA55BBCC; char* ptr = data;
//если сделать так *((int*)(ptr+1)) = paramtr; // то прцессор вылетет в DataAbort
// можно сделать конечно так memcpy(ptr+1, ¶metr, sizeof(parametr));
} Последний вариант конечно работоспособный, но может быть есть какие-то более изящные решения?
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Jun 25 2009, 07:29
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Axel @ Jun 25 2009, 09:41)  перегонять байты (напрямую или memcpy()) и формировать типы ручками. Зачем же? Существует такое понятие, как упаковка структур: Код #include <stdint.h> uint8_t Buffer[256];
typedef struct __attribute__((packed)) { uint8_t Data1; uint32_t Data2; } answer_t;
void foo(void) {
int parametr = 0xAA55BBCC; answer_t * pAnswer = (answer_t *)Buffer;
pAnswer->Data2 = paramtr; pAnswer->Data1 = 0x12;
} Пример для GCC, для других компиляторов с высокой долей вероятности будет #pragma pack(1)
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 25 2009, 07:41
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(zltigo @ Jun 25 2009, 10:19)  Либо действительно пользоваться memcpy(), котрая разберется с проблемой в online. Очень редко у меня возникали случаи когда внутри memcpy появлялся аборт. Так что memcpy не панацея. Либо не пудрить мозг компилятору, либо писать свою функцию memcpy, которая 100% не допустит аборта.
|
|
|
|
|
Jun 25 2009, 08:42
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(Сергей Борщ @ Jun 25 2009, 11:29)  Зачем же? Существует такое понятие, как упаковка структур: Спасибо !!! Так работает. Выглядит читабельно, но копирование происходит побайтно ( смотрел листинг в IAR). Но от этого никуда не денешься в данной ситуации.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Jun 25 2009, 09:41
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(dimka76 @ Jun 25 2009, 11:42)  но копирование происходит побайтно ( смотрел листинг в IAR). А как вы хотели, если только побайтно можно обратиться к любому адресу? Не, ну если заранее знать, что 4-байтовое число расположено со сдвигом на 1 байт, то можно скопировать первый байт, потом полуслово и потом последний байт, но такое - только ручками.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 25 2009, 10:08
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(xelax @ Jun 25 2009, 10:41)  Очень редко у меня возникали случаи когда внутри memcpy появлялся аборт. Так что memcpy не панацея. Не говорите глупости. Охотно верю, что Вы копируете неаонятно куда и непонятно откуда и получаете Abort, только выравнивание здесь совсем ни причем - это чисто Ваши ошибки. Цитата(Сергей Борщ @ Jun 25 2009, 12:41)  но такое - только ручками. Такое, и даже большее (при копировании больших массивов) делает хоть сколько нибудь приличное библиотечное memcpy().
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 25 2009, 10:39
|

Местный
  
Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035

|
Цитата(zltigo @ Jun 25 2009, 14:08)  Не говорите глупости. Охотно верю, что Вы копируете неаонятно куда и непонятно откуда и получаете Abort, только выравнивание здесь совсем ни причем - это чисто Ваши ошибки. Жаль, что не сохранил дизасм для неверующих. Замена memcpy на цикл с побайтным присваиванием непонятно куда из непонятно откуда чудесным образом всё починило. P.S. Моя первая реакция на такое чудо была такая же как у Вас на мой пост в теме.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|