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

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

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

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

Вызов функции подменой стека не делается. Вызов функции подразумевает возврат. Там вероятно у Вас идёт переключение задач пользовательского уровня по запросу из ISR.
Вероятно там уже есть какая-то ОС. Может быть самописная.
Harvester
Цитата(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-прерыванию.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.