Добрый день!
Железо - STM32F105VC rev.Z.
ПО - Keil 4.21, компилятор armcc 4.1.0.644
Случилось вот что. Понадобилось мне одну 32битную сохранить в буфер, и адрес поменять на следующую ячейку буфера:
Код
*((u32*)pPDU) = __REV16_W(*((u32*)( MB_HoldRegs + Address))); //да хоть просто число туда записывать
pPDU += 4;
Ситуация стандартная. Но на мою голову компилятор засовывает инструкцию "
STM":
Код
0x080018A0 F7FEFC70 BL.W __REV16_W (0x08000184)
0x080018A4 C601 STM r6!,{r0}
тем самым пытаясь выполнить запись+инкремент за раз, но при выполнении которой происходит ошибка (HardFault).
Пока выяснял почему, начитался всякого. Вплоть до того, что вставленная 16битная инструкция STM является устаревшей и не используется для ядер ARMv6 и выше. А в другом месте (в ссылке про STM) вообще написано, что 16битная STM не поддерживается в Thumb-2EE, который для ARMv7, т.е. нашего Cortex-M3.
Но тогда почему именно эта инструкция была вставлена? Неужели косяк компилятора? Или же все-таки эта инструкция поддерживается Cortex-M3, но есть ограничения для ревизиии Z?
Все эти вопросы я себе задавал, а между этим провел эксперимент. Написал на ассемблере функцию, в которой с помощью этой инструкции заполняю массив 32битных элементов.
Результат экспериментов: инструкция работает, но если адрес массива не кратен 4, то вылетаем в Hard Fault.
Люди добрые, прокомментируйте случившееся. Помогите подвести итог.
Сообщение отредактировал ISK2010 - Sep 6 2011, 13:39