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

 
 
> Косяк в компиляторе KEIL по части автоинкремента?
KnightIgor
сообщение Dec 19 2012, 12:44
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Привет, коллеги.

Столкнулся с "интересным" поведением программы под KEIL 4.23, процессор EFM32G210F128:
Код
void func(void *p)
{
   long *ptr = p;
   ...
   *ptr++ = variable;
   ...
}

приводит к исключению. В ассемблере это инструкция STM R5!, {R0}.
Код
void func(void *p)
{
   long *ptr = p;
   ...
   *ptr = variable;
    ptr++;
   ...
}

работает нормально. Там генерируется:
Код
  STR R0, [R5, #0x00]
  ADDS R5,R5,#4

В описании инструкции STM я не нашел упоминания, что регистр-указатель приемника должен быть выровнен на слово, а похоже именно это требуется. У меня же через void *p передается указатель на некий буфер обмена, который может содержать различные данные, а сам буфер в итоге где-то в стеке как локальная переменная внутри функции, которая и вызывает мою. Очевидно, что локальные переменные там не выровнены.

Что скажете? Мой недосмотр или грабли, подложенные KEIL?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
esaulenka
сообщение Dec 19 2012, 13:07
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



поиск по arm.com "cortex-m3 unaligned access"

Цитата
The Cortex-M3 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.


Так что контроллер работает согласно спецификации :-)

К кейлу тоже никаких претензий - он же не знает, что этот указатель не выравнивается.


PS. Вот так должно работать.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post



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

 


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


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