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

ARM 7(9) Cortex A

Приветствую.

 

Собственно интересует сам сабж, простейший переключатель контекста для работы 2 функций вытесняющим способом, без всяких очередей, листов и пр. наворотов РТОСов, под контроллер прерываний данных МК.

 

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

 

 

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


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

 

Этож кооперативка, на подобии protothreads или я не так понял? У меня вся загвоздка с низкоуровневой работой с обработчиками прерываний либо SWI либо вложенных IRQ.

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


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

Не знаю, как в Cortex-A, но в Cortex-M два указателя стека. Дал каждой задаче свой, ну и только успевай регистры сохранять - восстанавливать.

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


Ссылка на сообщение
Поделиться на другие сайты
Не знаю, как в Cortex-A, но в Cortex-M два указателя стека. Дал каждой задаче свой, ну и только успевай регистры сохранять - восстанавливать.

 

В том то и дело, что в М контроллер прерываний другого типа...

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


Ссылка на сообщение
Поделиться на другие сайты
Можно попробовать подсмотреть у ChibiOS.

 

Дак у фриртоса тоже подобное есть, только использовать это без ртосной обвязки трудновато, либо надо хорошо знать асм...

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


Ссылка на сообщение
Поделиться на другие сайты
Собственно интересует сам сабж, простейший переключатель контекста для работы 2 функций вытесняющим способом, без всяких очередей, листов и пр. наворотов РТОСов, под контроллер прерываний данных МК.

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

В Cortex-A, насколько я слышал, архитектура прерываний подобна ARM7/9. А там всего два вектора: IRQ и FIQ (не считая fault-ов). И устроено там всё совсем не так как в Cortex-M.

Там вытеснение простым способом не сделать - не заточено ядро под ОСы.

Там нет понятия "вложенных прерываний". При срабатывании какого-то прерывания, процессор переключается на контекст данного прерываний (свой набор регистров), поэтому такое же вложенное прерывание уже невозможно. Вложенности и переключения контекста там делаются искусственно - копированием регистров из одного стека в другой.

 

Дак у фриртоса тоже подобное есть, только использовать это без ртосной обвязки трудновато, либо надо хорошо знать асм...

Без знания асм и механизма работы прерываний там никак.

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


Ссылка на сообщение
Поделиться на другие сайты
Там вытеснение простым способом не сделать - не заточено ядро под ОСы.

Там нет понятия "вложенных прерываний". При срабатывании какого-то прерывания, процессор переключается на контекст данного прерываний (свой набор регистров), поэтому такое же вложенное прерывание уже невозможно. Вложенности и переключения контекста там делаются искусственно - копированием регистров из одного стека в другой.

 

 

Без знания асм и механизма работы прерываний там никак.

 

 

Хорошо, упрощу задачу. В пред. проекте нужно было сделать переключение таким образом -

Есть прерывания устройств (уарты и пр...) которые должны выполнятся всегда, обработчики маленькие и быстрые. Есть задача №1, которая вызывается из прерывания таймера по истечению опред. интервала. При наступлении данного события из прерывания таймера вызывалось программное прерывание, после этого обработчик таймера завершал свою работу. Управление передавалось задаче программного прерывания и она там работала до тех пор, пока флаг разрешения не уст. в 1, после этого задача сама завершалась (как в кооперативном режиме), и оставшееся время отдавалось осн. программе.

Т.е. получаем 3 уровня работы - прерывания, задача прогр. прерывания и осн. программа.

 

Это все работало на кортекс А9 с контроллером GIC , сейчас хочу подобное сделать на А8 у него нет GIC, и все это не работает....

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


Ссылка на сообщение
Поделиться на другие сайты
Выдирать из фриртосов и пр. процесс не простой, . . .

Можно поискать планировщик/sheduler наподобие этого

и из него - переключатель контекста. Кода не так много.

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


Ссылка на сообщение
Поделиться на другие сайты
Есть прерывания устройств (уарты и пр...) которые должны выполнятся всегда, обработчики маленькие и быстрые.

...

Это все работало на кортекс А9 с контроллером GIC , сейчас хочу подобное сделать на А8 у него нет GIC, и все это не работает....

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

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


Ссылка на сообщение
Поделиться на другие сайты
Если есть прерывания устройств, значит, есть и какой-то контроллер прерываний. Надо пользоваться его возможностями.

 

Вот и пытаюсь, только когда попадаю в прерывание, чтоб разрешить его снова даю команду CPSIE I на чем оно и зависает...

 

Можно поискать планировщик/sheduler наподобие этого

и из него - переключатель контекста. Кода не так много.

 

Все здорово, но опять же под М серию...

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


Ссылка на сообщение
Поделиться на другие сайты
Все здорово, но опять же под М серию...

 

Вопрос закрыт, дело было в неправильном сохранении регистров, поправил заработало. Всем спасибо :rolleyes:

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация