Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: функция не выходит из while.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Есть такая функция.

Код
void HCI_Isr(void)
{  
  isr_timeout = IRQ_TIMEOUT;

  while(BlueNRG_DataPresent())
  {
      if(!isr_timeout--)
      {
          break;
      }

         //some code

  }
}

BlueNRG_DataPresent() проверяет высокий сигнал на пине. Если модуль завис то while все время крутиться. но я сделал таймаут а из в while функция все равно не выходит.
CrimsonPig
Цитата(Jenya7 @ Nov 17 2015, 12:35) *
Есть такая функция.
BlueNRG_DataPresent() проверяет высокий сигнал на пине. Если модуль завис то while все время крутиться. но я сделал таймаут а из в while функция все равно не выходит.


Круто!
mcheb
Листинг то чего сообщает?
Abell
Цитата(Jenya7 @ Nov 17 2015, 15:35) *
Есть такая функция.

Извиняюсь спросить - что-то мешает сделать проверку таймаута в условии цикла? laughing.gif
Jenya7
Цитата(mcheb @ Nov 17 2015, 20:09) *
Листинг то чего сообщает?

посмотрю. не уверен что пойму.



Цитата(Abell @ Nov 17 2015, 20:22) *
Извиняюсь спросить - что-то мешает сделать проверку таймаута в условии цикла? laughing.gif

это идея. сейчас попробую.
sigmaN
Вроде должно работать и так по идее. Там видимо в чем-то еще дело. Например он из прерывания выходит по таймауту вашему и тут-же в него(прерывание) снова заходит.

А вообще это жесть - так долго сидеть в прерывании и чего-то там ждать. Вся система колом встанет на время этого ожидания и либо все остальные прерывания, либо те что ниже приоритетом чем это(в зависимости от контроллера) не смогут обслуживаться.
Abell
sigmaN, +1, только он же вроде не в прерывании сидит sm.gif Хотя, действительно, правильней было бы по изменению сигнала на входе вызывать прерывание - но мы не знаем задачу автора, может это у него такое жесткое условие - никаких прерываний, все в цикл laughing.gif
sigmaN
void HCI_Isr(void)
как-бэ намекает, что это обработчки прерывания какого-то ))))
Jenya7
Цитата(sigmaN @ Nov 17 2015, 21:03) *
Вроде должно работать и так по идее. Там видимо в чем-то еще дело. Например он из прерывания выходит по таймауту вашему и тут-же в него(прерывание) снова заходит.

А вообще это жесть - так долго сидеть в прерывании и чего-то там ждать. Вся система колом встанет на время этого ожидания и либо все остальные прерывания, либо те что ниже приоритетом чем это(в зависимости от контроллера) не смогут обслуживаться.


у меня выхода нет. это отдельный модуль. он живет своей жизнью. когда ему есть что сообщить - поднял пин, вычитали с него все - опустил пин.
если модуль завис - я должен выйти по таймауту.
пока сделал так.
Код
void HCI_Isr(void)
{  
  isr_timeout = IRQ_TIMEOUT;

  while(BlueNRG_DataPresent() && isr_timeout)
  {
      isr_timeout--;
    
         //some code

  }
}

вроде как час уже работает. хотя может зависнуть и через несколько часов.
esaulenka
В примерах от ST HCI_Isr() засунут в SPI_IRQ_Handler(), который, в свою очередь, является дефайном для EXTIxxx_IrqHandler.

Вызывается, если BlueNRG дёргает ножкой "у меня есть данные, давай читай". Подробности не помню, но могу предположить, что пока данные не закончатся, ножку он не опустит.
Из чего можно сделать вывод, что выход по таймауту работает. Только пользы никакой не приносит - прерывание тут же вызывается снова.
Jenya7
Цитата(esaulenka @ Nov 17 2015, 22:12) *
В примерах от ST HCI_Isr() засунут в SPI_IRQ_Handler(), который, в свою очередь, является дефайном для EXTIxxx_IrqHandler.

Вызывается, если BlueNRG дёргает ножкой "у меня есть данные, давай читай". Подробности не помню, но могу предположить, что пока данные не закончатся, ножку он не опустит.
Из чего можно сделать вывод, что выход по таймауту работает. Только пользы никакой не приносит - прерывание тут же вызывается снова.

на скопе вижу высокий уровень на ноге - она не опускается. проблема в старом стаке - версия 6.3. в любом случае должен быть механизм выхода.
кстати опять завис - ставлю точку останова после while - я туда не попадаю.
sigmaN
Цитата
Из чего можно сделать вывод, что выход по таймауту работает. Только пользы никакой не приносит - прерывание тут же вызывается снова.
Вот я тоже о том-же.

Не надо точку останова. Вы лучше ногой махайте при выходе и смотрите осциллографом машет ли она. Или светодиод на нее повесить.
А точки останова будут корректно обрабатываться только если выключить оптимизацию, в остальных случаях с ними могут быть проблемы из-за того что отладчику сложно сопоставить строку кода и конкретную инструкцию(компилятор их здорово перемешивает и сокращает при оптимизации).
Jenya7
Цитата(sigmaN @ Nov 18 2015, 02:16) *
Вот я тоже о том-же.

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


но как прерывание вызывается снова? у меня оно по rising edge а нога все время висит в logic high.
sigmaN
В общем нужно диагностировать ситуацию точно не брэйком, а маханием ногой и осциллографом(или иным способом минимально коротким, максимально атомарным и без использования отладчика). Тогда будет какая-то ясность выходит оно по таймауту или нет. Я думаю, что не выходить оно не может и проблема где-то в другом. Может быть есть ошибка и прерывание не по фронту а по уровню настроено...я же не знаю )
Jenya7
Цитата(sigmaN @ Nov 18 2015, 19:11) *
В общем нужно диагностировать ситуацию точно не брэйком, а маханием ногой и осциллографом(или иным способом минимально коротким, максимально атомарным и без использования отладчика). Тогда будет какая-то ясность выходит оно по таймауту или нет. Я думаю, что не выходить оно не может и проблема где-то в другом. Может быть есть ошибка и прерывание не по фронту а по уровню настроено...я же не знаю )

мне кажется это проблема дебагера была. он таки выходил и сразу заходил.
спасибо всем за помощь.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.