|
|
  |
ARM 7(9) Cortex A, Простой переключатель контекста |
|
|
|
May 30 2018, 11:57
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(mantech @ May 30 2018, 13:49)  Собственно интересует сам сабж, простейший переключатель контекста для работы 2 функций вытесняющим способом, без всяких очередей, листов и пр. наворотов РТОСов, под контроллер прерываний данных МК. Вроде простая задача, но че-то затупило у меня, почему-то не работает вложенное прерывание или программное на котором делал свою старую реализацию. Выдирать из фриртосов и пр. процесс не простой, т.к. честно говоря в АРМовском асме силен не особенно. Буду рад, если у кого что завалялось подобное... В Cortex-A, насколько я слышал, архитектура прерываний подобна ARM7/9. А там всего два вектора: IRQ и FIQ (не считая fault-ов). И устроено там всё совсем не так как в Cortex-M. Там вытеснение простым способом не сделать - не заточено ядро под ОСы. Там нет понятия "вложенных прерываний". При срабатывании какого-то прерывания, процессор переключается на контекст данного прерываний (свой набор регистров), поэтому такое же вложенное прерывание уже невозможно. Вложенности и переключения контекста там делаются искусственно - копированием регистров из одного стека в другой. Цитата(mantech @ May 30 2018, 14:54)  Дак у фриртоса тоже подобное есть, только использовать это без ртосной обвязки трудновато, либо надо хорошо знать асм... Без знания асм и механизма работы прерываний там никак.
|
|
|
|
|
May 30 2018, 12:39
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(jcxz @ May 30 2018, 14:57)  Там вытеснение простым способом не сделать - не заточено ядро под ОСы. Там нет понятия "вложенных прерываний". При срабатывании какого-то прерывания, процессор переключается на контекст данного прерываний (свой набор регистров), поэтому такое же вложенное прерывание уже невозможно. Вложенности и переключения контекста там делаются искусственно - копированием регистров из одного стека в другой.
Без знания асм и механизма работы прерываний там никак. Хорошо, упрощу задачу. В пред. проекте нужно было сделать переключение таким образом - Есть прерывания устройств (уарты и пр...) которые должны выполнятся всегда, обработчики маленькие и быстрые. Есть задача №1, которая вызывается из прерывания таймера по истечению опред. интервала. При наступлении данного события из прерывания таймера вызывалось программное прерывание, после этого обработчик таймера завершал свою работу. Управление передавалось задаче программного прерывания и она там работала до тех пор, пока флаг разрешения не уст. в 1, после этого задача сама завершалась (как в кооперативном режиме), и оставшееся время отдавалось осн. программе. Т.е. получаем 3 уровня работы - прерывания, задача прогр. прерывания и осн. программа. Это все работало на кортекс А9 с контроллером GIC , сейчас хочу подобное сделать на А8 у него нет GIC, и все это не работает....
|
|
|
|
|
May 30 2018, 13:53
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(scifi @ May 30 2018, 16:29)  Если есть прерывания устройств, значит, есть и какой-то контроллер прерываний. Надо пользоваться его возможностями. Вот и пытаюсь, только когда попадаю в прерывание, чтоб разрешить его снова даю команду CPSIE I на чем оно и зависает... Цитата(k155la3 @ May 30 2018, 16:16)  Можно поискать планировщик/sheduler наподобие этогои из него - переключатель контекста. Кода не так много. Все здорово, но опять же под М серию...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|