СВободная память ,стек

Добрый день. Скажите пожалуйста каким образом я могу посмотреть размер занимаемый стеком в определенное время!. Я нашел только функции которые показывают неиспользованную память , но не нашел ответа учитывают они нижнюю границу используемого стека или нет . Например …

int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

Мне кажется , что нет , ( а тогда он мне не подходит )так как __brkval последний указатель используемой памяти , и не факт что стек не залез на нее…(возможно ошибаюсь)
Спасибо

А каким образом ограничивается нижняя граница стека ???

Никаким просто у меня есть подозрения что в определенный момент стек переписывает мои данные , т.к я ожидаю одно , а в итоге мусор… С другой стороны этот кусок кода отдельно работает и никакого мусора.

SPL SPH смотрите - эта пара указывает на текущее состояние указателя стека

Спасибо , попробую … чтото про регистры ннесообразил

void setup() {
  Serial.begin(9600);
  // put your setup code here, to run once:
uint16_t val;   


byte val_1 = SPL;
byte val_2 = SPH;
uint16_t value = val_1 + (val_2 << 8);
Serial.println(value);
}

пишет указатель находится на 8665 при том что Максимум: 8192 байт. не учитывая сам код…
Где я торможу ?

#define RAMSTART 0x200
#define RAMEND 0x21FF
там 0x200 байт на регистры завязано и потом уже 8192 байта RAM

1 лайк

А… понял … Спасибо

Проблема тут одна: как названия регистров, так и названия констант неуниверсальны - где-то они определены, где-то - нет.
Текущее положение стека можно узнать, взяв адрес локальной переменной (предполагая, что она единственная) или параметра функции.
Текущее положение указателя кучи можно узнать, запросив немного памяти.
Соответственно, количество свободной памяти - их разница.

В том то и дело , что не единственная. мало того используя библиотеки экранов я не во всех разбирался , что они используют , поэтому хотел в момент наблюдения глюка посмотреть размер стека , чтоб исключить его вмешательство, т.к после компиляции остаток памяти остается где-то порядка полутора килобайт…

extern int __bss_end;
extern void *__brkval;
#define RAMSTART 0x200
#define RAMEND 0x21FF


void setup() {
  Serial.begin(9600);
  int freeValue;
  if ((int)__brkval == 0)
    freeValue = ((int)&freeValue) - ((int)&__bss_end);
  else
    freeValue = ((int)&freeValue) - ((int)__brkval);
  Serial.println("Свободная память " + String(freeValue - RAMSTART));
  Serial.println("Граница стека " + String((SPL + (SPH << 8)) - RAMSTART));
  Serial.println("Размер стека " + String(RAMEND - (SPL + (SPH << 8))));
}

написал , вроде то , что надо

p/s универсальность не нужна , нужно для отладки на конкретном чипе

Как всегда не указан МК!

Вот в этой теме есть готовая библиотека для исследования памяти в AVR (в конце стартового поста). Там и не только стек смотрится.

Да с мк стормозил , но с 8 кб немного… Atmega 2560/// Библиотека конечно хорошо , но она тоже место занимает , а у меня дефицит с оперативкой иначе б даже не возник такой вопрос…
По сути мне надо было понять, смогу я уложиться в мегу или все таки придется либо вешать внешнюю рам либо просто перейти на что нить другое…Но аналога с большим количества портов кроме кортекса не нашел , поэтому пока выясняю возможность использование меги

что ж вы туда запихнули :slight_smile:

4 масива с профилями которые постоянно используются и меняются . в еепром и SD пробовал но вызывает торможение в комплексе которое меня не устраивает … и остальное локальные глобальные переменные
TempList [4][750]

возможно после оптимизации и отказа от библиотек (если получиться изучив их написать свое) я уменьшу размер , но врядли очень существенно… поэтому хотелось понять мега тупиковый вариант или есть смысл продолжать

Да просмотрел , существенно размер она не добавит …спасибо не увидел раньше… хотя размер стека я вроде и у себя смог получить а именно мне он нужен был

Рекурсия нигде не закралась ?

Вроде нет … стараюсь по мере написания оптимизировать , текстовую инфу тоже почти всю в PROGMEM

Возможно SPI флеш ускорило бы работу , но во первых я так и не смог пока подружить преобразователь уровня TXS с ней , а во вторых на ней еще 6 устройств включая tft … Боюсь не сильно вырастет быстродействие

1 лайк

А зачем SPI flash, если нужно оперативно менять значения?
Вам нужна SPI RAM, что-то такое:
https://aliexpress.ru/item/4000242457828.html
Петрович публиковал библиотеку для работы с ней:

ну да она, но не суть … проблема в том что я не смог пока подружить связку мега TXS память… толи преобразователь кривой толи руки… пишет неизвестное оборудование