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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> 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
scifi
сообщение Jun 26 2013, 09:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Да нет, конечно, не может быть такого бага. Ищите, где у вас что-то напутано или в каком месте отладчик глючит.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jun 26 2013, 09:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(turalon @ Jun 26 2013, 14:50) *
Почему этот баг до сих пор никто не заметил, ведь IT NE - не самая редко используемая команда?

Срочно пишите в ST и вас внесут в анналы еррат! Такой баг обнаружить - это сильно! 08.gif
Только человек со свежим взглядом мог его обнаружить - написавший первые строки кода, впервые взявший в руки отладку. С опытом взгляд уже замыливается и таких очевидных багов не видит. 08.gif
Go to the top of the page
 
+Quote Post
turalon
сообщение Jun 26 2013, 12:13
Сообщение #4





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



Проблема вылечилась обновлением JLinkARM.dll в папке IAR-а.
Первый раз сталкиваюсь с тем, чтобы обычный JTAG-отладчик мог влиять на правильность выполнения команд процессором!
Похоже он трет флаги ICI/IT в регистре xPSR и нарушает нормальное выполнение блока IT.
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 26 2013, 13:06
Сообщение #5


Гуру
******

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



Цитата(turalon @ Jun 26 2013, 16:13) *
Проблема вылечилась обновлением JLinkARM.dll в папке IAR-а.
Первый раз сталкиваюсь с тем, чтобы обычный JTAG-отладчик мог влиять на правильность выполнения команд процессором!
Похоже он трет флаги ICI/IT в регистре xPSR и нарушает нормальное выполнение блока IT.

А может вставляет BKPT внутрь IT-блока (BKPT внутри IT выполняется всегда, независимо от истинности условия).
Go to the top of the page
 
+Quote Post
turalon
сообщение Jun 26 2013, 13:46
Сообщение #6





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



Оказывается проблема есть только при отладке по шагам. Если поставить точку останова сразу после блока и сказать 'Go' - то видно, что IT-блок обрабатывается ок.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 26 2013, 15:25
Сообщение #7


Гуру
******

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



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


Гуру
******

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



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

Возможно человек занимается отладкой по шагам С-программы и "нарвался" на необъяснимое поведение отладчика...
Кстати, asm тоже бывает полезно знать)) и дело не в борьбе с оптимизатром - некоторые вещи (обработка
исключительных ситуаций и т.п.) на С не решишь.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Jun 27 2013, 04:41
Сообщение #9


Гуру
******

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



знать да. использовать?...
На данный момент в армах я считаю что если твой проц задачу не тянет, лучше поставить следующий по мощнее, чем запутать исходники ассемблером и сделать проект практически не поддерживаемым другими и в будующем...

В том числе и исключения и прочее, особенно аварийные ситуации, через пол года, год, подохнешь этот огород разбирать, что там и зачем было...

Ну это мое мнение, я его не навязываю...
Go to the top of the page
 
+Quote Post
adnega
сообщение Jun 27 2013, 05:44
Сообщение #10


Гуру
******

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



Цитата(Golikov A. @ Jun 27 2013, 08:41) *
В том числе и исключения и прочее, особенно аварийные ситуации, через пол года, год, подохнешь этот огород разбирать, что там и зачем было...

Вот обработчик исключительной ситуации:
Код
HardFaultException:
    mov  r0, sp
    push {lr}
    bl   print_fault
    pop  {pc}

в котором вызывается функция на C print_fault с одним аргументом.
Код
void print_fault(sFAULT    *fault)
{
    con_str("FAULT:\n\r");
    con_str("r0   = "); con_dword(fault->r0); con_str(", ");
    con_str("r1   = "); con_dword(fault->r1); con_str(", ");
    con_str("r2   = "); con_dword(fault->r2); con_str(", ");
    con_str("r3   = "); con_dword(fault->r3); con_str("\n\r");
    con_str("r12  = "); con_dword(fault->r12); con_str(", ");
    con_str("lr   = "); con_dword(fault->lr); con_str(", ");
    con_str("pc   = "); con_dword(fault->pc); con_str(", ");
    con_str("xpsr = "); con_dword(fault->xpsr); con_str("\n\r");
    con_start();
}

Как без asm-вставки передать в качестве аргумента в функцию текущее значение указателя стека?
На asm, как Вы видите, все элементарно и никакой путаницы.

Хотя, в данном случае, "огород" получился слишком маленький.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jun 27 2013, 08:01
Сообщение #11


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

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(turalon @ Jun 26 2013, 17:46) *
Оказывается проблема есть только при отладке по шагам. Если поставить точку останова сразу после блока и сказать 'Go' - то видно, что IT-блок обрабатывается ок.

Умный J-Link при хождении по шагам может эмулировать выполнение инструкций. Выключается где-то в настройках.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
turalon
сообщение Jun 27 2013, 17:39
Сообщение #12





Группа: Новичок
Сообщений: 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
paskal
сообщение Jun 27 2013, 18:39
Сообщение #13


Местный
***

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



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

Один мой знакомый немного ошибся с именем обработчика прерывания (писал на си в кейле). Промудохался с этим несколько дней. А я смотря в отладчике дизассемблер сразу увидел что прерывание возникает, но идет на пустую заглушку. Даже если не писать на асме, то знать все равно надо.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 27 2013, 19:19
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 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
ViKo
сообщение Jun 27 2013, 19:34
Сообщение #15


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Ассемблер ARM трудно знать досконально, но понимать команды очень даже на пользу. Я в отладчике в Keil часто перехожу на окно дизассемблера. Смотрю, в какие регистры что заносится, куда перескакивает. И обработчик HardFault у меня на ассемблере, примитивнейший. И у компилятора есть много интринсик-команд... Так что за стремление изучить ассемблер можно только похвалить!
Go to the top of the page
 
+Quote Post

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

 


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


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