А как можно объявить массив, что бы компилятор разместил его во флеш памяти, а не SRAM? static const uint16_t image_data[80*64]; objdump -x hello_world.elf | grep image_data 2000044c l .bss 00002800 image_data речь про STM32

Комментарии: 15

  1. Hordiienko

    Static inline

    • Cyberzx

      inline переменных в С нет. это же С++11 обнаружил, что если объявить с инициализатором static const uint16_t image_data[80*64] = {0}; то размещает во флеше. но если убрать const, то опять в SRAM

      • Boris

        потому что для неконстант это .data, а для констант .text

        • Cyberzx

          Но я же ведь могу писать во флеш? Просто не так быстро

          • Boris

            вопрос не в том можешь или нет, вопрос в секциях обычно секция констант кладётся после секции кода

            • Cyberzx

              Спасибо. вот так размешает правильно uint16_t image_data[160*128] attribute ((section (".rodata"))); но, видимо, что бы было совсем правильно, надо ещё похачить ld скрипт и сделать отдельную секцию, а не юзать rodata

              • Boris

                ну вообще да, т.к. потому могут быть проблемы

      • Igor

        А как неинициализированный массив разместить во флеше, а в рантайме инициализировать; Компилятор разместит во флеш если объявить инициализированный массив как const. Если Вам нужно сохранять в массиве настройки то смотрите в сторону чтения-записи флеш. Можно объявить структуру настроек и в нее поместить массив. Отдельная процедура на чтение структуры из флеша в память и обратно. При этом сама структура будет обычной, не const

        • Cyberzx

          Да я просто хотел фреймбуфер для экрана где-то разместить. Но по факту флеш это ROM память. Запись туда хоть и не вызывает прерывания, но ни к чему не приводит.

          • Igor

            фреймбуфер во флеше? А как в него писать собрались? Или он статический? Во флеше я размещал шрифты. Там каждому символу свой массив констант. А фрейм-буфер - это должно быть озу и желательно скоростное и с возможностью вывода на дисплей по ДМА. Мне понравилось FreeRTOS использовать. Одна задача буфер готовит а вторая управляет ДМА выводом. Ну и конечно SPI будет узким местом в любом случае. Интерфей последовательный. Т.е. 1 байт передается как минимум за 8 тактов CLK

            • Cyberzx

              Да я только неделю эмбедедом занимаюсь. Ещё не во всём разбираюсь :) Завёл маленький буфер в SRAM. Пишу туда, потом заливаю по DMA и так три раза. Вроде норм

              • Igor

                Все получится :) Я тоже совсем недавно стал осваивать stm32. Тут главное терпение и доки читать внимательнее

          • Anonim

            ох вообще если нет памяти, но хочется +- нормально работать, то предлагаю подход растеризации держать в памяти список примитивов заполнять мелкий фреймбуффер из 8 строк пикселей, например

            • Cyberzx

              анимация получилась даже с float point арифметикой) хотя видно, что я экран делю на три части

              • Anonim

                выгружать по dma, пока выгружается - подготавливать следующие 8 строк

Не нашли ответ?

Вам также может быть интересно