|
STM32F100RB не выполняет инструкцию "IT NE"? |
|
|
|
Jun 26 2013, 08:50
|
Группа: Новичок
Сообщений: 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 - не самая редко используемая команда?
|
|
|
|
|
Jun 26 2013, 12:13
|
Группа: Новичок
Сообщений: 4
Регистрация: 26-06-13
Пользователь №: 77 284

|
Проблема вылечилась обновлением JLinkARM.dll в папке IAR-а. Первый раз сталкиваюсь с тем, чтобы обычный JTAG-отладчик мог влиять на правильность выполнения команд процессором! Похоже он трет флаги ICI/IT в регистре xPSR и нарушает нормальное выполнение блока IT.
|
|
|
|
|
Jun 26 2013, 13:46
|
Группа: Новичок
Сообщений: 4
Регистрация: 26-06-13
Пользователь №: 77 284

|
Оказывается проблема есть только при отладке по шагам. Если поставить точку останова сразу после блока и сказать 'Go' - то видно, что IT-блок обрабатывается ок.
|
|
|
|
|
Jun 27 2013, 05:44
|
Гуру
     
Группа: Свой
Сообщений: 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, как Вы видите, все элементарно и никакой путаницы. Хотя, в данном случае, "огород" получился слишком маленький.
|
|
|
|
|
Jun 27 2013, 17:39
|
Группа: Новичок
Сообщений: 4
Регистрация: 26-06-13
Пользователь №: 77 284

|
Цитата(Golikov A. @ Jun 26 2013, 18:25)  Из всего этого у меня остается одна загадки истории... Нахрена асм в арме? Вы с оптимизатором соревнуетесь? Асм нужен для отладки, читать, что там компилер наваял. Пишу я на си++ и всем рекомендую. А когда код не работает, как вы его отладите, не заглядывая в дизассемблер? Если баг виден по исходникам, то все прекрасно. А если 2 + 2 вдруг дает 5, то приходится смотреть асм. А еще полезно смотреть асм в плане оптимизации. Часто бывает, что обычная с виду функция порождает навароченный код на асме. А оказывается, что например, константное выражение вдруг стало не константным и начинает вычисляться динамически со всеми делениями/умножениями.
|
|
|
|
|
Jun 27 2013, 18:39
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769

|
Цитата(Golikov A. @ Jun 26 2013, 19:25)  Нахрена асм в арме? Вы с оптимизатором соревнуетесь? Один мой знакомый немного ошибся с именем обработчика прерывания (писал на си в кейле). Промудохался с этим несколько дней. А я смотря в отладчике дизассемблер сразу увидел что прерывание возникает, но идет на пустую заглушку. Даже если не писать на асме, то знать все равно надо.
|
|
|
|
|
Jun 27 2013, 19:19
|
Гуру
     
Группа: Свой
Сообщений: 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)  А оказывается, что например, константное выражение вдруг стало не константным и начинает вычисляться динамически со всеми делениями/умножениями. Сюрпризы бывают, но это редкость. Виноват как правило программист. И совсем не тот что компилятор писал.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|