User_1

Выход из прерывания в произвольный участок кода

22 сообщения в этой теме

User_1    2

Всем доброго времени суток

Работаю с мк stm32f105 и возникла такая задача: происходит прерывание и нужно из него вернуться не в тот участок кода, где оно произошло, а в заранее заданный. Кто-нибудь пробовал делать что-то подобное?

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


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    29
46 minutes ago, aitras said:

Изменить содержимое счетчика команд?

При этом надо еще освободить стек.

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


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

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

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


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

для этого достаточно в стеке подменить сохраненный адрес счетчика команд на нужный. А для этого нужно знать порядок упаковки регистров в стек, и иметь указатель на точку возврата. Дальше вроде все просто. Но это очень небезопасный способ и вообще я бы забыл о возможности такого решения навсегда.

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


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

подумал немного...

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

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


Ссылка на сообщение
Поделиться на других сайтах
Загрузка...
12 часа назад, User_1 сказал:

...мк сохраняет в стек текущие значения переменных...

Регистров! У МК нет переменных, а есть регистры. 

3 часа назад, mail_robot сказал:

подумал немного...

то о чем просит ТС так же "красиво и правильно"...

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

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


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

Откройте свою сокровенную идею, нафига так делать.

Когда можно и обычными способами перейти

А если ситуация что в функции выполняется работа с железом

Вы дрыгаете  ногами.

Из функции вас выкидывает по прерыванию и вы туда больше не возвращаетесь, при чем какие то ноги остались висеть не в правильном состоянии

Бред.

Если нужно прерывать выполнение функции, делайте флаги, семафоры или еще что то

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


Ссылка на сообщение
Поделиться на других сайтах
Alex Falcon    184
15 часов назад, User_1 сказал:

происходит прерывание и нужно из него вернуться не в тот участок кода

Когда мы были молодыми и программировали на "Агат" ассемблерные вставки, была очень модной идея самомодифицируемого кода, это было круто, программа сама себя правила в зависимости от различных условий, в то числе и возвраты из подпрограмм.. Но на сегодняшний день с такими конскими запасами производительности и памяти разрушать сам смысл прерывания, как процедуры прозрачной и незаметной для основного кода... ЗАЧЕМ???!!

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


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

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

Любой инструмент нужно использовать осторожно и с умом, это всем понятно. Я код пишу для самоделок, так что от его кривизны точно никто не пострадает - так почему бы не научиться работать со стеком?)

Пару лет назад видел статью где такой трюк делали на AVR, но сейчас найти её не смог - так бы хоть знал куда копать

Где стмка хранит стек известно (можно даже самому его разместить где угодно). Всё, что мне нужно, очевидно, находится на его вершине. Но как там организованы данные?

Изменено пользователем User_1
очепятка

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


Ссылка на сообщение
Поделиться на других сайтах
Alex    556
28 минут назад, User_1 сказал:

Всё, что мне нужно, очевидно, находится на его вершине. Но как там организованы данные?

Возьмите любую вытесняющую ОСРВ, поддерживающую ваш камень и компилятор, и подсмотрите как там сделано.

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


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    29
28 minutes ago, User_1 said:

Но как там организованы данные?

Почитайте Мартин. Инсайдерское руководство по STM32. Там описано что помещается в стек.

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


Ссылка на сообщение
Поделиться на других сайтах
User_1    2
10 минут назад, snn_krs сказал:

Почитайте Мартин. Инсайдерское руководство по STM32

Спасибище)

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


Ссылка на сообщение
Поделиться на других сайтах
dosikus    10
В 20.04.2018 в 11:58, snn_krs сказал:

Почитайте Мартин. Инсайдерское руководство по STM32. Там описано что помещается в стек.

Это хрень полная, поверхностный обзор. А если еще и переводная то в топку однозначно.

Лучше читайте 

The Designer’s Guide to the Cortex-M Processor Family

Trevor Martin

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


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

@User_1  Не знаю что так все плюються твоя задача я так понял это переключение контекста. Почитай Джозеф Ю. Ядро Cortex-M3 компании ARM Полное руководство. 2015. Там все подробнейшим образом описано.

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

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


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

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

