Как объявить глобальные переменные в PSRAM

Перед использованием PSRAM надо выполнить psramInit()

Тогда каким образом объявить глобальные переменные? В void setup() они же не будут глобальными…

В примерах кода нашёл только это:

void setup() {
Serial.begin(115200);
//PSRAM Initialisation
if(psramInit()){
        Serial.println("\nThe PSRAM is correctly initialized");
}else{
        Serial.println("\nPSRAM does not work");
}

//Create an integer
int *var_int = (int *) ps_malloc(sizeof(int));
*var_int = 42;
}


Кто тебе запрещает указатель объявить глобально?
Выделишь ему память «уже по месту».

их объявляют в начале кода

Покажите пожалуйста как это сделать.

Бабос, как ты что-то смог написать не объявив сумму денех?))

=====================================================

Ну примерно как-то так:

int *var_int;

void setup() {
  Serial.begin(115200);
  //PSRAM Initialisation
  if (psramInit()) {
    Serial.println("\nThe PSRAM is correctly initialized");
  } else {
    Serial.println("\nPSRAM does not work");
    while(1);
  }

  var_int = (int *) ps_malloc(sizeof(int));
  *var_int = 42;
}

void loop () {

  Serial.print("Var_int = ");
  Serial.println((int)*var_int);
  *var_int = 56;
  delay(5000);
}

Не проверял. И не уверен на счет правильности 20 строки.

1 лайк

ну тут то можно помочь, даже если он код от ии скинул, а еще спать охота но нельзя, надо входить в другой режим, временно не до денег)))

О как, понятно почему бесплатно и бесполезно писал ))

Никак.

Подробнее

Глобальные переменные всегда идут в .data и .bss , т.е. DRAM.

Причина проста - память под глобальные переменные выделяется задолго до инициализации чего бы то ни было.

Это бутлоадер, который ничегошеньки не знает про PSRAM, пакостит.

Это он, негодяй, загружает бинарник ваш в DRAM и IRAM. Ну, не весь бинарник, а только .data, .bss, еще наверняка что-то.. .iram1.text.*, в частности.

Если вам нужны глобальные переменные гигантские (массивы, там, например), то вам к malloc(). Вернее, даже не так - вам к heap_caps_malloc(). Вот таким образом: heap_caps_malloc(…, MALLOC_CAP_SPIRAM)

Тогда гарантированно выделится память в PSRAM.

Если вы попытаетесь сделать просто malloc(), большого буфера, то он тоже будет выделен в SPIRAM. Ну а если махонький буфер - то как повезет. Скорее всего будет DRAM

ЗЫЖ

На самом деле, конечно можно разместить переменные где угодно.

Просто это нетривиальная задача.

Но в общих чертах:

  1. смотрите, что такое RTC_DATA_ATTR . Поиском по заголовочным файлам.
  2. разбираетесь, что такое секции, и как их обрабатывает линкер
  3. разбираетесь в синтаксисе linker файла, производите там соответствующие исправления (по образу и подобию)
  4. наконец-то пишете в своем коде, скажем, “int MY_PSRAM_VARIABLE var;“
  5. разбираетесь как устроен 2nd stage bootloader (исходный код и примеры в ESP-IDF)
  6. исправляете bootloader так, чтобы он инициализировал PSRAM, и загружал туда вашу секцию (скажем, .my_psram_data)
  7. PROFIT!!!

PPS: на несколько месяцев развлечение, плюс, даже не думай начинать без OpenOCD/JTAG - инфаркт будет