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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> проблемы с выравниванием ARM7
aaarrr
сообщение Jun 25 2009, 10:43
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(xelax @ Jun 25 2009, 14:39) *
Жаль, что не сохранил дизасм для неверующих. Замена memcpy на цикл с побайтным присваиванием непонятно куда из непонятно откуда чудесным образом всё починило. biggrin.gif

Что ровным счетом ничего не доказывает. Конкретную причину abort'а нашли?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 25 2009, 10:51
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 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
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 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
aaarrr
сообщение Jun 25 2009, 15:05
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(xelax @ Jun 25 2009, 18:54) *
Есть пердположение, что компилятор лепит в проект несколько реализаций данной функции, в зависимости от разрядности копируемых данных(байтное, 2байтное и 4байтное)?

Реализация одна. Да и какой смысл делать несколько, если использовать их можно будет только когда оба адреса константны?
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 25 2009, 15:06
Сообщение #20


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(xelax @ Jun 25 2009, 17:54) *
Моё ИМХО, что в общем случае от абортов нельзя защищаться memcpy. Это всего лишь уменьшит вероятность ошибки, но не устранит причину.

Странный вывод. Вопрос на самом деле шире - дилемма между скоростью и надежностью:

1. *(U32*) xxxx = zz; - это быстро но чревато абортом.
2. memcpy - медленно и надежно, от Align Exception'а - это самая лучшая защита, если скорость не жмет.

Сказки про глючный memcpy травить не нужно, т.к. ничто не мешает послать библиотечку куда подальше и написать свой "безглючный" вариант memcpy.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2009, 15:07
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(xelax @ Jun 25 2009, 18:54) *
Моё ИМХО, что в общем случае от абортов нельзя защищаться memcpy. Это всего лишь уменьшит вероятность ошибки, но не устранит причину.

От абортов вообще нельзя защищаться. Их просто не должно быть.
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 25 2009, 15:10
Сообщение #22


Местный
***

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



Цитата(defunct @ Jun 25 2009, 19:06) *
Сказки про глючный memcpy травить не нужно, т.к. ничто не мешает послать библиотечку куда подальше и написать свой "безглючный" вариант memcpy.


Ткните пальцем где я написал, о том что memcpy глючит??? maniac.gif Читать мой пост до полного осознания того, что я написал, прежде чем лицом об асфальт возить.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 25 2009, 15:13
Сообщение #23


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(xelax @ Jun 25 2009, 18:10) *
Ткните пальцем где я написал, о том что memcpy глючит??? maniac.gif

вот здесь
Цитата
Замена memcpy на цикл с побайтным присваиванием непонятно куда из непонятно откуда чудесным образом всё починило.
Go to the top of the page
 
+Quote Post
xelax
сообщение Jun 25 2009, 15:45
Сообщение #24


Местный
***

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



Цитата(defunct @ Jun 25 2009, 19:13) *
Цитата(xelax @ Jun 25 2009, 18:10) *

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

вот здесь


В упор не вижу своих слов... memcpy глючит. Ненадо за меня додумывать.

сделал дизасм проекта с memcpy, с несколькими экземплярами memcpy я оказался неправ, но всё равно основное то копирование идёт пословно.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2009, 15:49
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(xelax @ Jun 25 2009, 19:45) *
сделал дизасм проекта с memcpy, с несколькими экземплярами memcpy я оказался неправ, но всё равно основное то копирование идёт пословно.

Ну дык слова-то выровнены. И "сковырнуть" memcpy невыровненными адресами никак нельзя.
Go to the top of the page
 
+Quote Post
meister
сообщение Jun 25 2009, 16:09
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(aaarrr @ Jun 25 2009, 19:49) *
Ну дык слова-то выровнены. И "сковырнуть" memcpy невыровненными адресами никак нельзя.


Код
void zuzu(int * to, int const * from)
{
    memcpy(to, from, sizeof(int));
}


нужна оптимизация с интрисик.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2009, 16:12
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(meister @ Jun 25 2009, 20:09) *
нужна оптимизация с интрисик.

Поясните мысль.
Go to the top of the page
 
+Quote Post
meister
сообщение Jun 25 2009, 16:30
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484



Цитата(aaarrr @ Jun 25 2009, 20:12) *
Поясните мысль.


Тут у меня не на чем сделать листинг, но при оптимизации по скорости с интрисик код получится такой же как от *to = *from, если нужно скопировать 3 int, то код будет такой же как от

Код
to[0] = from[0]; to[1] = from[1]; to[2] = from[2];
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 25 2009, 16:37
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Понятно. Ну, это уже дела и проблемы оптимизатора - memcpy ведь как таковой нет.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 25 2009, 16:56
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 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

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

 


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


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