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

 
 
> проблемы с выравниванием ARM7
dimka76
сообщение Jun 25 2009, 05:59
Сообщение #1


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, &parametr, sizeof(parametr));

}


Последний вариант конечно работоспособный, но может быть есть какие-то более изящные решения?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Jun 25 2009, 06:19
Сообщение #2


Гуру
******

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



Цитата(dimka76 @ Jun 25 2009, 08:59) *
Последний вариант конечно работоспособный, но может быть есть какие-то более изящные решения?

Или "правильно" писать программы c "правильными" структурами данных. Или не сбивать с толку компилятор и дать ему инфрмацию об объекте с которым он работает. Либо действительно пользоваться memcpy(), котрая разберется с проблемой в online.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 25 2009, 07:41
Сообщение #3


Местный
***

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



Цитата(zltigo @ Jun 25 2009, 10:19) *
Либо действительно пользоваться memcpy(), котрая разберется с проблемой в online.


Очень редко у меня возникали случаи когда внутри memcpy появлялся аборт. Так что memcpy не панацея.
Либо не пудрить мозг компилятору, либо писать свою функцию memcpy, которая 100% не допустит аборта.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 25 2009, 10:08
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 25 2009, 10:39
Сообщение #5


Местный
***

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



Цитата(zltigo @ Jun 25 2009, 14:08) *
Не говорите глупости. Охотно верю, что Вы копируете неаонятно куда и непонятно откуда и получаете Abort, только выравнивание здесь совсем ни причем - это чисто Ваши ошибки.


Жаль, что не сохранил дизасм для неверующих. Замена memcpy на цикл с побайтным присваиванием непонятно куда из непонятно откуда чудесным образом всё починило.

P.S. Моя первая реакция на такое чудо была такая же как у Вас на мой пост в теме.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 25 2009, 10:51
Сообщение #6


Гуру
******

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



Цитата(xelax @ Jun 25 2009, 13:39) *
непонятно куда из непонятно откуда чудесным образом всё починило.

Вот и разбирались-бы с непонятками, а memcpy() это, так сказать, святое smile.gif и при этом достаточно простое, дабы уже лет 30 не содержать ошибок ни в одной из реализаций.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 25 2009, 14:54
Сообщение #7


Местный
***

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



Цитата(zltigo @ Jun 25 2009, 14:51) *
Вот и разбирались-бы с непонятками, а memcpy() это, так сказать, святое smile.gif и при этом достаточно простое, дабы уже лет 30 не содержать ошибок ни в одной из реализаций.


Согласен, что простое... Я и не утверждаю что в memcpy есть ошибка, уверен что такие вещи сто раз отладили. Я вот что пытаюсь донести. Есть пердположение, что компилятор лепит в проект несколько реализаций данной функции, в зависимости от разрядности копируемых данных(байтное, 2байтное и 4байтное)? И стоит ему потерять (в результате действий программиста) атрибут packed для какой-нибудь структуры и он запросто применит пословное копирование вместо побайтного(имеет полное право на оптимизацию). И тут то и случится abort именно внутри memcpy.

Моё ИМХО, что в общем случае от абортов нельзя защищаться memcpy. Это всего лишь уменьшит вероятность ошибки, но не устранит причину.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 25 2009, 16:56
Сообщение #8


Гуру
******

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



Цитата(xelax @ Jun 25 2009, 17:54) *
в зависимости от разрядности копируемых данных(байтное, 2байтное и 4байтное)?

5, 6, 7, 8, 9...... а еще начинающиеся с 0,1,2,.... а еще заканчивающиеся на 0,1,2,3.... smile.gif smile.gif
Вот, кода реализация в IAR была какая-то тормозная пользовал вместо библиотечной такое
Код
//---------------------------------------------------------------------------
// void *(memcpy)(void *p1, const void *p2, size_t n)
// Copy char p2[n] to p1[n]
//---------------------------------------------------------------------------
memcpy:
        teq      r2,#0                  // Is p1 == 0 ?
        bxeq     lr                     // If p1 == 0, return

        stmdb    sp!,{lr}               // Push return address
        mov      r12,r0                 // Copy pointer p1
        cmp      r2,#8                  // Is buffer long or short?
        ble      byteserial             // Jump if n <= 8

        sub      r3,r0,r1               // Compare pointers p1, p2
        tst      r3,#3                  // Strings aligned same?
        bne      byteserial             // Jump if buffers not aligned


