uint32_t *source_addr;
source_addr = (void*)number_tel_2;
temp = *source_addr; // <- здесь происходит зависание.
При выполнениии приведенных операций происходит зависание мк.
Подскажите что я делаю не так.
Код: Выделить всё
alignas(4) char number_tel_2[12] = "0000000000";Если бы он выровнял, проблем не было бы.Reflector писал(а):Он выровнял,
Код: Выделить всё
int number_tel_2[12 / 4];Согласен. Он выровнял по байту. Для слов (2, 4 байта) уже, считай, что выравнивания нетVladislavS писал(а):Компилятор выровнял начало массива исходя из размера его элементов, в данном случае у нас массив байт, потому считай никакого выравнивания и нет. Но оно есть![]()
Какие то древние ARMы имели доступ как памяти только выравненный по словам. На пикче слева, видна существенная потеря памяти, против современных, справа. Так что ничего странного.Аlex писал(а):По этому и странно, что не положил массив начиная с выровненного по 4 байта поля. Хотя ... хз... хз...
Cortex-M3. Оптимизация выключена.BorisSPB писал(а):Указатель на uint32_t должен быть выровнен по 32-бита. Ядро Cortex-M не может считывать 32-битные значения с произвольного адреса. При попытке чтения uint32_t с нечетного адреса или адреса кратного 2 происходит прерывание HardFault.
Код: Выделить всё
volatile uint32_t Buf=0x01020304;
volatile uint32_t *pBuf=&Buf;
Buf=*((uint32_t*)((uint8_t*)pBuf+1));Надо в отладке поглядеть где висите.Ser-B писал(а): При выполнениии приведенных операций происходит зависание мк.
32разрядный МК должен работать быстрее с 32 разрядными числами, но душа просит все время 8битные переменные объявлятьARV писал(а):ну, наверное, сравнивать быстрее числа, чем символы - или 4 символа за раз, или 1...
В M0 будет. http://purebasic.mybb.ru/viewtopic.php?id=564#p7599Z_h_e писал(а):Код прошагал, исключения не произошло.
http://infocenter.arm.com/help/index.js ... FAIGG.html3.3.5. Address alignment
An aligned access is an operation where a word-aligned address is used for a word, dual word, or multiple word access, or where a halfword-aligned address is used for a halfword access. Byte accesses are always aligned.
The Cortex-M4 processor supports unaligned access only for the following instructions:
LDR, LDRT
LDRH, LDRHT
LDRSH, LDRSHT
STR, STRT
STRH, STRHT
All other load and store instructions generate a UsageFault exception if they perform an unaligned access, and therefore their accesses must be address aligned.