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

 
 
 
Reply to this topicStart new topic
> функция не выходит из while.
Jenya7
сообщение Nov 17 2015, 12:35
Сообщение #1


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть такая функция.

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

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

         //some code

  }
}

BlueNRG_DataPresent() проверяет высокий сигнал на пине. Если модуль завис то while все время крутиться. но я сделал таймаут а из в while функция все равно не выходит.
Go to the top of the page
 
+Quote Post
CrimsonPig
сообщение Nov 17 2015, 13:50
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502



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


Круто!
Go to the top of the page
 
+Quote Post
mcheb
сообщение Nov 17 2015, 14:09
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Листинг то чего сообщает?
Go to the top of the page
 
+Quote Post
Abell
сообщение Nov 17 2015, 14:22
Сообщение #4


профессиональный дилетант
****

Группа: Участник
Сообщений: 866
Регистрация: 16-03-06
Из: Шебекино - Лысьва - Тюмень
Пользователь №: 15 292



Цитата(Jenya7 @ Nov 17 2015, 15:35) *
Есть такая функция.

Извиняюсь спросить - что-то мешает сделать проверку таймаута в условии цикла? laughing.gif


--------------------
Скоро дело сказывается, да не скоро сказка делается, или тише будешь - дальше уедешь...

Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 17 2015, 14:47
Сообщение #5


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(mcheb @ Nov 17 2015, 20:09) *
Листинг то чего сообщает?

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



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

это идея. сейчас попробую.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 17 2015, 15:03
Сообщение #6


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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

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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Abell
сообщение Nov 17 2015, 15:20
Сообщение #7


профессиональный дилетант
****

Группа: Участник
Сообщений: 866
Регистрация: 16-03-06
Из: Шебекино - Лысьва - Тюмень
Пользователь №: 15 292



sigmaN, +1, только он же вроде не в прерывании сидит sm.gif Хотя, действительно, правильней было бы по изменению сигнала на входе вызывать прерывание - но мы не знаем задачу автора, может это у него такое жесткое условие - никаких прерываний, все в цикл laughing.gif


--------------------
Скоро дело сказывается, да не скоро сказка делается, или тише будешь - дальше уедешь...

Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 17 2015, 15:34
Сообщение #8


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



void HCI_Isr(void)
как-бэ намекает, что это обработчки прерывания какого-то ))))


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 17 2015, 16:02
Сообщение #9


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(sigmaN @ Nov 17 2015, 21:03) *
Вроде должно работать и так по идее. Там видимо в чем-то еще дело. Например он из прерывания выходит по таймауту вашему и тут-же в него(прерывание) снова заходит.

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


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

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

  }
}

вроде как час уже работает. хотя может зависнуть и через несколько часов.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Nov 17 2015, 16:12
Сообщение #10


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

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



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

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


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 17 2015, 16:21
Сообщение #11


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(esaulenka @ Nov 17 2015, 22:12) *
В примерах от ST HCI_Isr() засунут в SPI_IRQ_Handler(), который, в свою очередь, является дефайном для EXTIxxx_IrqHandler.

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

на скопе вижу высокий уровень на ноге - она не опускается. проблема в старом стаке - версия 6.3. в любом случае должен быть механизм выхода.
кстати опять завис - ставлю точку останова после while - я туда не попадаю.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 17 2015, 20:16
Сообщение #12


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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

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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 18 2015, 07:18
Сообщение #13


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(sigmaN @ Nov 18 2015, 02:16) *
Вот я тоже о том-же.

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


но как прерывание вызывается снова? у меня оно по rising edge а нога все время висит в logic high.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 18 2015, 13:11
Сообщение #14


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



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


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 19 2015, 07:18
Сообщение #15


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

мне кажется это проблема дебагера была. он таки выходил и сразу заходил.
спасибо всем за помощь.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:58
Рейтинг@Mail.ru


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