реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ARM 7(9) Cortex A, Простой переключатель контекста
mantech
сообщение May 30 2018, 10:49
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 2 067
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



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

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

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

Go to the top of the page
 
+Quote Post
scifi
сообщение May 30 2018, 11:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 919
Регистрация: 7-02-07
Пользователь №: 25 136



setjmp/longjmp годится? тут.
Go to the top of the page
 
+Quote Post
mantech
сообщение May 30 2018, 11:25
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 067
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(scifi @ May 30 2018, 14:13) *
setjmp/longjmp годится? тут.


Этож кооперативка, на подобии protothreads или я не так понял? У меня вся загвоздка с низкоуровневой работой с обработчиками прерываний либо SWI либо вложенных IRQ.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 30 2018, 11:34
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 333
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Не знаю, как в Cortex-A, но в Cortex-M два указателя стека. Дал каждой задаче свой, ну и только успевай регистры сохранять - восстанавливать.
Go to the top of the page
 
+Quote Post
mantech
сообщение May 30 2018, 11:42
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 067
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(ViKo @ May 30 2018, 14:34) *
Не знаю, как в Cortex-A, но в Cortex-M два указателя стека. Дал каждой задаче свой, ну и только успевай регистры сохранять - восстанавливать.


В том то и дело, что в М контроллер прерываний другого типа...
Go to the top of the page
 
+Quote Post
scifi
сообщение May 30 2018, 11:44
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 919
Регистрация: 7-02-07
Пользователь №: 25 136



Можно попробовать подсмотреть у ChibiOS.
Go to the top of the page
 
+Quote Post
mantech
сообщение May 30 2018, 11:54
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 067
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(scifi @ May 30 2018, 14:44) *
Можно попробовать подсмотреть у ChibiOS.


Дак у фриртоса тоже подобное есть, только использовать это без ртосной обвязки трудновато, либо надо хорошо знать асм...
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 30 2018, 11:57
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 4 661
Регистрация: 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) *
Дак у фриртоса тоже подобное есть, только использовать это без ртосной обвязки трудновато, либо надо хорошо знать асм...

Без знания асм и механизма работы прерываний там никак.
Go to the top of the page
 
+Quote Post
mantech
сообщение May 30 2018, 12:39
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 067
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(jcxz @ May 30 2018, 14:57) *
Там вытеснение простым способом не сделать - не заточено ядро под ОСы.
Там нет понятия "вложенных прерываний". При срабатывании какого-то прерывания, процессор переключается на контекст данного прерываний (свой набор регистров), поэтому такое же вложенное прерывание уже невозможно. Вложенности и переключения контекста там делаются искусственно - копированием регистров из одного стека в другой.


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



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

Это все работало на кортекс А9 с контроллером GIC , сейчас хочу подобное сделать на А8 у него нет GIC, и все это не работает....
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 30 2018, 13:16
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 005
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(mantech @ May 30 2018, 13:49) *
Выдирать из фриртосов и пр. процесс не простой, . . .

Можно поискать планировщик/sheduler наподобие этого
и из него - переключатель контекста. Кода не так много.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 30 2018, 13:29
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 919
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(mantech @ May 30 2018, 15:39) *
Есть прерывания устройств (уарты и пр...) которые должны выполнятся всегда, обработчики маленькие и быстрые.
...
Это все работало на кортекс А9 с контроллером GIC , сейчас хочу подобное сделать на А8 у него нет GIC, и все это не работает....

Если есть прерывания устройств, значит, есть и какой-то контроллер прерываний. Надо пользоваться его возможностями.
Go to the top of the page
 
+Quote Post
mantech
сообщение May 30 2018, 13:53
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 2 067
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(scifi @ May 30 2018, 16:29) *
Если есть прерывания устройств, значит, есть и какой-то контроллер прерываний. Надо пользоваться его возможностями.


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

Цитата(k155la3 @ May 30 2018, 16:16) *
Можно поискать планировщик/sheduler наподобие этого
и из него - переключатель контекста. Кода не так много.


Все здорово, но опять же под М серию...
Go to the top of the page
 
+Quote Post
mantech
сообщение May 30 2018, 15:24
Сообщение #13


Гуру
******

Группа: Участник
Сообщений: 2 067
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(mantech @ May 30 2018, 16:53) *
Все здорово, но опять же под М серию...


Вопрос закрыт, дело было в неправильном сохранении регистров, поправил заработало. Всем спасибо rolleyes.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2018 - 11:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01032 секунд с 7
ELECTRONIX ©2004-2016