Как расположить во флеш памяти Arduino Mega2560 Бинарные Данные.
- Войдите на сайт для отправки комментариев
Пт, 20/01/2017 - 18:49
Как расположить во флеш памяти Arduino Mega2560 Бинарные Данные. Причем не только расположить а автоматизировать этот процесс.
Шаг - 0 Введение :)
Всем кто балуется Arduino Mega2560 привет! Хотя решение годится и для mega1280.
Как оказалось, несмотря на наличие памяти аж 256 КБ :), не так-то легко ее использовать.
Захотел я реализовать красочные рисованные экраны с картинками, было принято решение расположить их во флеш.
!!!! Предупреждение: Тут нехорошие люди учат как менять настроечные файлы
ардуино и gcc, а это может сломать вам все, поэтому делаем Бакап всего. Вопли пострадавших услышаны не будут.
Весь этот длинный список нужно сделать ОДИН РАЗ!!! а потом пользоваться долго во всех ваших разных проектах с разными данными .
Рассказываю в исторической последовательности как сам доходил...
Сначало был опробован способ с объявлением данных в виде массива символов в PROGMEM.
# пример массив из 120 строк, в каждой строке 320 байтов #include <avr/pgmspace.h> #include <a9.h> const char str_0[] PROGMEM={ 0x7F ,0x4E ,0x7F ,0x4E .... } PGM_P const ImgEntry[120] PROGMEM ={ str_0 ,str_1 ,str_2 ,str_3 , ... str_119 }
Даже написал конвертер из bmp в такие строчки,
но как оказалось, это решение имеет существенный недостаток, вторая же картинка вешает программу.
Механизм PROGMEM организован так, что наши PROGMEM данные попадают в самые младшие адреса,
дальше идут данные которые используют библиотеки Ардуино, дальше идет программа.
Это нехорошо, потому-что системные библиотеки, что используют эти данные НЕ
УМЕЮТ с ними работать за пределами 64К (вот такие молодцы разработчики Ардуино ). Приехали!
Я было даже сначала пофиксил эти библиотеки...
Но нашлось более красивое и удобное решение.
Обратите вниманое на --rename-section .data=.userbindata тут происходит переименование секции в
в самом конце секции .text добавим наши данные и секция текст с нашими добавлениями будет выглядеть так:
комменты:
{compiler.path}bin2obj.cmd написанный мной cmd файл рассмотрим ниже, лежит в той же папке где компилятор
где INPUT () еще одна команда ldscripts курим мануал...
А вот что с этими указателями можно делать... это в следующий раз :)))
здравствуйте. Прочитала вами выше изложенное, появилось небольшая куча вопросов? помогите пожалуйста на мои вопросы по мере возможности ответить. начну. я собрала 3D RGB LED POV Globe из компонентов MEGA2560 и 74hc595 + 48 RGB LED. проект изначально был найден на просторах интернета и рассчитан на работу с Atmega328, и 3 картинки, видимо как пример, но посидела, подумала, собрала, попробовала его в действие, поняла что Flash arduino328 для картинок в 48 RGB LED в количестве больше 8 шт мала. пришла идея установить Mega2560. установила, но появилась проблема. проблема вот какая. В MEGA2560 я могу без проблем загрузить 18 картинок по 38,8Kb, и вот тут наступает проблема описанная выше в ШАГе-0, то есть дальнейшее увеличении файлов картинок приводит к некорректному отображению картинок, тормозят срывается изображение (просто полосы горизонтальные ) смешанное отображение 2-3 картинок одновременно. вообщем белиберда. (только там описана работа с bin файлом, а у меня byte) ровно все то что описано в ШАГе-0. вопрос? прочитав все выше изложенное. как бы понятно. файлы про которые написано, нашла. что дописать поняла. Но, не поняла вот что, как в ШАГе 2, был определен файл относящийся к MEGA2560, если в этих файлах нет ни одного слова про тип контроллера. то есть как определить какому контроллеру принадлежит файл в этом разделе? вопрос 2? как после того как я выполню все выше указанные рекомендации. прописать корректную работу в самом скетче, что бы MEGA2560 стала отображать картинки свыше 18 файлов. что бы в нее можно было загружать 25 или 40 картинок использовать всю память 256Kb и все это корректно выводилось по SPI подскажите пожалуйста как это грамотно все прописать и в скетче и в среде ARDUINO IDEскетч прилагаю. глобус я собрала. только так. я не профи.что куда дописать по указке я пойму. самостоятельно придумать что написать. пока слаба. поэтому и обратилась к вам
инна, у вас что в школе по математике было? - наверно пять, девчонкам всегда пятерки ставят...
Как бы вот эти две строки никак не сочетаются:
18 картинок по 38.8 Кб - это почти 700 Кб, а у меги всего 256 - не влезет, как вы код не переписывайте.
Правда, у меня для вас есть и хорошая новость - ваши картинки (по крайней мере первые их тех, что приведены в коде) - отнюдь не 38 К, а в несколько раз меньше.
Общий же ответ на те сумбурные вопросы. что выше - если памяти не хватает - берите другой контроллер или урезайте хотелки. Никакие программные трюки в вашем случае не помогут.
У меня нет 2560, но там что то с организацией PROGMEM не так как у 328 из-за размеров памяти. Может дальние указатели нужны ...
У меня нет 2560, но там что то с организацией PROGMEM не так как у 328 из-за размеров памяти. Может дальние указатели нужны ...
да, точно. 16битные указатели могут адресовать только первые 65к
200*18*18=64800
200*18*19=68400
pgm_read_byte_near надо поменять на pgm_read_byte_far или как то так - нужен ДАЛЬНИЙ адрес !
4199 и далее - при одинаковом размере картинок это можно сделать ИНАЧЕ, а не по ОДИНАКОВОЙ строке на картинку !!!
спасибо за подсказки. как то я неграмотно посчитала объем и тем самым вас отвлекла. извините. а может подскажете какой контроллер побольше с памятью можно взять вместо меги2560 . что бы скетч сильно не переписывать, а подходил, переписав только номера пинов или еще что то добавив не значительное. типо библиотеку для самого контроллера. и что бы не рыть даташиты всего мира.
ESP32. Но скетч переписывать придется. Или мудрить с внешней EEPROM
может подскажете какой контроллер побольше с памятью можно взять вместо меги2560 . что бы скетч сильно не переписывать
Читайте внимательно ответ в сообщении #13 - у вас проблемы не с тем, что памяти не хватает, а с правильным доступом с ПРОГМЕМ с адресами выше первых 65к
Так что Мегу можно не менять, при правильном подходе в нее влезет еще с полсотни картинок
попробую переписать как указано. посмотрю что получится. там как я поняла надо поменять near на far. попробую позже отпишусь.
4199 и далее - при одинаковом размере картинок это можно сделать ИНАЧЕ, а не по ОДИНАКОВОЙ строке на картинку !!! вот это не очень понятно. а не подскажете какую нибудь более подробную инструкцию что нужно изменить в скетче кроме вот этого из всего что я поняла pgm_read_byte_near надо поменять на pgm_read_byte_far или как то так - нужен ДАЛЬНИЙ адрес ! а то здесь указано что вот как то примерно вот как то так. заранее буду благодарна
вот что получается если перeписать во всех строчках near на far. нет картинок ни каких.просто полосы от диодов подскажите пожалуйста как все это правильно написать в скетче . будьте так добры. пожалуйста а насчет математики у меня не плохо данные были взяты вот как, просто не подумала посчитать сами байты. если данные картинки сохранить с расширением txt , то объём файла будет отображаться как 38.8Кб
инна
Если путь ТС не понятен, то Вам надо использовать другой пакет поддержки плат - https://github.com/MCUdude/MegaCore
Там есть PROGMEM, PROGMEM1, PROGMEM2 и PROGMEM3 и методы их использования.
Не осилите - дорога в платный раздел.
в платном отделе не желают с этим связываться . так как там ожидают нечто серьезное от заказчика. например что бы сережа шойгу у них заказ разместил на сумму не менее 100 000 000 фунтов стерлингов или на крайняк канадским долларом пойдет или ухватить от роскосмоса заказик. а с простым частником они связываться они не желают. я уже всех обошла. а у некоторых так и на писано с готовым проектом не подходить. поэтому я здесь.
Тогда САМООБРАЗОВАИЕ Ваше всё !
У ТС все достаточно хорошо расписано. Вам надо все свои картинки оформить в bin файлы. Объявить в скетче как внешние. Прилинковать их.
Потом через pgm_read_byte_far(pgm_get_far_address(имя картинки)) получать байты.
Сколько вы готовы заплатить за работающий скетч с 50+ картинками ?
я почитала. все что было указано в сообщении №13 это правильно. но это для чтения строка, а на GitHub как раз и показано как записать сначала данные во FLASH, а после их прочесть. и у меня должно быть сначала записано нечто подобное ( const char far_away [] PROGMEM1 = " Привет издалека! \ n " ; // (64 - 128кБ)
const char far_far_far_away [] PROGMEM3 = " Привет издалека, далеко, далеко! \ N " ; // (192 - 256кБ) ) а вот как надо правильно записать именно про мой скетч. то-есть я поняла, что для начала надо изменить char на byte. и далее составить нечто подобное., по такому же сценарию, и куда это записать в самых первых строках скетча или сразу после данных о картинках. то-есть после картиночного кода. подскажите
Не уверен что в родном пакете Arduino есть PROGMEM1,2,3...
const byte bild_01[] PROGMEM=
меняем на
const byte bild_01[] PROGMEM1=
для 18 картинок
на const byte bild_01[] PROGMEM2=
еще для 18
на const byte bild_01[] PROGMEM3=
еще для 18
в 13 сообщении видимо надо все таки читать через
pgm_read_byte_far(pgm_get_far_address(имя картинки))
я же говорю что нет у меня на руках 2560... вот и не могу проверить в железе
Главная беда PROGMEM в том что данные размещаются до всех других данных и кода. И когда этих данных больше 64К, то другие данные становятся не доступны скетчу !!!
не знаю
нет в папке файла PROGMEM 1 2 3. просто PROGMEM один файл
самообразованием я занимаюсь.
нет в папке файла PROGMEM 1 2 3. просто PROGMEM один файл
я вижу чем вы занимаетесь - просите написать за вас причем ДАРОМ
а как создать тогда PROGMEM 1, PROGMEM 2, PROGMEM 3 и так далее. если в этом есть необходимость а насчет перевода byte в bin надо тоже будет думать. так как код картинки получается автоматом с проги которая и была написана на JAVA, специально для этой программки.
если PROGMEM заменить на PROGMEM1 и не компилируется, то надо добавить пакет поддержки MegaCore и выбрать плату 2560 из него
сейчас проверю у меня стоит версия ардуино иде 1.8.13
Proteus на PROGMEM1 ругается.
я не прошу написать даром. я хочу что бы мне просто не много подсказали. так как получить готовый это очень просто, а мне хочется хотя бы самой немного принимать участие и разбираться.
В этой ветке уже два варианта - разбираться !!!
не добавляя ни каких MEGACore после добавления 1 сразу с синего цвета изменил на обычный заглавный шрифт черно-белый .значит надо добавитьMegaCore???
Я в цветах не разбираюсь - запустите компиляцию ...
"Вам шашечки нужны или доехать?"
не добавляя ни каких MEGACore после добавления 1 сразу с синего цвета изменил на обычный заглавный шрифт черно-белый .значит надо добавитьMegaCore???
это ничего не значит
Инна, судя по сообщениям в этой ветке - вы почти по нулям в этой теме. Вам надо не сыпать вопросами, как из пулемета, а сесть и разобраться, как работает прогмем и в чем проблема с адресами более 65К. Не думаю. что это можно сделать за 15 минут - на это уйдет дня три, а может неделя. до этого лучше воздержаться от вопросов
установила я MegaCore и сразу опять PROGMEM1 ,2,3 стали подсвечиваться синим значит что-то стало поддерживать ?!
в платном отделе не желают с этим связываться . так как там ожидают нечто серьезное от заказчика. например что бы сережа шойгу у них заказ разместил на сумму не менее 100 000 000 фунтов стерлингов или на крайняк канадским долларом пойдет или ухватить от роскосмоса заказик. а с простым частником они связываться они не желают. я уже всех обошла. а у некоторых так и на писано с готовым проектом не подходить. поэтому я здесь.
А какой смысл куда-то идти, если у Вас уже есть готовый проект?
А если в "готовый проект" надо внести незначительные с Вашей точки зрения изменения, то на самом деле может оказаться, что самый дешевый способ получить проект с такими изменениями - это переписать его с нуля.
Видите ли, в каждом деле есть своя специфика. Попробуйте, например, подойти в парикмахерскую с просьбой постричь Вас чуть длиннее, чем сейчас.
полностью со всеми вами согласна
установила я MegaCore и сразу опять PROGMEM1 ,2,3 стали подсвечиваться синим значит что-то стало поддерживать ?!
На заборе всегда много приличных и не очень слов, а за забором максимум дрова ...
из 24 сообщения. при изменении строки как указано pgm_read_byte_far(pgm_get_far_address(имя картинки)) выдает ошибку. извините если что не так. буду разбираться.
выдает ошибку
Вы бы хоть показали эту строку после исправлений !!! (весь код не нужен)
SendRecSPI(pgm_read_byte_near(bild_01 + pointer + l))
меняем
SendRecSPI(pgm_read_byte_far(pgm_get_far_address(bild_01) + pointer + l))
P.S. !!! Не надо по полной заполнять PROGMEM3 !!!
Там в конце вероятно загрузчик и его можно нечаянно затереть.
а писать проект заново, мне не надо. так как к этому проекту прилагается программа Globe Sim v0.5 и она выдает код картинки именно в формате byte, поэтому как раз чтобы не кого сильно не напрягать, нужно и сделать из того что имеется. и еще тут предлагали что бы я сама назначила цену за правку проекта. обозначьте вы пожалуйста сами, сколько это будет стоить. я подумаю? если вас не затруднит. будьте так добры пожалуйста а я пока буду сама разбираться
Вы можете скопировать то что я написал, а не отсебятину ?
Текст ошибки обычно правильно указывает место и тип ошибки !!!
case 2: for (int l=0; l<18; l++){SendRecSPI(pgm_read_byte_far(pgm_get_far_address(bild_02));} //
вы скобки открытые и закрытые умеете считать ?
bild_02 + pointer + l
вы тут складываете теплое с мягким и вонючим
на github же есть примеры работы:
Где ваше самообразование ???
Программирование не ваша стезя - 100500%!!!
Globe Sim v0.5 выдаёт данные согласно принципу работы железа, а как их выводить - способов много
а писать проект заново, мне не надо. так как к этому проекту прилагается программа Globe Sim v0.5 и она выдает код картинки именно в формате byte, поэтому как раз чтобы не кого сильно не напрягать, нужно и сделать из того что имеется. и еще тут предлагали что бы я сама назначила цену за правку проекта. обозначьте вы пожалуйста сами, сколько это будет стоить. я подумаю? если вас не затруднит. будьте так добры пожалуйста а я пока буду сама разбираться
Мне вы уже задолжали минимум 1000 рублей ! (начиная с первого вашего поста про глобус)
а еще я забыла наверное упомянуть. то есть, если я загружаю 18 картинок все отображаются корректно, если 20, то первые 2-4 картинки выводятся как белиберда, а дальше все также хорошо и пройдя цикл, все повторяется снова. это при исходном коде без исправлений.
простите не заметила пропущенную скобочку а смеяться это проще всего. вы тоже не родились программистом, а учились