я пытаюсь зарезервировать несколько байтов sram, где адрес ДОЛЖЕН быть известен во время загрузки, чтобы его можно было вставить в PROGSPACE. До сих пор я проверял мой код в порядке с хитрым распределением на плате Arduino Nano, установив адрес (0x1F6) и последний в программе, которую я делаю
volatile byte shifty_data[3];
чтобы его не переписали в кучу …
код работает нормально, но я не доволен этим, потому что он не совместим с другими ядрами и, возможно, с изменениями среды.
До сих пор я рассматривал изменения в malloc __heap_start (безуспешно, потому что он не постоянен, а адрес неизвестен во время загрузки, я думаю), я также смотрел на avr / io.h и, в частности, на iom328p.h через RAMSTART определяет, что это может работать, но … на systemn это кажется слишком низким, поскольку я хочу использовать аппаратный SPI поверх него … и это может быть лучшим способом сделать это на более высоком уровне, предпочтительно в файлах arduino.
есть идеи?
Я не совсем уверен, что вы спрашиваете здесь, но есть две важные вещи, которые я считаю, что вы неправильно понимаете. Пространство программы отделено от SRAM. они находятся в двух разных адресных автобусах. AVR фактически предоставляет инструкцию для копирования данных из программного пространства в RAM из-за этого разделения [делая его модифицированной гарвардской архитектурой]. Кроме того, есть еще одна вещь, что любая объявленная глобально переменная будет находиться либо в разделе .bss, либо в разделе .data SRAM (это на самом деле является частью стандарта C). __do_copy_data
а также __do_clear_bss
разделы конечного исполняемого файла позаботятся об этом [они автоматически добавляются в раздел .init4]. Вы можете переопределить этот механизм, используя флаги компилятора, однако адрес каждой глобальной переменной известен с момента запуска программы [что-то, что происходит из флэш-памяти, а не из SRAM].
Теперь, помещая вещи в SRAM, я предлагаю вам взглянуть на эта страница в руководстве по avr-libc. Он имеет дело с разделами памяти в целом и как их настроить. Приветствия.
Других решений пока нет …