RTOS от easyelectronics.ru. Пара вопросов

XanderEVG
Offline
Зарегистрирован: 06.10.2017

Здравствуйте. Недавно начал программировать ардуино, решил сделать менеджер задач и таймерную службу скомуниздив код с 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(библиотека)

если не интересно смотреть код, можно ткнуть носом, куда копать что бы понять почему ардуина уходит в ребут

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

XanderEVG пишет:

если не интересно смотреть код, можно ткнуть носом, куда копать что бы понять почему ардуина уходит в ребут

Спонтанная перезагрузка может иметь одну из двух причин (или обе сразу):

- аппаратная, обычно связана с неподходящим источником питания,

- программная, чаще всего связана с проблемами с памятью: либо адресация за пределы массива, либо "наползание" стека на кучу.

Более конкретно, основываясь на тексте сообщения, сказать нельзя.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Я делаю RTOS с помощью возможностей компилятора и millis(). 

Logik
Offline
Зарегистрирован: 05.08.2014

XanderEVG пишет:

Недавно начал программировать ардуино, решил сделать менеджер задач и таймерную службу..

можно сказать это мой первый проект за исключением blinka.

Чтото мелковато. Начните с ИИ. А то вторым в жизни проектом ОС писат - банальщина. У таких обычно следующий проект - язык программирования для написания ОС этой самой. А четвертого проекта уже не будет, времени не хватит, семя, дети и т.д. ну и предыдущие по той же причине останутся немножко не работающие.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

XanderEVG пишет:

если не интересно смотреть код, можно ткнуть носом, куда копать что бы понять почему ардуина уходит в ребут

http://playground.arduino.cc/Code/AvailableMemory

XanderEVG
Offline
Зарегистрирован: 06.10.2017

Ну ос это сильно сказано. На самом деле это диспечер задач и таймерная служба.
Диспечер задач это массив указателей на функции-задачи + служебная функция которая добавляет задачу в очередь и функция которая проходит по массиву и выполняет задачи. Очень удобно.
Таймерная служба добавляет задачи в очередь только не сразу а через х миллисекунд.

Первый раз на ардуино не значит что в мк не смыслю. Ранее занимался аврками, писал на ассемблере. Там я тоже делал диспечер.

Есть советы по первому вопросу(инлайновые функции)

XanderEVG
Offline
Зарегистрирован: 06.10.2017

Аппаратная - точно нет. Ардуина подключена к усб, ничего более не подключено. На том же кабели и той же ардуине другие скетчи не глючат.

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

XanderEVG , диспечер не нужен. У вас же нет много ОЗУ что бы городить еще виртальное ОЗУ, которое вы можете заливать программы с флешки. Вот тоже самое но без диспечера. http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov

У вас банально идет утечка памяти. Но где и как , ну влом ковыряться в пачке файлов.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

я для себя запилил это

https://github.com/DetSimen/Arduino-

и это 

https://github.com/DetSimen/Arduino-MessageList

ни разу не подвело.

XanderEVG
Offline
Зарегистрирован: 06.10.2017

У меня нет виртуального озу. Задачи это тупо функции, диспетчер это массив указателей на эти функции. Памяти занимает 300 байт рам и 1500 флеша вместе с двумя задачами( 1 - вкл светодиод, 2- выкл)
В итоге сделал все не на классах, все вроде работает без сбоев

XanderEVG
Offline
Зарегистрирован: 06.10.2017

Спасибо, попробую скопипастить и подогнать под себя

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Обрашайся.  Только завтра. Сегодня настало время синячить. 

и это. код для 168, 328.  Если надо для Atmega8 - пришлю по запросу, там код несколько друговатый.