Как уже сказано: сделать иначе практически невозможно, хотя можно добавить собственных ошибок, и по началу это даже будет круто.

https://bitbucket.org/AVI-crak/rtos-cortex-m3-gcc/commits/branch/default

Для stm32f105 применяется файл RtoS_cortex_m3.S. Строка 453 - выход в новую задачу, всё остальное - варианты сохранения и переключения контекста. То-же самое можно сделать на Си, да поначалу так оно и было - но к сожалению GCC выше 4,3 жутко чудит в этих вопросах, а двигаться дальше нужно...

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


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Сообщения

    • Валерий Сергеевич! Вы опять ничего не поняли. По 6П44С ВАХ-и давал lnx  - да, давал. Но по G1, при экранном 95 Вольт. Вы, просто, увидели похожие цифры и возрадовались. Но, возрадовавшись, не поняли увиденного. Сути не заметили. А из этой ВАХ, между прочим, со всей очевидностью следует, что при напряжении анода в 290 Вольт, 95 экранного, для 6П44С, чрезмерно. Я же говорил о совсем другой ВАХ, для совсем другой лампы. Во первых, для 6П36С, во вторых, по G2, а не G1. Попытайтесь, хоть по картинке, понять разницу. А рекомендацию 100в. для 6П45П, даёт Манаков на аудиопортале - может и даёт. Только, применительно к какой схеме / режиму? Василичь, вот, тоже даёт рекомендацию. У него одни и те же моточные данные тора под все лампы и все схемы подходят. Хоть под 6П6С, хоть под ГУ-50. Прикажете верить? И, потом, что мне Манаков? У меня есть стенд, способный много точнее и быстрее любого Манакова ответить мне на мои вопросы.
    • Спасибо за ссылку. Я пытался пользоваться софтом 1-Wire Devices, но у меня не получилось им записать чип, только мог считать прошивку. Потом я нашёл другой софт  http://lapatushka.com/ , который пишет в чип, но он платный. Есть бесплатный софт для 1-Wire от производителя (Dallas Sem), тоже пишет чип, но им немного неудобно. Но вот  возможность записи в чип оказалась бессмысленной   из-за привязки к серийному номеру.  Хочу ещё уточнить по третьей странице, возможно я не туда смотрю, объясните пожалуйста, ещё раз по адресам.
    • Всем привет!
      Пишу диплом, на тему импульсных источников питания. Один из разделов это анализ вариантов преобразования напряжения для питания систем управления электроприводом.
      Необходимо рассмотреть три варианта преобразований:
      1. Преобразование AC/DC 220/15V, затем 15V в 5V(DC) 
      2. Преобразование AC/DC 220/5V, затем  5V в 15V (DC)
      3. Использование импульсного источника питания с различным выходным напряжением.
      Определить какой вариант преобразований эффективней в использовании, и как влияет паразитная емкостная связь.
      Подскажите пожалуйста какие-нибудь книги или статьи,автора по этим темам.
      Сам я нашел какую-то информацию, но ее очень мало, а книгу всего одну "Импульсные источники питания от А до Z" Санджай М.
      Благодарю.
    • Всем привет!
      Пишу диплом, на тему импульсных источников питания. Один из разделов это анализ вариантов преобразования напряжения для питания систем управления электроприводом.
      Необходимо рассмотреть три варианта преобразований:
      1. Преобразование AC/DC 220/15V, затем 15V в 5V(DC) 
      2. Преобразование AC/DC 220/5V, затем  5V в 15V (DC)
      3. Использование импульсного источника питания с различным выходным напряжением.
      Определить какой вариант преобразований эффективней в использовании, и как влияет паразитная емкостная связь.
      Подскажите пожалуйста какие-нибудь книги или статьи,автора по этим темам.
      Сам я нашел какую-то информацию, но ее очень мало, а книгу всего одну "Импульсные источники питания от А до Z" Санджай М.
      Благодарю.
    • Из ВАХ и "нахожу".  По 6П44С ВАХ-и давал lnx за что я его уже благодарил.  А рекомендацию 100в. для 6П45П, даёт Манаков на аудиопортале.  Так что вывод не с потолка.
    • Ну хорошо, согласен, вопрос задан коряво. Перезадам иначе.