User_1

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

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

User_1    2

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

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

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


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

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

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

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


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

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

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


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

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

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


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

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

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

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


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

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

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

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

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

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

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

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


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

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

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

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

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

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

Бред.

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

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


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

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

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

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


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

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

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

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

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

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

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


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

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

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

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


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    32
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 смайлов.

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

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

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

Загрузка...

  • Сообщения

    • "Безумству храбрых поём мы песмю ! "
      Не...это так не пойдёт ! Слишком нахально ...;-) . Нужно запитать базу с делителя . Контроль тока установить в коллекторе . Тогда , регулировкой делителя можно определить  усиление каскада
      Вообще КТ 315 довольно ходовой транзюк . На нём можно сделать стабилизатор со сверх/малым потреблением , можно сделать генератор пилы ...к недостаткам относится старение пластмассы которое рвёт подводы к кристаллу.
      Впрочем и у западников такая беда есть . У меня осцилл ХАМЕГ (старый, купил на барахле ) так в нём 5штук однотипных транзюков были в обрывах. Пральна ! этоже было при царе горохе , очвидно не оцифровали, но идеят о осталась ! я же сам её не выдумал ! ;-)
      Да, в дополнение :
      Таким устройством можно проверять светодиоды (ониже разные от 2в до 15 ...совремённый тестер по любому не берёт) и газоразрядные приборы (ЛДС, неонки ..)
      Насчёт СВЧ ...если интересно то могу обьяснить проверку кристаллов c помощью осцилла и генератора.
      Метод- сравнение с оригиналом . Как оказалось Д9 вполне годится для контроля СВЧ печки , думается ,что и повыше сработает . Насобиралось от разломов с улицы . Обычно народ выбрасывает не только нерабочее, но и морально устаревшее . А у меня "жаба" - вот собираю и смотрю что внутри. ;-)
      Насчёт военки ...проверял один блок . В параметры не шёл и главное промежуточные операции делал мой кореш.
      Нашёл микросхему - плыла от температуры , но параметр был жёсткий, а кореш ошибся на пару знаков и ОТК-ашке мозги запудрил при сдаче. Сканьдаль был - меня от работы отстранили - послал ведущего нах ,,но за дело! Он стал выискивать аномальные места на рабочем столе!! ;-) Нехилый у вас приборчик ! а у меня всё самодельное (почти). С переездом пришлось всё побросать ...зато освоил западное барахло! ;-) Не понял откуда взялись 12ма ?  Транзюки проверяются с неподключенной базой - чисто на утечку . Можно брать и Б-К... Ниодного случая порчи небыло. Обычно смотришъ по микроамперметру - пошла стрелка - значит СТОП ! Обычно это в пределах до 50мка
      А диоды если плывут то плывут и я такие сразу в мусор. В сборках бывают шумят. Тестер такой дефект не берёт, а вот приёмник рядом ловит.  
    • Микра реально существует и заменить ее не реально. Искать ЭБУ на разборках или барахолках в интернете. http://pdf1.alldatasheet.com/datasheet-pdf/view/127936/INTEL/M87C51.html Целый микропроцессор, не просто память.   Близкие и более новые 89С51, только один хрен, что туда зашивать!?
    • Должна работать, если обеспечить хороший " 0 " .Для 155 серии нужно уменьшить номиналы резисторов делителя  в несколько раз. Или перевернуть её поменяв проводимость транзисторов.
    • Пришёл на работу. Коллеги доели питцу. Картон от упаковки питцы стал основой для быстрого изготовления корпуса. Время - деньги.)) 
    • Большое спасибо! попробую схему от клона
    • Я конечно жутко извиняюсь, но балансировку 318-той (и клонов) можно то 1 раз подпаять!? При замене на 49710 ничего и делать то не нужно. Соответствующие ноги ни с чем электрически не связаны.
    • Видимо мало наслышаны.   Впрочем собирайте самую первую и если до этого ничего не слушали, звук будет обалденный.