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

 
 
> Как реализовать отдельно ядро и пользовательское ПО?
Harvester
сообщение Mar 30 2016, 15:47
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Добрый день.
Имеется проект (LPC1820), в котором код разбит на две части: ядро и пользовательская программа. Эти части о существовании друг-друга "не знают",
компилируются и загружаются в флеш-память независимо друг от друга.
С железом МК работает исключительно ядро, а пользовательская программа общается с ядром через вызовы SVI.
С внешним миром устройство общается по USB:
1. MSC-класс работает с NAND напрямую из прерываний USB
2. Custom-класс передает данные между ПК и устройством. Для этого обработчик прерывания вызывает подпрограмму из пользовательского кода
(она расположена по фиксированному адресу). Все это реализуется через подмену стекового фрейма при выходе из прерывания.

Мне нужно исправить один баг в ядре - MSC не работает с транзакциями 512 байт. Возникли сомнения, что смогу вставить в этот винегрет "проверенный" USB-стек, поэтому вопрос: можно ли реализовать подобную функциональность более человечески (на более-менее распространенной оси или еще как-нибудь)?

Спасибо


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Огурцов
сообщение Mar 30 2016, 17:27
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 3 928
Регистрация: 28-03-07
Из: РФ
Пользователь №: 26 588



поставить второй камень
Go to the top of the page
 
+Quote Post
Harvester
сообщение Mar 30 2016, 18:08
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(Огурцов @ Mar 30 2016, 20:27) *
поставить второй камень

1-е условие (обязательное): железо не меняется
2-е условие (желательное): минимальная доработка пользовательского приложения
laughing.gif


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 31 2016, 06:39
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Harvester @ Mar 30 2016, 21:47) *
2. Custom-класс передает данные между ПК и устройством. Для этого обработчик прерывания вызывает подпрограмму из пользовательского кода
(она расположена по фиксированному адресу). Все это реализуется через подмену стекового фрейма при выходе из прерывания.

Вызов функции подменой стека не делается. Вызов функции подразумевает возврат. Там вероятно у Вас идёт переключение задач пользовательского уровня по запросу из ISR.
Вероятно там уже есть какая-то ОС. Может быть самописная.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Mar 31 2016, 09:25
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(jcxz @ Mar 31 2016, 09:39) *
Вызов функции подменой стека не делается. Вызов функции подразумевает возврат. Там вероятно у Вас идёт переключение задач пользовательского уровня по запросу из ISR.
Вероятно там уже есть какая-то ОС. Может быть самописная.

Отчасти Вы правы. То что там происходит, действительно можно назвать переключением задач. Я просто не хотел подробно расписывать.
В общем, есть две "задачи" - ядро и пользовательская. Ядро запускается, настраивает железо и передает управление в main() пользовательской. Там выполняются определенные действия (инициализация/настройка), затем через SVI выполняется подключение к USB (обработчики SVI находятся в коде ядра). После этого пользовательский main() зацикливается по while(1) и все замирает в ожидании прерывания от USB.
В случае прерывания bulk in/out MSC-класса происходит общение с NAND (все это делается прямо в обработчике).
В случае прерывания bulk in/out Custom-класса происходит уже описанное переключение стека и возврат из прерывания происходит в обработчик ядра, который крутится в бесконечном цикле. Он проверяет флаги (которые ставятся в обработчике прерывания USB), если хоть один установлен - ставит соответствующий флаг в пространстве пользовательского кода и вызывает оттуда функцию-обработчик. Тот просматривает все флаги и выполняет соответствующие действия. Затем управление возвращается в обработчик ядра.
То есть "переключение" осуществляется только один раз - по первому USB-прерыванию.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:51
Рейтинг@Mail.ru


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