Перейти к содержанию
    

Переход из прерывания

Что то инет у меня глючит, начинаю отвечать , отрубается.

Транслировать наверх получется сложнее, чем сделать один переход из одной функции прерывания. Функций чтения много, и они могут быть и на втором и на третьем уровне. Это сколько проверо по дороге надо делать.

 

Ну и зачем делать откат в начало? Пусть себе программа работает, если выдернули устройство, то программа переходит в один режим, если вставили, то в другой. Зачем что-то обнулять? Заведите переменную, обозначающую режим и проверяйте ее. Вот прикинье - вставили/вынули USB дивайс, винда перегрузилась - хорошо это?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Функций чтения много, и они могут быть и на втором и на третьем уровне. Это сколько проверо по дороге надо делать.

Вот и плохо что много. Должна быть одна функция чтения, в которой обрабатываются ошибки связи с устройством. т.е. разделите программу на уровни не по вложенности, а по характеру действий хотя бы на канальный, транспортный(в вашем случае сразу сеансовый) и прикладной. см. модель http://www.citforum.ru/nets/switche/osi.shtml.

Изменено пользователем defunct

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поправляюсь - функция чтения естественно одна. Но вызываеться она может с разных уровней. Но отсутствие устройства все рано определяется возникновением прерывания, и логично из него уйти в начало. Этим сейчас WDT занимается, но он делает полный сброс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поправляюсь - функция чтения естественно одна. Но вызываеться она может с разных уровней.

мало ли откуда она вызывается? главное чтобы функция чтения производила разбор протокола работы с устройством, и обрабатывала ошибки связи, а на верхний уровень передавала только правильно распознанные данные.

 

Но отсутствие устройства все рано определяется возникновением прерывания, и логично из него уйти в начало. Этим сейчас WDT занимается, но он делает полный сброс.

В прерывании установить флаг ошибки устройства, который заблокирует например функцию чтения. Разблокировать этот флаг может например, функция "реанимации" устройства, которая будет вызываться пока флаг ошибки устройства установлен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, уж я лучше оставлю все как есть.

вероятно, это правильное решение. WDT всяко надежнее манипуляций со стеком и неправильного использования прерываний.

 

Иначе из-за одного перехода придется переписывать всю программу, менять все функции на булевые, чтобы корректно откатываться наверх. У меня эта прога была сначала написана на ассемблере, и там переход из прерывания в начало программы решал все проблемы. А перевел на Си и столкнулся с этой бякой.

Менять пришлось бы только функцию чтения...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Внутри одной функции переход с одной позиции в другую может только через явные операторы goto, break continue или посредством других конструкций языка программирования если таковые есть или же перезагрузкой самого контроллера. Мне ваша логика непонятна - хотите ли вы совершать какие то действия после того как команда отправлена или не желаете ждать ответа от команды и проверять результат на правильность или на что то другое?

 

Для вашего случая (не знаю слово рецидив подходит или нет )) ) можно вот что предложить :

- выделить одну переменную для значения результата

- в самом начале main сохранить контекст setjmp()

- все инициализации переменных и констант выделить в отдельную функцию и вызвать ее до сохранения сохранения контекста в main(), причем переменная результата тоже инитиализируется там .

- в прерывании где обнаруживается ошибка - вызывается программа инициализации переменных

- затем в том же прерывании присваивается значение результата

- и в том же прерывании переходится на контекст сохраненый при загрузке .

- в main() сразу после сохранения контекста ввести условие в соответствии с переменной результата

 

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

 

Но поверьте мне - овчинка не стоит выделки ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Менять пришлось бы только функцию чтения...
И все вызывающие ее функции. Они тоже должны вернуть наверх ошибку.

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

 

"Правильная" проверка флагов и откат по ошибке наверх увеличили программу почти на 200 байт. И глубина стека возросла.

 

Вариант с longjmp тоже оказался не походящим - jmp_buf отъедает 21 байт от ОЗУ (из 128). На стек уже не остается.

Изменено пользователем Георгий

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...