|
|
  |
функция не выходит из while. |
|
|
|
Nov 17 2015, 12:35
|
Профессионал
    
Группа: Участник
Сообщений: 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 функция все равно не выходит.
|
|
|
|
|
Nov 17 2015, 14:47
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(mcheb @ Nov 17 2015, 20:09)  Листинг то чего сообщает? посмотрю. не уверен что пойму. Цитата(Abell @ Nov 17 2015, 20:22)  Извиняюсь спросить - что-то мешает сделать проверку таймаута в условии цикла?  это идея. сейчас попробую.
|
|
|
|
|
Nov 17 2015, 16:02
|
Профессионал
    
Группа: Участник
Сообщений: 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
} } вроде как час уже работает. хотя может зависнуть и через несколько часов.
|
|
|
|
|
Nov 17 2015, 16:12
|

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

|
В примерах от ST HCI_Isr() засунут в SPI_IRQ_Handler(), который, в свою очередь, является дефайном для EXTIxxx_IrqHandler.
Вызывается, если BlueNRG дёргает ножкой "у меня есть данные, давай читай". Подробности не помню, но могу предположить, что пока данные не закончатся, ножку он не опустит. Из чего можно сделать вывод, что выход по таймауту работает. Только пользы никакой не приносит - прерывание тут же вызывается снова.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Nov 17 2015, 16:21
|
Профессионал
    
Группа: Участник
Сообщений: 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 - я туда не попадаю.
|
|
|
|
|
Nov 17 2015, 20:16
|

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

|
Цитата Из чего можно сделать вывод, что выход по таймауту работает. Только пользы никакой не приносит - прерывание тут же вызывается снова. Вот я тоже о том-же. Не надо точку останова. Вы лучше ногой махайте при выходе и смотрите осциллографом машет ли она. Или светодиод на нее повесить. А точки останова будут корректно обрабатываться только если выключить оптимизацию, в остальных случаях с ними могут быть проблемы из-за того что отладчику сложно сопоставить строку кода и конкретную инструкцию(компилятор их здорово перемешивает и сокращает при оптимизации).
--------------------
The truth is out there...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|