Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » MasterElectric » Простенький диспетчер задач [обсуждение]


Простенький диспетчер задач [обсуждение]

Сообщений 1 страница 11 из 11

1

Все мои проекты заканчивались тем что я офигевал от необходимости работать по нескольким логическим направлениям, напрашиваеться многозадачность. FreeRTOS по статьям и примерам что видел оказался очень жирным и темный для меня, небыло понимания как там все работает, очень много дефайнов конфигурации, и очень уж сложно мне показалось в нем создавать задачи, темный лес... Подумал и решил сделать свой простенький диспетчер задач. Начал читать документацию на ядро (русскоязычную книгу)  , по сути я даже в теории не знаю принципов построения операционных систем, но мне ведь мешало нормально писать программы только одно возможность сделать ее многозадачной.

Пока я думаю мне хватит такого набора:
- мне нужна возможность переходить от одной логической цепочки, к другой (от задачи к задаче);
- научить задачу ставить на паузу с пробуждением по таймеру (грубо наверное выйдет с точностью);
- научить задачу ставить на паузу с пробуждением по появлению флага;
- простенькая система приоритетов (о них я тоже ничего не знаю, но что-то уже придумал на бумаге);

Проблему которую я себе плохо представляю это синхронизация задач между собой. Но т.к. задача это как подпрограмма, которая выполняеться и не знает ничего о других подпрограммах, и она выполняет строго свои задачи в приложении. Буду использовать просто переменные только для чтения или только для записи, т.е. это я возложу не на диспетчер, а на свои плечи в зависимости от ситуации.

От чего я отказался в реализации так это от возможности удалять задачи и дефрагментировать стек. Слишком много проблем будет возникать, да и это не ПК все-таки, а микроконтроллер.

Что-то я уже немного писал осенью в том году, потом забросил как всегда. Теперь переношу весь код на stm32h573. (учитывая цену на них и на F7, то F7 постигнет участь F2 vs F4).

Еще теперь я хочу выделить под диспетчер отдельно секцию во флеш памяти и ОЗУ и там же будет свой бутлоадер, т.е. научить его еще и обновлять прошивку по какому-либо интерфейсу.

Сейчас я изменил скрипт линкера добавил секции под ОЗУ и флеш для диспетчера (наверное криво, но что-то работает, интуитивно делал), изменил стартап и добавил вторую таблицу прерываний и инициализации т.е. я имитирую работу так чобы в одном проекте были две независимые по коду программы в своих секциях (для отладки). Дальше будет 4 задачи и каждая будет дергать своей ногой для начала. И буду переключаться. Анализатором посмотрю что будет.

На H7 уже настроил систему тактирования пришлось долго читать доки, наворотили они конечно. Теперь работает на 400МГц. Потребление не мерял это на самый конец т.к. по схеме неудобно.

  Да все пока будет без FPU, т.к. переношу с m3.

2

MasterElectric написал(а):

Пока я думаю мне хватит такого набора:
- мне нужна возможность переходить от одной логической цепочки, к другой (от задачи к задаче);
- научить задачу ставить на паузу с пробуждением по таймеру (грубо наверное выйдет с точностью);
- научить задачу ставить на паузу с пробуждением по появлению флага;
- простенькая система приоритетов (о них я тоже ничего не знаю, но что-то уже придумал на бумаге);


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

Отредактировано CERGEI (2018-06-03 05:40:06)

3

Продолжаю работу. Задачи переключаються по прерываниию SysTick. Первый канал это собственно само прерывание SysTick, 4 последние - это 4 задачи с ногодрыгом.
http://s9.uploads.ru/t/oPRlQ.jpg

4

Задачи переключаються по кругу время работы каждой задачи по 100мкс. Приоритет построен так что если приоритет высокий, то задача просто занимает заложенное в настройках нужное количество квантов времени по 100мкс. Если же приоритет низкий можно определить количество пропусков циклов переключения.
http://s5.uploads.ru/t/cjkHG.jpg

5

Теперь первая задача подав 25 импульсов отдает остаток своего времени следующей задаче:
http://sg.uploads.ru/t/Hx4FI.jpg

6

Тестирование нароботок продолжаеться. Теперь таймер TIM6 прерывает выполнение пользовательской программы.
http://sh.uploads.ru/t/zlSw6.jpg

7

Сделал ожидание события, немного помучался.
Тут я при вхождении в прерывание (TIM6) в 10 раз, в самом прерывании создаю задачу №2. Сама задача №2 выполнив свои действия командует диспетчеру ожидать событие (глобальная переменная) и задает маску флага (пока доступно только одно действие на пробуждение - поднятие хотя бы 1 флага). В прерывании TIM6, этот флаг поднимаеться и мы выводим задачу №2 из ожидания события. И так по кругу.
http://s8.uploads.ru/t/6CXoy.jpg

8

Появилось несколько проблем. 1. Не инициализируються нулями неинициализированные переменные, где-то нахомутал. 2. После отладки программа работает нормально, но вот повторная попытка отладить в след.сеансе вызывает крах отладчика, а вот чистый проект загружает нормально и после него нормально уже загружает мой. Даже пока работаю от HSI. хз что это такое.

9

Еще сделаю спячку по таймеру и мне пока хватит. Потом чищу от мусора, оптимизирую и буду пробовать применить в бою. Буду писать библиотеку под SPI под свой диспетчер сразу выжав что можно из него т.е. это будет SPI + DMA работающей в своей отдельной задаче.

пока непонятно как запускать систему, то ли систему тактирования отнести к диспетчеру, то ли фиг знает что делать. Потому как диспетчер ничего не должен знать про нашу прогу, но должен знать о системе тактирования чтобы нормально инициализировать классы. План был такой - main сделать проходной функцией там мы инициализируем что надо, создаем первые задачи и уходим. После стартует диспетчер и пользовательская программа теперь работает в потоке без прав (mpu  еще позже доюавлю) ну она и так не будет иметь всех прав. Получаеться что в main мы не можем работать с глобальными классами, т.к. они еще не созданы.

10

Сделал еще спячку по таймеру. Таймер брал не DWT, взял программный по тику SysTick, все-равно точность относительная, т.к. проверки делаються в порядке переключения задач. Задача №3 пинает сама себя раз в 5 мс (не реализована только защита от переполнения пока еще):
http://s9.uploads.ru/t/pt16i.jpg

Все эти условия конечно отбирают такты, но в принципе пока что пойдет и так.

11

В планах еще режим Idle, я полностью буду убирать задачу из списка в другой, для более быстрого перебора, но это только планы т.к. главное реализована параллельная работа задач. И FPU MPU тоже на потом, хочу уже потестить.


Вы здесь » Микроконтроллеры » MasterElectric » Простенький диспетчер задач [обсуждение]