Перейти к содержанию
    

как указать в линкере размер стека/хипа с указанием конкретных границ

Здравствуйте!

 

Выскакивает ошибка TLB refill, и так как программа исполняется в ОЗУ нужно конкретно указывать  стек и и хип

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

Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

define region NearData = [from 0x0000 to 0x07FF];
...
define block CSTACK with size = 256 {};
define block HEAP  with size = 0 {};
...  
place at end of NearData        { block CSTACK };
place in NearData               { block HEAP, ...};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может стоило указать для какого компилятора/линкера? Тогда и будет синтаксис узнаваем. Это конфигурационный файл линкера IAR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Открываете линкерскрипт и смотрите название секции стека. Допустим, это будет .reserved_for_stack.

Цитата

    .reserved_for_stack (NOLOAD) :
    {
        . = ALIGN(4);
        PROVIDE(__reserved_for_stack_start__ = .);
        KEEP(*(.reserved_for_stack))
        . = ALIGN(4);
        PROVIDE(__reserved_for_stack_end__ = .);
    } > SRAM
 

Создаёте в этой секции массив. Линкер будет обязан выделить под него место.

static uint8_t _stack[1024]  __attribute__((used, section(".reserved_for_stack"), aligned(8)));

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо, но я не совсем понял как объявить сами границы, то есть  __reserved_for_stack_start__ и __reserved_for_stack_end__

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем вам указывать границы? Задаёте размер, остальное дело линкера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласен, сделаю тогда по размерам и стек из конца перенесу сразу после bss

Но так как у меня исполняемая программа также крутиться в рам мне нужно дать линкеру разграничивать bss. stack, heap после 64 КB от начала рам

Туда как раз хотел поместить исполняемую программу

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При таких скромных ресурсах ОЗУ, полезно обходиться вообще без heap-ов....  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, jcxz said:

При таких скромных ресурсах ОЗУ, полезно обходиться вообще без heap-ов....  :wink:

FreeRTOS...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Куча в стартапе/скрипте линкера не имеет никакого отношения к куче FreeRTOS.

Куча FreeRTOS - это обычный массив static u8, объявленный где-то в heap_x.c, не более.

У себя в проектах всегда стандартную кучу библиотеки окружения Си устанавливаю в 0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

куча имеет отношение в выделении памяти

Таскам и системным вызовам ртос гдето надо размещатся, а в случае ограниченной памяти лучше это делать через управление от самой ОС

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...