Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-ноя-21 18:36

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
 Заголовок сообщения: Ошибка C-компилятора?
СообщениеДобавлено: 2016-фев-19 14:41 
Не в сети
Аватара пользователя

Зарегистрирован: 2013-июн-21 15:27
Сообщения: 66
Откуда: Новосибирск
Собираю проект D:\USERS\CM3.prj\sb_D5_01_03_01\E\SBD5010301E.IDE в последней версии CodeMaster-ARM. Вижу, что в модуле D:\USERS\CM3.prj\sb_D5_01_03_01\IntHnD5010301.c неправильно работает обработчик Timer2_IRQ_Handler(): в ветке
Код:
    case tiNone:                     // Истекло время ожидания прерывания:
#if ((OSC_SYNCH & synTmrDm) > 0)
      pBitPls(oOscSync,bActive);              // импульс синхронизации     (П)
#endif // #if ((OSC_SYNCH & synTmrDm) > 0)
#if (MARK_EVENTS > 1)
      MarkEvent(imTmDmy);                     // маркер прерывания
#endif // #if (MARK_EVENTS > 1)
      pBitSet(o_IndErr,iLight);               // индикация ошибки          (Ж)
      if (sGet(isSlow))
      {                                       // если замедление:
        sSet(isHalf2,0);                      // - начало временнОй диаграммы
        pBitSet(o_IndErr,iDark);              // - сброс индикации ошибки  (.)
      } else                                  // если нормальный темп,
      {                                       //  флаг ошибки: не было прерывания и сообщения
//        sSet4(isConnected,0,isHalf2,0,errMsg,1,errRx,1);
        sSet4(isConnected,0,isHalf2,0,errInf,1,errRx,1);
      } // end of if (sGet(isSlow))
      UART_Dir(udOff);                        // выключить UART
#if ((MARK_STATE & 2) > 0)
      pBitSet(o_Busy,b_Passive);              // конец инт-ла исполнения   (o)
#endif // #if ((MARK_STATE & 2) > 0)
      if (!sGet(isDummy))                     // если еще не в режиме ожидания,
        TimerSetup(mdNone, 0);                //  сброс временнОй диаграммы
#if ((MARK_STATE & 8) > 0)
      pBitPls(o_Dummy,b_Passive);             // начало очередного цикла ожидания
#endif // #if ((MARK_STATE & 8) > 0)
      if (Mode != mdTest)                     // если не ФК,
        NoPoll();                             //  блокировка опроса событий
#if ((MARK_STATE & 4) > 0)
      pBitSet(o_Ready,b_Active);              // готовность к внеш.прер.1  (*)
#endif // #if ((MARK_STATE & 4) > 0)
      NVIC_ClearPendingIRQ(EXT_INT1_IRQn);    // сброс флага ожидания прерывания
      NVIC_EnableIRQ(EXT_INT1_IRQn);          // разрешение внеш.прерывания 1
      break; // end of case tiNone

последние строки
Код:
#if ((MARK_STATE & 4) > 0)
      pBitSet(o_Ready,b_Active);              // готовность к внеш.прер.1  (*)
#endif // #if ((MARK_STATE & 4) > 0)
      NVIC_ClearPendingIRQ(EXT_INT1_IRQn);    // сброс флага ожидания прерывания
      NVIC_EnableIRQ(EXT_INT1_IRQn);          // разрешение внеш.прерывания 1

в выходной файл препроцессора попадают, в файле *.lst они (в виде комментария) также присутствуют, но код для них почему-то не создаётся. В результате изделие, единожды попав в этот режим, никогда из него не выходит, поскольку не включаются прерывания по EXT_INT1.
Если поменять порядок строк следующим образом:
Код:
      NVIC_ClearPendingIRQ(EXT_INT1_IRQn);    // сброс флага ожидания прерывания
      NVIC_EnableIRQ(EXT_INT1_IRQn);          // разрешение внеш.прерывания 1
#if ((MARK_STATE & 4) > 0)
      pBitSet(o_Ready,b_Active);              // готовность к внеш.прер.1  (*)
#endif // #if ((MARK_STATE & 4) > 0)

то всё транслируется правильно. Почему?
Это я что-то неправильно пишу или это ошибка компилятора?


Вложения:
CM3_prj.zip [89.19 КБ]
Скачиваний: 84

_________________
Странник
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка C-компилятора?
СообщениеДобавлено: 2016-мар-25 14:41 
Не в сети
Moderator

Зарегистрирован: 2015-июл-09 15:09
Сообщения: 10
Откуда: ООО "Ангиоскан-Электроникс"
Здравствуйте.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка C-компилятора?
СообщениеДобавлено: 2016-мар-26 15:32 
Не в сети
Аватара пользователя

Зарегистрирован: 2013-июн-21 15:27
Сообщения: 66
Откуда: Новосибирск
Понятно, т.е. это результат работы оптимизатора... Спасибо! Переход я видел, но до метки, на которую он ведёт, видимо не дошёл, решил, что это просто выход из switch...
Значит ошибка была не в этом... Дело в том, что при таком варианте прерывание от ExtInt1 действительно не открывается, судя по тому, что устройство перестаёт реагировать на прерывания вплоть до перезапуска.
Ладно, буду искать дальше.
Ещё раз спасибо!

_________________
Странник


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB