по микросекундам) и FreeRTOS
Работу дальномера я наладил, без ртос все работает
Сделал таймер, настроил его на 1 МКС (тактирование проца 24 МГЦ, предделитель на таймер 2, регистр перезагрузки 12 и получаем прерывание каждую 1 МКС)
Звучит уже странно, каждый раз вызывать функцию, но мне надо считать время, пусть будет
Теперь запихиваю это в ртос
Ииии... Я не успеваю выйти из прерывания 1 мкс
По коду: я запускаю таймер, после этого цикл while, в котором жду, пока на ножке пина изменится сигнал, как только это происходит, выключаю таймер, считаю время начала и время конца
Если добавить это в ртос, то я постоянно живу в прерывании таймера, сигнал нужный уже получен (проверил), но код не попадает в тот самый проверяющий цикл
Я попробовал проверять ножку прям в прерывании и тут же отключать таймер, это работает
Но костыльно, я пользуюсь тем, что после включения таймера я не вернусь в основную функцию
Как можно заставить это работать?
аа.. насколько я помню, УЗ сначала пинается, а потом на другой ноге ждем импульс. Делай иначе. Таймер настрой на захват импульса. После того как пнул дальномер, сбрасывай таймер, и в прерывании по приходу фронта смотри сколько тиков таймера набежало и уже из прерывания отправляй нотфикацию нужной задаче на обработку результата. статья про таймеры: https://istarik.ru/blog/stm32/121.html Или иначе. Если уже не перекинуть вход от УЗ. Нога на прерывание. После пинка запускаем таймер, а в прерывании gpio_exti смотрим сколько таймер насчитал и дальше как и выше.
Один канал шим , второй захват. Лучше два канала на захват. Один по переднему фронту второй по заднему. По заднему прерывание и выгребай время. Чтоб показания более точными были ваншот. И пинаем по новой.
Прекрасное описание того, что FreeRTOS не предназначена для работы с подобными задачами) Сейчас загуглил: у нее время context switch около 84 тактов (кто-то и 170 намерил) - это на stm32f103.
Прекрасно работает фриртосина с подобными задачами. Тут больше вопрос правильной работы с периферией из под оси.
как вы опровергните факт, что она переключает контент не менее чем за 80 тактов?
попробуйте написать такую переключалку, там все 200 тактов
так я же ни разу не спорю. более того: там в описании к фриртос приводятся очень показательные тонкости работы со стеком когда при переключении контекста (пуше в стек) возникает еще одно переключение. и регистры пушатся вторично)
Обсуждают сегодня