|
проблемы с выравниванием 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:41
|

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

|
Цитата(zltigo @ Jun 25 2009, 10:19)  Либо действительно пользоваться memcpy(), котрая разберется с проблемой в online. Очень редко у меня возникали случаи когда внутри memcpy появлялся аборт. Так что memcpy не панацея. Либо не пудрить мозг компилятору, либо писать свою функцию memcpy, которая 100% не допустит аборта.
|
|
|
|
|
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. Моя первая реакция на такое чудо была такая же как у Вас на мой пост в теме.
|
|
|
|
|
Jun 25 2009, 14:54
|

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

|
Цитата(zltigo @ Jun 25 2009, 14:51)  Вот и разбирались-бы с непонятками, а memcpy() это, так сказать, святое  и при этом достаточно простое, дабы уже лет 30 не содержать ошибок ни в одной из реализаций. Согласен, что простое... Я и не утверждаю что в memcpy есть ошибка, уверен что такие вещи сто раз отладили. Я вот что пытаюсь донести. Есть пердположение, что компилятор лепит в проект несколько реализаций данной функции, в зависимости от разрядности копируемых данных(байтное, 2байтное и 4байтное)? И стоит ему потерять (в результате действий программиста) атрибут packed для какой-нибудь структуры и он запросто применит пословное копирование вместо побайтного(имеет полное право на оптимизацию). И тут то и случится abort именно внутри memcpy. Моё ИМХО, что в общем случае от абортов нельзя защищаться memcpy. Это всего лишь уменьшит вероятность ошибки, но не устранит причину.
|
|
|
|
Сообщений в этой теме
dimka76 проблемы с выравниванием ARM7 Jun 25 2009, 05:59 dimka76 Цитата(zltigo @ Jun 25 2009, 10:19) Или ... Jun 25 2009, 06:34  zltigo Цитата(dimka76 @ Jun 25 2009, 09:34) С ... Jun 25 2009, 07:21   Сергей Борщ Цитата(zltigo @ Jun 25 2009, 13:08) Такое... Jun 25 2009, 10:32    aaarrr Цитата(xelax @ Jun 25 2009, 14:39) Жаль, ... Jun 25 2009, 10:43      defunct Цитата(xelax @ Jun 25 2009, 17:54) Моё ИМ... Jun 25 2009, 15:06       xelax Цитата(defunct @ Jun 25 2009, 19:06) Сказ... Jun 25 2009, 15:10        defunct Цитата(xelax @ Jun 25 2009, 18:10) Ткните... Jun 25 2009, 15:13         xelax Цитата(defunct @ Jun 25 2009, 19:13) Цита... Jun 25 2009, 15:45          aaarrr Цитата(xelax @ Jun 25 2009, 19:45) сделал... Jun 25 2009, 15:49           meister Цитата(aaarrr @ Jun 25 2009, 19:49) Ну ды... Jun 25 2009, 16:09            aaarrr Цитата(meister @ Jun 25 2009, 20:09) нужн... Jun 25 2009, 16:12             meister Цитата(aaarrr @ Jun 25 2009, 20:12) Поясн... Jun 25 2009, 16:30          defunct Цитата(xelax @ Jun 25 2009, 18:45) В упор... Jun 25 2009, 17:04      aaarrr Цитата(xelax @ Jun 25 2009, 18:54) Моё ИМ... Jun 25 2009, 15:07      zltigo Цитата(xelax @ Jun 25 2009, 17:54) в зави... Jun 25 2009, 16:56       xelax Цитата(zltigo @ Jun 25 2009, 20:56) 5, 6,... Jun 26 2009, 06:30 Axel Это не "проблема", это - факт "нали... Jun 25 2009, 06:41 Сергей Борщ Цитата(Axel @ Jun 25 2009, 09:41) перегон... Jun 25 2009, 07:29  dimka76 Цитата(Сергей Борщ @ Jun 25 2009, 11:29) ... Jun 25 2009, 08:42   Сергей Борщ Цитата(dimka76 @ Jun 25 2009, 11:42) но к... Jun 25 2009, 09:41  VslavX Цитата(Сергей Борщ @ Jun 25 2009, 10:29) ... Jun 25 2009, 08:45 dimka76 Всем спасибо за ответы.
Тему можно считать закр... Jun 25 2009, 06:57 SasaVitebsk А я выравниваю при получении. В месте получения вс... Jun 25 2009, 10:38 aaarrr Понятно. Ну, это уже дела и проблемы оптимизатора ... Jun 25 2009, 16:37 dimka76 Тут на форуме промелькивала фраза, что Cortex-M3 н... Jun 26 2009, 05:13 aaarrr Цитата(dimka76 @ Jun 26 2009, 09:13) Тут ... Jun 26 2009, 07:37
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|