RTOS от easyelectronics.ru. Пара вопросов
- Войдите на сайт для отправки комментариев
Здравствуйте. Недавно начал программировать ардуино, решил сделать менеджер задач и таймерную службу скомуниздив код с http://easyelectronics.ru/avr-uchebnyj-kurs-arxitektura-programm-chast-2.html
можно сказать это мой первый проект за исключением blinka.
Перенес, вынес все в отдельные файлы c и h.
Вопрос 1:
в .c файле определены inline функции. подключаю хедер библиотеки - не работает. подключаю кроме хедера .c файл - работает. Так и должно быть?
Вопрос 2:
Меняю .c на .cpp, убираю inline. подключаю только хедеры. Работает. ставлю обратно inline - не работает.
Вопрос 3, самый главный:
Изначально пытался сделать библиотеку на классах. сделал. мигание светодиодом работает. как только добавляю что то сложнее мигания - ардуина перезагружается. где я накосячил?
Прикладываю три проекта:
https://drive.google.com/drive/folders/0B6jBSxLGUFSmYkVZcG95b3JRSkk?usp=sharing
1) рабочий (с inline) - rtos_inline
2) рабочий (без inline, .cpp) - rtos_no_inline
3) нерабочий с библиотекой на классах и саму библиотеку. библиотеку положить в \Arduino\libraries - rtos_lib_class(проект) и RTOS(библиотека)
если не интересно смотреть код, можно ткнуть носом, куда копать что бы понять почему ардуина уходит в ребут
если не интересно смотреть код, можно ткнуть носом, куда копать что бы понять почему ардуина уходит в ребут
Спонтанная перезагрузка может иметь одну из двух причин (или обе сразу):
- аппаратная, обычно связана с неподходящим источником питания,
- программная, чаще всего связана с проблемами с памятью: либо адресация за пределы массива, либо "наползание" стека на кучу.
Более конкретно, основываясь на тексте сообщения, сказать нельзя.
Я делаю RTOS с помощью возможностей компилятора и millis().
Недавно начал программировать ардуино, решил сделать менеджер задач и таймерную службу..
можно сказать это мой первый проект за исключением blinka.
Чтото мелковато. Начните с ИИ. А то вторым в жизни проектом ОС писат - банальщина. У таких обычно следующий проект - язык программирования для написания ОС этой самой. А четвертого проекта уже не будет, времени не хватит, семя, дети и т.д. ну и предыдущие по той же причине останутся немножко не работающие.
если не интересно смотреть код, можно ткнуть носом, куда копать что бы понять почему ардуина уходит в ребут
http://playground.arduino.cc/Code/AvailableMemory
Ну ос это сильно сказано. На самом деле это диспечер задач и таймерная служба.
Диспечер задач это массив указателей на функции-задачи + служебная функция которая добавляет задачу в очередь и функция которая проходит по массиву и выполняет задачи. Очень удобно.
Таймерная служба добавляет задачи в очередь только не сразу а через х миллисекунд.
Первый раз на ардуино не значит что в мк не смыслю. Ранее занимался аврками, писал на ассемблере. Там я тоже делал диспечер.
Есть советы по первому вопросу(инлайновые функции)
Аппаратная - точно нет. Ардуина подключена к усб, ничего более не подключено. На том же кабели и той же ардуине другие скетчи не глючат.
Проблема программная, но не выход за пределы массива. По сути создается класс, вызывается 2 его функции. Они даже работают. Но через 2 минуты ребут. Где то срыв стека, как найти без понятия
XanderEVG , диспечер не нужен. У вас же нет много ОЗУ что бы городить еще виртальное ОЗУ, которое вы можете заливать программы с флешки. Вот тоже самое но без диспечера. http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
У вас банально идет утечка памяти. Но где и как , ну влом ковыряться в пачке файлов.
я для себя запилил это
https://github.com/DetSimen/Arduino-
и это
https://github.com/DetSimen/Arduino-MessageList
ни разу не подвело.
У меня нет виртуального озу. Задачи это тупо функции, диспетчер это массив указателей на эти функции. Памяти занимает 300 байт рам и 1500 флеша вместе с двумя задачами( 1 - вкл светодиод, 2- выкл)
В итоге сделал все не на классах, все вроде работает без сбоев
Спасибо, попробую скопипастить и подогнать под себя
Обрашайся. Только завтра. Сегодня настало время синячить.
и это. код для 168, 328. Если надо для Atmega8 - пришлю по запросу, там код несколько друговатый.