Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.09.2012, 23:30   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,348
Вес репутации: 9547
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Многозадачность в Arduino

Распакуйте библиотеку leOS и скопируйте ее в папку libraries
Краткое описание библиотеки:

Что бы добавить задачу, нужно вызвать метод:
myOS.addTask (yourFunction, interval);
Минимальный интервал вызова задачи 1мс

Чтобы приостановить задачу, просто вызовите следующий метод:
myOS.pauseTask (yourFunction);

Вы можете перезапустить задачу:
myOS.restartTask (yourFunction);

Чтобы удалить задачу, вызовите следующий метод:
myOS.removeTask (yourFunction);

Чтобы изменить интервал времени выполняемой задачи, просто вызовите modifyTask метод с новым временным интервалом:
myOS.modifyTask(yourFunction, newInterval);

Интересной особенностью является возможность запуска одноразовой задачи, которая будет выполнена только один раз:
myOS.addTask(yourFunction, interval, ONETIME);

Пример кода многозадачности в котором четыре светодиода мигают с разной частотой.
PHP код:
#include "leOS.h" 
leOS myOS;  //создать экземпляр класса

#define LED0 11 //светодиоды
#define LED1 12
#define LED2 13
#define LED3 14

byte led0Status 0;
byte led1Status 0;
byte led2Status 0;
byte led3Status 0;

void setup()
{
    
myOS.begin();         //инициализация
    
pinMode(LED0OUTPUT);
    
pinMode(LED1OUTPUT);
    
pinMode(LED2OUTPUT);
    
pinMode(LED3OUTPUT);
    
    
myOS.addTask(flashLed1250);//добавить задачу с интервалом выполнения через 250мс
    
myOS.addTask(flashLed2500);//добавить задачу с интервалом выполнения через 500мс 
    
myOS.addTask(flashLed3750);//добавить задачу с интервалом выполнения через 750мс
}

void loop() 
{
    
digitalWrite(LED0led0Status);
    
led0Status = ~led0Status;    
    
delay(1000);
}

void flashLed1() 
{
    
led1Status=~led1Status;
    
digitalWrite(LED1led1Status);
}

void flashLed2() 
{
    
led2Status=~led2Status;
    
digitalWrite(LED2led2Status);
}

void flashLed3() 
{
    
led3Status=~led3Status;
    
digitalWrite(LED3led3Status);

P.S.
Появилась вторая версия LeOS
Скачать
Вложения
Тип файла: rar leOS.rar (6.7 Кб, 1985 просмотров)
Тип файла: zip leOS2_2.3.1.zip (1.91 Мб, 589 просмотров)
Admin вне форума   Ответить с цитированием
Старый 21.05.2013, 12:40   #2
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 442
Вес репутации: 791
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Возник вот такой вопрос, если во время выполнения периодической задачи вызвать её одноразовое исполнение - периодическая задача остановится? Вот как на примере
PHP код:
#include <leOS.h>         
leOS myOS;                     

void setup() 
{
  
Serial.begin(9600);
  
myOS.begin();     
  
myOS.addTask(current_meter3);
}


void current_meter()  
  
Serial.println("Arduino");
}; 


void loop() 
{
  
myOS.addTask(current_meter100ONETIME);

Или может кто знает еще каким образом можно использовать подпрограммы в Arduino? т.е. задача такая - есть некая подпрограмма, например передачи данных, и её нужно вызывать из разных мест в программе.
Bulatovor вне форума   Ответить с цитированием
Старый 21.05.2013, 13:36   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,348
Вес репутации: 9547
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Вызывать можно из любого места кода вот так:
current_meter();

Пример
PHP код:
void setup() 
{
  
Serial.begin(9600);
}


void current_meter() 

  
Serial.println("Arduino");



void loop() 
{
  
current_meter();

Admin вне форума   Ответить с цитированием
Старый 23.05.2013, 10:50   #4
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 442
Вес репутации: 791
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию

Продолжаю терзать подпрограммы
PHP код:
void networksend()

  
network.update();
  
Serial.print("Attempt to send - "); 
  
Serial.print(KSend++); 
payload_t payload = { Tip1,ID1,Data1,Time1 };
RF24NetworkHeader header(other_node);
bool ok network.write(header,&payload,sizeof(payload));
if (
ok)
{
Serial.println("-OK");
KSend=0;myOS.addTask(networksend,20000);
}
else 
{
Serial.println("-Error"); 
if(
CSend>=KSend){myOS.addTask(networksend,1000);}
else{
myOS.addTask(networksend,20000);KSend=0;Serial.println("NO SEND");}
};
}; 
Проблема в том, что изменяя в подпрограмме периодичность задачи -все виснет в смысле данные в порт не приходят, даже один - первый раз, если все остается так же, но убрать изменение интервала выполнения задачи -все работает. Т.е. получается в самой задаче нельзя её изменять?
Bulatovor вне форума   Ответить с цитированием
Старый 12.08.2013, 12:51   #5
olmi
Junior Member
 
Регистрация: 01.04.2013
Сообщений: 7
Вес репутации: 0
olmi is an unknown quantity at this point
По умолчанию Переменные

А скажите пожалуйста переменные одного задания доступны в другом?
olmi вне форума   Ответить с цитированием
Старый 12.08.2013, 15:27   #6
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,348
Вес репутации: 9547
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Если они объявлены глобально, то конечно же доступны
Admin вне форума   Ответить с цитированием
Старый 30.08.2013, 13:24   #7
olmi
Junior Member
 
Регистрация: 01.04.2013
Сообщений: 7
Вес репутации: 0
olmi is an unknown quantity at this point
По умолчанию Не получается запустить многозадачность все голову сломал.

В сериал соединении ничего не пишет.
Если в основной цикл данный код вставляешь все работает.
А через многозадачность нет ((( Экран сериал соединения пустой.

Код:
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include "DS1307.h"
#include <EEPROM.h>
#include <leOS.h> 
leOS myOS;
DS1307 clock;

#define ONE_WIRE_BUS 10
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup()
{
Serial.begin(9600);
myOS.begin();
myOS.addTask(dallas, 5000);
sensors.begin(); 
clock.begin();
}


void loop()
{
delay (100);
}

void dallas()   {

sensors.requestTemperatures();
int T1 = sensors.getTempCByIndex(0);
int T2 = sensors.getTempCByIndex(1);
int T3 = sensors.getTempCByIndex(2);

clock.getTime();
Serial.print(clock.dayOfMonth, DEC);
Serial.print(".");
Serial.print(clock.month, DEC);
Serial.print(".");
Serial.print(clock.year+2000, DEC);
Serial.print(";");
Serial.print(clock.hour, DEC);
Serial.print(":");
Serial.print(clock.minute, DEC);
Serial.print(":");
Serial.print(clock.second, DEC);
Serial.print(";");
Serial.print("T1=");
Serial.print(T1);
Serial.print(";");
Serial.print("T2=");
Serial.print(T2);
Serial.print(";");
Serial.print("T3=");
Serial.print(T3);
Serial.println(";");
}
Подскажите что я не правильно делаю
olmi вне форума   Ответить с цитированием
Старый 31.03.2014, 09:35   #8
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 442
Вес репутации: 791
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию Re: Многозадачность в Arduino

Появился второй вариант библиотеки http://www.leonardomiliani.com/2012/...duino/?lang=en. Основное отличие - теперь библиотека не использует Timer 2 и имеет меньше проблем совместимости. Теперь используется сторожевоц таймер и добавлена функция по перезагрузке микроконтороллера
Bulatovor вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:24. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика