Пятница, 29.11.2024
Мой сайт
Меню сайта
Статистика

Онлайн всего: 54
Гостей: 54
Пользователей: 0
Главная » 2019 » Январь » 10 » Библиотеки, классы, память
20:34
Библиотеки, классы, память

Библиотеки, классы, память

Немного поменяю порядок include, расставив их в последовательности подключенных устройств отсюда:
http://akostina76.ucoz.ru/blog/2019-01-09-5605

#include "clock.h" // Описание проекта Папка "\clock"
#include <DS1307RTC.h> // Часы RTC Объект "RTC.", "\DS1307RTC"
#include <Tone.h> // Пищалка "Buzzer." "\Tone"
// Для реле нету
#include <Adafruit_SSD1306.h> //Дисплей   "\Adafruit_SSD1306-master"
#include <Adafruit_GFX.h>  //Тоже дисплей  "\Adafruit-GFX-Library-master"
#include <PinChangeInt.h> // Подключ. прерываний от джойстика "PCintPort::", "\PinChangeInt"
#include <TroykaDHT11.h> // Датчик температуры и влажности "dht." "\TroykaDHT11-master"
#include <Wire.h>  // Hardware "\arduino-1.6.3\hardware\arduino\avr\libraries\Wire"
#include <EEPROM.h> // HD "EEPROM." "\arduino-1.6.3\hardware\arduino\avr\libraries\EEPROM"
#include <TimerOne.h> // Таймер "Timer1."  "\Time_1"
#include <Time.h>
Первое, что бросается в глаза то, что файл clock.h в кавычках, а остальное в “< >”. Похоже что это указание компилятору подключать не только этот «.h” файл но и CPP файл с текстом библиотеки из той же папки.
Слово «компилятор» написано не случайно. Компилятор преобразует текст программы например на Си в машинные коды. А машина эти коды уже выполняет.  Рост быстродействия привёл к тому что очень часто выполняется сам текст программы (так, например, работают script-ы HTML страниц). Для его интерпретации служит интерпретатор. Он читает строки и выполняет то, что в них написано.  Не думаю я, что в микроконтроллере находится интерпретатор текста. Во-первых, это изначально тяжелая и медленная вещь. Во-вторых, не понятно зачем так делать. Подозреваю, что в плату загружается уже откомпилированный машинный код.
А машинный код включает в себя код самой программы и прицепленные к нему коды библиотек (или других текстов). Чтобы было быстрее, раньше все тексты компилировались отдельно. При повторной компиляции перекомпилировались только те, исходные тексты которых менялись. Если какой-то текст не менялся можно было оставить его старый OBJ или LIB файл без изменения и прицепить его к готовому EXE (общей программе).
Я не вижу тут ни OBJ ни LIB с «огрызками» кодов, годных для того чтобы прицепить их к программе. Есть только исходные тексты, по которым эти файлы обычно делаются. Думаю это вызвано всё тем же увеличением быстродействия. Создать их теперь так быстро, что нет смысла их отдельно хранить.
У меня сейчас перепутаются понятия «библиотека» и «класс». Можно сказать, что «класс» это форма «библиотеки» при объектно-ориентированном программировании. Т.е по назначению это библиотека, т.е хранилище написанных для каких-то целей текстов. А по форме это класс, т.е все функции прицеплены к некому объекту. Чтобы запустить будильник надо написать Buzzer.Play().Buzzer это объект, а Play() – это прицепленная к нему функция.
На примере пищалки – будильника это проще всего и смотреть:

Тут начало функции Begin(), которая в тексте вызывается как Buzzer.Begin ():

Чтобы эту функцию можно было использовать надо подключить библиотеку Tone.h+Tone.cpp. В данном случае надо ещё выделить память под эту пищалку. Это делается с помощью объявления переменной Buzzer с типом Tone. Tone – имя класса. Так надо делать не всегда. Во второй строке функции setup() идёт обращение к функции attachInterrupt класса PCintPort описанной в PinChangeInt.h:
PCintPort::attachInterrupt(JOYSTICK_Z_PIN, &JOYSTICK_Z_PIN_ISR, FALLING);
В некоторых классах (объектах) надо хранить какую-то информацию. Например, если у меня объект – окно, то мне нужны экранные координаты его углов. Наиболее естественно хранить эту информацию прямо в объекте. Когда пользователь проводит мышью по экрану он меняет положение мыши с X1, Y1 в X2, Y2. И только эти координаты дают возможность посчитать, совпадало это перемещение с положением окна или нет. Координаты меняются если окно переносят или деформируют. Пока окно не закрыли вся эта информация хранится в нем. А чтобы её хранить надо создать объект «Окно» в памяти примерно также как создан объект для пищалки.
А если мне нужна математическая библиотека с синусами и косинусами, то мне не нужны такие внутренние переменные для хранения информации, я могу только подключить библиотеку и вызывать нужные функции, написав перед именем функции имя класса.
Создаются тут объекты для:
Дисплея:
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Тип объекта Adafruit_SSD1306. При инициализации задаются разъемы, к которым подключен дисплей:
Adafruit_SSD1306::Adafruit_SSD1306(int8_t SID, int8_t SCLK, int8_t DC, int8_t RST, int8_t CS) : Adafruit_GFX(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT) {
  cs = CS;
  rst = RST;
  dc = DC;
  sclk = SCLK;
  sid = SID;
  hwSPI = false;
}
cs, rst и т.д это как раз внутренние переменные объекта, к которым он дальше везде (внутри) обращается при работе с информацией. Потому их не надо больше указывать при каждом выводе информации на экран (они один раз переданы и там внутри записаны).
Термометр:
DHT11 dht(TEMP_SEN_PIN);
Ранее описанная пищалка:
Tone Buzzer;
Не требуют создания объектов:
1] RTC.( DS1307RTC.h)
2] EEPROM.( EEPROM.h)
3] PCintPort (PinChangeInt.h)
4] Timer1 (TimerOne.h)
Два последних очень интересны тем, что это драйвера не для подключенных устройств а для самого контроллера. Их нет в стандартном наборе для Arduino Mini. И, насколько поняла, Arduino Mini может поддерживать прерывания только на паре портов. Похоже что возможность повесть прерывание на любой порт также как и в возможность повесить его на таймер есть только у контроллера Iskra.

 



 

 

 

Просмотров: 147 | Добавил: akostina76 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Форма входа
Поиск
Календарь
«  Январь 2019  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Copyright MyCorp © 2024
    Бесплатный конструктор сайтов - uCoz