Пока особо в направлении работ по JTAG на базе платки FTDI не стал зпробираться.
Собственно самих микросхем не так уж и много, отладка «по старинке2 вполне устраивает… Да и саму платку с FTDI весьма жалко… Отложено на стадии превращения платки в «DIP модуль» - попозже может еще чего надумается.
КАПЛЯ ДЕГТЮ на "розовы мечты с колубой каёмочкой".
В то же время перечитал подборку-книжу от DiHalta…
Особо часть из второй версии относительно работы с памятью программ.
Пресловутое PROGMEM.
Этот раздел работ с МК под СИ (как и указатели) весьма «смутно-узкое» место относительно имеющихся наработок под ассемблером.
Ежли с указателями еще так-сяк разобраться можно, то работа с массивами в ПЗУ для АВРок в СИ и в ассемблере явно не равноценны.
Да еще и относительно ардуины правописание совсем… МНДЯАА…
Хош аки говорят – «тот же GCC»…
Собственно базовое отличие от того, что у DiHalta заключается в обязательном префиксе CONST в начале строки описания массива.
Как указано в адуриньей референсе по PROGMEM допустимо объявление:
«…
const dataType variableName[] PROGMEM = {}; // use this form
const PROGMEM dataType variableName[] = {}; // or this form
const dataType PROGMEM variableName[] = {}; // not this one
…»
без указания «const» компилятор пошлет нас подальше. Отсюда и «мелкие нюансы», позднее выползающие в объявлениях/описании функций обработки тех массивов ПЗУ – обязательное указание типа указателя на массив как, к примеру, const byte *ptr …
При том, что и вариант byte *ptr также проходит и компилируется – но с парой – тройкой матюков/вармингов на возможное некорректное преобразование типов.
По крайней мере в моем примере (
) с массивом знакогенератора (не символьной строкой!)
при подобном удалении const из описания указателя на массив компилятор выдает:
Спойлер
«…
Код: Выделить всё
C:\Documents and Settings\User\Рабочий стол\pgst1\pgst1.ino: In function 'void loop()':
C:\Documents and Settings\User\Рабочий стол\pgst1\pgst1.ino:49:32: warning: invalid conversion from 'const byte* {aka const unsigned char*}' to 'byte* {aka unsigned char*}' [-fpermissive]
C:\Documents and Settings\User\Рабочий стол\pgst1\pgst1.ino:172:6: note: initializing argument 2 of 'void znak_seg(byte*, byte*)'
Скетч использует 3176 байт (10%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 214 байт (10%) динамической памяти, оставляя 1834 байт для локальных переменных. Максимум: 2048 байт.
…»
…
Дополнительно та особенность, что указана у DiHalta –
Объявление и инициализация массивов в ПЗУ допускается только перед функциями MAIN – в случае с адуриньей это перед тандемом
Спойлер
«…
Код: Выделить всё
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
…»
Кстати… те массивы и компилируются в область между таблицей векторов прерываний и основной программой
(см. пример в архиве ).
В то же время (по крайней мере в ардуинке), непосредственная вставка в теле программы допустима лишь для строк типа char.
У ардуино это вариант F (вместо применяемого в GCC PSTR)
«…
Serial.print(F("Write something on the Serial Monitor that is stored in FLASH"));
…»
Однако такой вариант для массива данных (тот же инлайн знакогенератор к примеру) не подходит…
Посему явно преимущество за ассемблером «в чистом виде» - там можно массивы данных в ПЗУ размещать в любом месте программы и с любой интерпретацией их (массивов данных) содержимого.
И «на закусь» для размышления любителям «нестандартных адурин».
Помимо стандартного «джентльменского набора», поставляемого в комплекте ардуино IDE существует и множество любительских «и не очень» дополнительных вариантов «инструмент – плата».
ВОТ…
У меня установдены и от DIY (похоже сейчас можно не найти)
(
https://raw.githubusercontent.com/sleem ... index.json
https://raw.githubusercontent.com/sleem ... index.json
)
И от иных разработчиков…
Воть и решил свой тест-проектик простейшей считалки секунд
http://img.radiokot.ru/files/20529/1txrpavvnn.jpg
на них «прогнать» …
Ведь заявлены - то ОДИНАКОВЫЕ базовые платформы.
Воть чего из того теста получилось:
Спойлер
«…
Код: Выделить всё
плата arduino nano
atmega 238p(old bootloader)
Скетч использует 3176 байт (10%) памяти устройства. Всего доступно 30720 байт.
Глобальные переменные используют 214 байт (10%) динамической памяти,
оставляя 1834 байт для локальных переменных.
Максимум: 2048 байт.
…………………………..
Код: Выделить всё
DIY
плата atmega328/P/PB
processor version atmega238P
16MHz cristal
use bootloader
.....
LTO enabled
level 2,7v
остальное "по умолчанию"
Изменены опции сборки, пересобираем все
Скетч использует 3176 байт (9%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 214 байт динамической памяти.
…»
продолжаем тесты
Спойлер
«…
Код: Выделить всё
MinyCore (от https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json )
MinyCore
atmega238
16MHz external
2,7v
LTO enabled
variant 238p/pa
bootloader "да"
получаю...
Код: Выделить всё
Arduino: 1.8.8 (Windows XP), Плата:"ATmega328, Yes, 328P / 328PA, 2.7v, Enabled, 16 MHz external"
Изменены опции сборки, пересобираем все
C:\Documents and Settings\User\Local Settings\Application Data\Arduino15
\packages\arduino\tools\avr-gcc\4.8.1-arduino5/bin/avr-gcc-ar: Cannot find plugin 'liblto_plugin-0.dll'
exit status 1
Ошибка компиляции для платы ATmega328.
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
…»
ладно... ставлю
Спойлер
«…
Код: Выделить всё
MinyCore
atmega238
16MHz external
2,7v
LTO disabled(default)
variant 238p/pa
bootloader "да"
и получаю "типовой матюк"
Код: Выделить всё
Arduino: 1.8.8 (Windows XP), Плата:"ATmega328, Yes, 328P / 328PA, 2.7v, Disabled (default),
16 MHz external"
Изменены опции сборки, пересобираем все
collect2.exe: error: ld returned 5 exit status
exit status 1
Ошибка компиляции для платы ATmega328.
Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
"Показать подробный вывод во время компиляции"
…»
Далее еще интереснее:
Ставлю
Спойлер
«…
Код: Выделить всё
MajorCore (от того же https://mcudude.github.io/MajorCore/package_MCUdude_MajorCore_index.json )
atmega8515
16MHz external
2,7v
LTO disabled(default)
запуск компиляции и...
Код: Выделить всё
Изменены опции сборки, пересобираем все
Скетч использует 3496 байт (45%) памяти устройства. Всего доступно 7680 байт.
Глобальные переменные используют 128 байт (25%) динамической памяти,
оставляя 384 байт для локальных переменных. Максимум: 512 байт.
…»
Воть так фокус...
Значит «
https://mcudude.github.io» мой тестик для "родной" 328й
сочло "недопустимым", а для 8515 - нормально схавало...
то же и в случае с 8535
Спойлер
«…
Код: Выделить всё
MightyCore ( https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json )
atmega8535
16MHz external
2,7v
LTO disabled(default)
pinout "bobuino"
(в этом варианте UART на типовых для адуринке номерах лапок)
Код: Выделить всё
Изменены опции сборки, пересобираем все
Скетч использует 3522 байт (45%) памяти устройства. Всего доступно 7680 байт.
Глобальные переменные используют 128 байт (25%) динамической памяти,
оставляя 384 байт для локальных переменных. Максимум: 512 байт.
…»
в то же время большинство «mcudude.github.io» платформ выкидывают представленный выше
"типовой матюк"
(
collect2.exe: error: ld returned 5 exit status
exit status 1
Ошибка компиляции для платы
)
ессно при одном и том же представленном тесте.
ЧУДЕСА...
Приложением два архивчика:
собственно исходный вариант без PROGMEM
и "модернизированный" с примитивным знакогенератором, прописанным массивом данных в ПЗУ
это "учебно-тренировочный материал" для понимания вышеописанного.
ардуино-IDE версии 1.8.8 со всеми на текушшу дату обновлениями.
