Я портирую некоторое программное обеспечение из gcc-toolchain в armcc-toolchain (процессор остается прежним (Cortex-A9)). В C-коде используется memcpy. armcc заменяет вызов memcpy на вызов __aeabi_memcpy. В FAQ говорится следующее о __aeabi_memcpy (Как компиляторы ARM обрабатывают memcpy ()?):
Во многих случаях при компиляции вызовов memcpy () компилятор ARM C вместо этого генерирует вызовы специализированных, оптимизированных библиотечных функций. Начиная с RVCT 2.1, эти специализированные функции являются частью ABI для архитектуры ARM (AEABI) и включают:
__aeabi_memcpy
This function is the same as ANSI C memcpy, except that the return value is void.
Но в отличие от gcc, где вызов memcpy отлично работает во всех моих случаях, с armcc вызов memcpy соответственно __aeabi_memcpy постоянно вызывает исключения выравнивания. Тем временем я обнаружил, что вызов memcpy может обрабатывать вызовы, в которых исходный и целевой адреса не выровнены по 4 байта, а только если они оба не выровнены по 4 байтам. Например:
volatile uint32_t len = 10;
uint8_t* src = (uint8_t*)0x06000002; // 2-byte aligned
uint8_t* dst = (uint8_t*)(0x06000002 + 20); // 2-byte aligned
memcpy(dst, src, len);
буду работать. Но например:
volatile uint32_t len = 10;
uint8_t* src = (uint8_t*)0x06000002; // 2-byte aligned
uint8_t* dst = (uint8_t*)(0x06000002 + 22); // 4-byte aligned
memcpy(dst, src, len);
вызовет исключение выравнивания. Так как я использую указатели типа uint8_t *, я явно говорю компилятору, что адреса могут иметь любое выравнивание. Но очевидно, что этот __aeabi_memcpy не может обрабатывать каждую комбинацию выравниваний. Как я могу решить эту проблему (желательно без изменения всех вызовов memcpy в существующем коде с пользовательской версией memcpy)? Спасибо за помощь.
#pragma
, который вы можете добавлять перед каждым вызовомmemcpy
. - person barak manos   schedule 22.07.2014memcpy
наmemmove
(если вы не против понижения производительности). - person barak manos   schedule 22.07.2014