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