где хранятся функции ядра ардуино Serial.XXX?

serjo150rus

✩✩✩✩✩✩✩
13 Янв 2020
3
0
Добрый вечер. Пытаюсь перенести функции ардуино в Atmel Studio для простоты использования библиотек.
Простые функции типа digitalRead , pinMode, использование ардуиновского названия портов(13 вывод это PORTB bit 5) и тд. я уже могу применять хотя и без них всё работает. А вот то что может облегчит вывод информации одолеть не могу,
кто знает как работает Serial.любая функция() и где её найти?
 

serjo150rus

✩✩✩✩✩✩✩
13 Янв 2020
3
0
Плагин есть. Но я и без плагина всё реализую, только это долго и мутарно. А хочется ещё сильнее упростить или урезать, чтобы не править каждую библиотеку в ручную .
Например 13 пин ардуино это - PORTB бит 5.
И для того что бы его зажечь достаточно написать
DDRB = 0b00100000 (упрощённая запись pinMode)
зажечь PORTB |=(1<<5); и погасить PORTB &=~(1<<5);

А теперь тоже самое digitalWrite(13, bool){

uint8_t timer = digitalPinToTimer(pin); //функция проверяет есть ли на ПИНе возможность ШИМа
uint8_t bit = digitalPinToBitMask(pin); //функция по адресу 13 из массива достаёт число 5 после чего возводит 2 в степень 5 и получает //Битовую маску 0b00100000 или число 32 в десятичной системе.
uint8_t port = digitalPinToPort(pin); // функция по адресу 13 из массива портов узнаёт какому порту принадлежит пин 13 (PORTB)
volatile uint8_t *out; // создаём указатель

if (port == NOT_A_PIN) return; // если такого ПОРТа нет в списке ( например пин PORTX) то функция ничего не делает

// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer); // если у пина нет ШИМа то функция шим не подключается

out = portOutputRegister(port); // присваиваем полученный ранее адрес PORTB (0x0025) нашему указателю

uint8_t oldSREG = SREG;
cli();

if (val == LOW) {
*out &= ~bit; // если LOW то в БИТ адреса записываем 0 (0b00000000 лог И 0b00100000 = 0b00000000)
} else {
*out |= bit; // если HIGH то в БИТ адреса записываем 1 (0b00000000 лог ИЛИ 0b00100000 = 0b00100000)
}

SREG = oldSREG;

}

И вся эта запись на 2 листа в 3 разных библиотеках ядра, была нужна лишь для того чтобы узнать адрес порта и записать в него бит.
 
Последнее редактирование:

Эдуард Анисимов

★★★★★✩✩
23 Сен 2019
1,154
365
54
Марий-Эл
Добрый вечер. Пытаюсь перенести функции ардуино в Atmel Studio для простоты использования библиотек.
Простые функции типа digitalRead , pinMode, использование ардуиновского названия портов(13 вывод это PORTB bit 5) и тд. я уже могу применять хотя и без них всё работает. А вот то что может облегчит вывод информации одолеть не могу,
кто знает как работает Serial.любая функция() и где её найти?
Serial.Любая функция() тоже как DigitalWrite() раскидана по куче разных файлов. Если использовать print() или println(), это одна группа файлов. Если использовать функции приёма/передачи, это другая группа файлов. Я ищу по *.h файлам, которые подключены к arduino.h

В качестве файлового процессора я использую Total Commander. Замечательная вещь. У него есть встроенная команда расширенного поиска. Там задаёшь поиск файла в котором, допустим, может содержаться функция print(), а потом включаешь собственный интеллект (не искуственный :) ) и анализируешь найденные файлы.

Выглядит он так:
1.png
Переходишь в каталог где находится ядро ардуины, нажимаешь Alt+F7, выводится окно поиска

2.png
Указываешь что ищешь все файлы с расширением *.h, в них текст print, указываешь, что ищешь в двух кодировках используемых в windows. Давишь кнопку начала поиска.
3.png

Получаешь список файлов в которых встречается эта функция и среди них файл с её прототипом. Остаётся установить на эту строку курсор и посмотреть содержимое. А дальше начинаешь повторять эту процедуру для всех функций, которые она за собой подтягивает.

Простите, что так длинно, зато развёрнуто. Я таким образом нахожу всё, что мне нужно довольно быстро.
 

Вложения

  • 439.7 KB Просмотры: 0
  • 736.9 KB Просмотры: 0
  • 126 KB Просмотры: 0

serjo150rus

✩✩✩✩✩✩✩
13 Янв 2020
3
0
Спасибо за хороший ответ. В Atmel Studio есть решение удобнее.
Выбираем функцию, на неё правой кнопкой мыши, выбираем пункт "Goto Implementation", открывается новая вкладка с содержимым функции.
1579250445576.png

1579250511791.png
С функцией Serial я разобрался всё работает, просто по запаре написал с маленькой буквы

1579250839565.png
1579250889758.png
 

Вложения

Эдуард Анисимов

★★★★★✩✩
23 Сен 2019
1,154
365
54
Марий-Эл
Спасибо за хороший ответ. В Atmel Studio есть решение удобнее.
Эта функция есть во всех нормальных IDE. Но ArduinoIDE не может считаться полноценной системой.
Я для ардуин предпочитаю Visual Studio с PlatformIO.

Судя по последней картинке Вы используете систему моделирования. Будьте с ней осторожны. Она некорректно работает.
Простой пример. Если используете среду разработки, которая за Вас всё делает, т.е. инициализацию периферии и генератора, то всё будет ОК. Если сами пишете всё с нуля и забудете проинициализировать, допустим АЦП, то этот эмулятор покажет, что всё в порядке и схема работает. В железе же прошивка не заработает никак.
 
Последнее редактирование: