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

 
 
> STM32F100RB не выполняет инструкцию "IT NE"?
turalon
сообщение Jun 26 2013, 08:50
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 26-06-13
Пользователь №: 77 284



Пример:

MOV R0, #2
CMP R0, #2
IT NE
MOVNE R0, #1

Последняя инструкция не должна выполняться, т.е. в R0 должно остаться 2, но там 1!
В официальных errata-х такого бага нет.
Симулятор от IAR этот пример обрабатывает правильно. А на самом чипе, через J-Link - не работает (игнорирует IT команду и выполняет MOVNE R0, #1).
Другие варианты условий, например IT EQ, работают нормально.
Еще пробовал STM32F100R6 вместо RB - тот же баг.

Почему этот баг до сих пор никто не заметил, ведь IT NE - не самая редко используемая команда?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Jun 26 2013, 15:25
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Из всего этого у меня остается одна загадки истории... Нахрена асм в арме? Вы с оптимизатором соревнуетесь?
Go to the top of the page
 
+Quote Post
turalon
сообщение Jun 27 2013, 17:39
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 26-06-13
Пользователь №: 77 284



Цитата(Golikov A. @ Jun 26 2013, 18:25) *
Из всего этого у меня остается одна загадки истории... Нахрена асм в арме? Вы с оптимизатором соревнуетесь?

Асм нужен для отладки, читать, что там компилер наваял. Пишу я на си++ и всем рекомендую.
А когда код не работает, как вы его отладите, не заглядывая в дизассемблер? Если баг виден по исходникам, то все прекрасно. А если 2 + 2 вдруг дает 5, то приходится смотреть асм.
А еще полезно смотреть асм в плане оптимизации. Часто бывает, что обычная с виду функция порождает навароченный код на асме. А оказывается, что например, константное выражение вдруг стало не константным и начинает вычисляться динамически со всеми делениями/умножениями.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 27 2013, 19:19
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(turalon @ Jun 27 2013, 20:39) *
Асм нужен для отладки, читать, что там компилер наваял.

Компилятор, как правило, не ваяет, а генерирует код.


Цитата(turalon @ Jun 27 2013, 20:39) *
Пишу я на си++ и всем рекомендую.



Бесспорно.

Цитата(turalon @ Jun 27 2013, 20:39) *
А когда код не работает, как вы его отладите, не заглядывая в дизассемблер? Если баг виден по исходникам, то все прекрасно.


Как правило проблема в исходниках - туда и смотреть.

Цитата(turalon @ Jun 27 2013, 20:39) *
А если 2 + 2 вдруг дает 5, то приходится смотреть асм.


Также можно и нужно Си смотреть.

Цитата(turalon @ Jun 27 2013, 20:39) *
А оказывается, что например, константное выражение вдруг стало не константным и начинает вычисляться динамически со всеми делениями/умножениями.

Сюрпризы бывают, но это редкость. Виноват как правило программист. И совсем не тот что компилятор писал.
Go to the top of the page
 
+Quote Post
paskal
сообщение Jun 27 2013, 20:19
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769



Цитата(_Артём_ @ Jun 27 2013, 23:19) *
Как правило проблема в исходниках - туда и смотреть.

А вы не замечали, что самый первый файл исходника на ассемблере написан? И, например, основная функция main() из ассемблера вызывается?
(говорю про кейл, с ИАРом не работал)
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 28 2013, 04:33
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(paskal @ Jun 28 2013, 00:19) *
А вы не замечали, что самый первый файл исходника на ассемблере написан? И, например, основная функция main() из ассемблера вызывается?
(говорю про кейл, с ИАРом не работал)

Не факт. Для Cortex-M стартап вполне можно написать на C.
CODE

//-----------------------------------------------------------------------------
// Объявления обработчиков прерываний (векторов)
//-----------------------------------------------------------------------------
void NMIException(void);
void HardFaultException(void);
void MemManageException(void);
void BusFaultException(void);
void UsageFaultException(void);
void DebugMonitor(void);
void SVCHandler(void);
void PendSVC(void);
void SysTickHandler(void);
...

//-----------------------------------------------------------------------------
// Указатели секций линкера
//-----------------------------------------------------------------------------
extern unsigned long _sidata; //!< Начало инициализируемых данных.
extern unsigned long _sdata; //!< Начало секции .data.
extern unsigned long _edata; //!< Конец секции .data.
extern unsigned long _sbss; //!< Начало секции .bss.
extern unsigned long _ebss; //!< Конец секции .bss.
extern unsigned long _estack; //!< Начало стека.

//-----------------------------------------------------------------------------
// Определение функций
//-----------------------------------------------------------------------------
void Reset_Handler(void) __attribute__((__interrupt__));
extern int main(void);

//-----------------------------------------------------------------------------
// Таблица векторов прерываний
//-----------------------------------------------------------------------------
typedef void (*t_vector)(void);

__attribute__ ((section(".isr_vector")))
const t_vector vectors[] =
{
(t_vector)&_estack,
Reset_Handler,
NMIException,
HardFaultException,
MemManageException,
BusFaultException,
UsageFaultException,
0,
0,
0,
0,
SVCHandler,
DebugMonitor,
0,
PendSVC,
SysTickHandler,
...
};

//-----------------------------------------------------------------------------
//! \fn void Reset_Handler(void)
//! \brief Вектор сброса.
//-----------------------------------------------------------------------------
void Reset_Handler(void)
{
unsigned long *pulSrc, *pulDest;

// Инициализация данный в секции .data
pulSrc = &_sidata;
for(pulDest = &_sdata; pulDest < &_edata; )
{
*(pulDest++) = *(pulSrc++);
}

// Обнуление данных в секции .bss
for(pulDest = &_sbss; pulDest < &_ebss; )
{
*(pulDest++) = 0;
}

// Вызов функции main
main();
}

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- turalon   STM32F100RB не выполняет инструкцию "IT NE"?   Jun 26 2013, 08:50
- - scifi   Да нет, конечно, не может быть такого бага. Ищите,...   Jun 26 2013, 09:24
- - jcxz   Цитата(turalon @ Jun 26 2013, 14:50) Поче...   Jun 26 2013, 09:43
- - turalon   Проблема вылечилась обновлением JLinkARM.dll в пап...   Jun 26 2013, 12:13
|- - adnega   Цитата(turalon @ Jun 26 2013, 16:13) Проб...   Jun 26 2013, 13:06
- - turalon   Оказывается проблема есть только при отладке по ша...   Jun 26 2013, 13:46
|- - Dron_Gus   Цитата(turalon @ Jun 26 2013, 17:46) Оказ...   Jun 27 2013, 08:01
|- - adnega   Цитата(Golikov A. @ Jun 26 2013, 19:25) И...   Jun 26 2013, 15:47
|- - paskal   Цитата(Golikov A. @ Jun 26 2013, 19:25) Н...   Jun 27 2013, 18:39
- - Golikov A.   знать да. использовать?... На данный момент в арм...   Jun 27 2013, 04:41
|- - adnega   Цитата(Golikov A. @ Jun 27 2013, 08:41) В...   Jun 27 2013, 05:44
- - ViKo   Ассемблер ARM трудно знать досконально, но понимат...   Jun 27 2013, 19:34


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

 


RSS Текстовая версия Сейчас: 18th August 2025 - 05:22
Рейтинг@Mail.ru


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