// Both strings are similarly aligned WRT word boundaries.
// At least a portion of the data can be copied an entire
// word at a time, which is faster than copying bytes.
wordserial:
        ands     r3,r0,#3               // Check byte alignment
        beq      wordaligned            // Jump if p1, p2 word-aligned

        rsb      r3,r3,#4               // m = no. of odd initial bytes
        sub      r2,r2,r3               // n = n - m


// If the two buffers do not begin on word boundaries, begin
// by copying the odd bytes that precede the first full word.
preloop:
        ldrb     lr,[r1],#1             // Read byte from source
        subs     r3,r3,#1               // --m (decrement loop count)
        strb     lr,[r12],#1            // Write byte to destination
        bne      preloop                // Loop if more bytes to move


wordaligned:
#if WORDS8_TRANSFER == 1
        movs     r3,r2,asr #5           // Any chunks of 8 words?
        beq      octsdone               // Jump if no 8-word chunks

        and      r2,r2,#0x1F            // Subtract chunks from n
        stmdb    sp!,{r4-r10}           // Save registers on stack


// The strings are long enough that we can transfer at least
// some portion of the data in 8-word chunks.
octloop:
        ldmia    r1!,{r4-r10,lr}        // Load 8 words from source
        subs     r3,r3,#1               // More 8-word chunks to move?
        stmia    r12!,{r4-r10,lr}       // Write 8 words to destination
        bne      octloop                // Loop if more chunks

        ldmia    sp!,{r4-r10}           // Restore registers from stack

octsdone:
#endif
        movs     r3,r2,asr #2           // Any more whole words to move?
        beq      wordsdone              // Jump if no more whole words


// Copy as much of the remaining data as possible one word at
// a time.
wordloop2:
        ldr      lr,[r1],#4             // Read next word from source
        subs     r3,r3,#1               // Decrement word count
        str      lr,[r12],#4            // Write next word to destination
        bne      wordloop2              // Loop while more words to move

wordsdone:
        ands     r2,r2,#3               // Any last bytes to transfer?
        beq      theend                 // Return if already done


// The two strings do not end on word boundaries.
// Copy the remaining data one byte at a time.
byteserial:
        ldrb     lr,[r1],#1             // Read byte from source
        subs     r2,r2,#1               // --n (decrement loop count)
        strb     lr,[r12],#1            // Write byte to destination
        bne      byteserial             // Loop if more bytes to move

theend:
        ldmia    sp!,{lr}               // Return
        bx       lr


Цитата(xelax @ Jun 25 2009, 18:45) *
но всё равно основное то копирование идёт пословно.

Зависит от реализации, пример, когда не только пословно, выше (под ключем WORDS8_TRANSFER)


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 26 2009, 06:30
Сообщение #9


Местный
***

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



Цитата(zltigo @ Jun 25 2009, 20:56) *
5, 6, 7, 8, 9...... а еще начинающиеся с 0,1,2,.... а еще заканчивающиеся на 0,1,2,3.... smile.gif smile.gif


С каждым новом постом у меня всё более нелепо отвечать получается.
Доводы у всех высказывающихся весомые, в отличие от моего "а я видел" smile3046.gif

Могу только добавить, что если вдруг моя "галюцинация" с data abort внутри memcpy повторится, обязательно сделаю скриншот дебагера и приатачу сюда. rolleyes.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - aaarrr   Цитата(xelax @ Jun 25 2009, 18:54) Есть п...   Jun 25 2009, 15:05
|- - 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
- - 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


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

 


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


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