mantech 53 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Приветствую. Собственно интересует сам сабж, простейший переключатель контекста для работы 2 функций вытесняющим способом, без всяких очередей, листов и пр. наворотов РТОСов, под контроллер прерываний данных МК. Вроде простая задача, но че-то затупило у меня, почему-то не работает вложенное прерывание или программное на котором делал свою старую реализацию. Выдирать из фриртосов и пр. процесс не простой, т.к. честно говоря в АРМовском асме силен не особенно. Буду рад, если у кого что завалялось подобное... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба setjmp/longjmp годится? тут. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба setjmp/longjmp годится? тут. Этож кооперативка, на подобии protothreads или я не так понял? У меня вся загвоздка с низкоуровневой работой с обработчиками прерываний либо SWI либо вложенных IRQ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Не знаю, как в Cortex-A, но в Cortex-M два указателя стека. Дал каждой задаче свой, ну и только успевай регистры сохранять - восстанавливать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Не знаю, как в Cortex-A, но в Cortex-M два указателя стека. Дал каждой задаче свой, ну и только успевай регистры сохранять - восстанавливать. В том то и дело, что в М контроллер прерываний другого типа... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Можно попробовать подсмотреть у ChibiOS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Можно попробовать подсмотреть у ChibiOS. Дак у фриртоса тоже подобное есть, только использовать это без ртосной обвязки трудновато, либо надо хорошо знать асм... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Собственно интересует сам сабж, простейший переключатель контекста для работы 2 функций вытесняющим способом, без всяких очередей, листов и пр. наворотов РТОСов, под контроллер прерываний данных МК. Вроде простая задача, но че-то затупило у меня, почему-то не работает вложенное прерывание или программное на котором делал свою старую реализацию. Выдирать из фриртосов и пр. процесс не простой, т.к. честно говоря в АРМовском асме силен не особенно. Буду рад, если у кого что завалялось подобное... В Cortex-A, насколько я слышал, архитектура прерываний подобна ARM7/9. А там всего два вектора: IRQ и FIQ (не считая fault-ов). И устроено там всё совсем не так как в Cortex-M. Там вытеснение простым способом не сделать - не заточено ядро под ОСы. Там нет понятия "вложенных прерываний". При срабатывании какого-то прерывания, процессор переключается на контекст данного прерываний (свой набор регистров), поэтому такое же вложенное прерывание уже невозможно. Вложенности и переключения контекста там делаются искусственно - копированием регистров из одного стека в другой. Дак у фриртоса тоже подобное есть, только использовать это без ртосной обвязки трудновато, либо надо хорошо знать асм... Без знания асм и механизма работы прерываний там никак. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Там вытеснение простым способом не сделать - не заточено ядро под ОСы. Там нет понятия "вложенных прерываний". При срабатывании какого-то прерывания, процессор переключается на контекст данного прерываний (свой набор регистров), поэтому такое же вложенное прерывание уже невозможно. Вложенности и переключения контекста там делаются искусственно - копированием регистров из одного стека в другой. Без знания асм и механизма работы прерываний там никак. Хорошо, упрощу задачу. В пред. проекте нужно было сделать переключение таким образом - Есть прерывания устройств (уарты и пр...) которые должны выполнятся всегда, обработчики маленькие и быстрые. Есть задача №1, которая вызывается из прерывания таймера по истечению опред. интервала. При наступлении данного события из прерывания таймера вызывалось программное прерывание, после этого обработчик таймера завершал свою работу. Управление передавалось задаче программного прерывания и она там работала до тех пор, пока флаг разрешения не уст. в 1, после этого задача сама завершалась (как в кооперативном режиме), и оставшееся время отдавалось осн. программе. Т.е. получаем 3 уровня работы - прерывания, задача прогр. прерывания и осн. программа. Это все работало на кортекс А9 с контроллером GIC , сейчас хочу подобное сделать на А8 у него нет GIC, и все это не работает.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Выдирать из фриртосов и пр. процесс не простой, . . . Можно поискать планировщик/sheduler наподобие этого и из него - переключатель контекста. Кода не так много. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Есть прерывания устройств (уарты и пр...) которые должны выполнятся всегда, обработчики маленькие и быстрые. ... Это все работало на кортекс А9 с контроллером GIC , сейчас хочу подобное сделать на А8 у него нет GIC, и все это не работает.... Если есть прерывания устройств, значит, есть и какой-то контроллер прерываний. Надо пользоваться его возможностями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Если есть прерывания устройств, значит, есть и какой-то контроллер прерываний. Надо пользоваться его возможностями. Вот и пытаюсь, только когда попадаю в прерывание, чтоб разрешить его снова даю команду CPSIE I на чем оно и зависает... Можно поискать планировщик/sheduler наподобие этого и из него - переключатель контекста. Кода не так много. Все здорово, но опять же под М серию... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 53 30 мая, 2018 Опубликовано 30 мая, 2018 · Жалоба Все здорово, но опять же под М серию... Вопрос закрыт, дело было в неправильном сохранении регистров, поправил заработало. Всем спасибо :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться