Arduino+FreeRTOS. Проблемы со стеком

Доброго всем дня.
Разрабатываю проект на Ардуино Due + FreRTOS.

После старта FreRTOS происходят какие-то проблемы с определением доступной памяти. Или FreRTOS занимает весь стек. Или указатель стека как-то не правильно после ее старта работает. Помогите разобраться с проблемой.

Фото 1. Запущено полностью, без РТОС.
Фото 2. Запущена РТОС + 1 задача.
Фото 3. Запущено полностью с РТОС.

image
image
image

Он правильно работает, просто не так как ты себе вообразил.

Это как, простите?

Так и подскажите, как после старта РТОС посчитать правильно сколько свободно RAM.

1 картинка запускается МК, измерение происходит после всех инициализаций и до старта шедулера.
2. картинка запускается шедулер с одной задачей - показать состояние РАМ и потом удалиться.
3. картинка все работает как должно

Выложите код , который используете для тестирования

Пишешь менеджер памяти с такой функцией и считаешь.

/// <summary>
/// Определение свободной памяти контроллера
/// </summary>
void my_freeRam(void)
{
	char* ramstart = (char*)0x20070000; //адрес начала SRAM
	char* ramend = (char*)0x20088000; //адрес конца SRAM

	char* heapend = sbrk(0);
	register char* stack_ptr asm("sp");
	struct mallinfo mi = mallinfo();

	int ansi_dat_str = ANSI_INFO_ROW + 1;

	int RamAll;

	int RamStatic;
	int RamDynamic;
	int RamStack;

	int RamFreeSH;
	int RamFreeAll;

	RamAll = ramend - ramstart;
	
	RamStatic = &_end - ramstart;
	RamDynamic = mi.uordblks;
	RamStack = ramend - stack_ptr;

	RamFreeSH = stack_ptr - heapend;
	RamFreeAll = RamFreeSH + mi.fordblks;

	my_view_serial_print("RAM ALL:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (RamAll), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;
	my_view_serial_print("Ram used (bytes): ", ansi_dat_str, ANSI_RAM_NAME_COL); ansi_dat_str += 1;
	my_view_serial_print("  static:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (RamStatic), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;
	my_view_serial_print("  dynamic:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (RamDynamic), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;
	my_view_serial_print("  stack:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (RamStack), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;

	my_view_serial_print("Ram Min:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (RamFreeSH), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;
	my_view_serial_print("Ram Free:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (RamFreeAll), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;
	
	my_view_serial_print("arena:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (mi.arena), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;
	my_view_serial_print("ordblks:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (mi.ordblks), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;
	my_view_serial_print("hblks:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (mi.hblks), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;
	my_view_serial_print("hblkhd:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (mi.hblkhd), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;
	my_view_serial_print("fordblks:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (mi.fordblks), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;
	my_view_serial_print("keepcost:", ansi_dat_str, ANSI_RAM_NAME_COL); my_view_serial_print((String) (mi.keepcost), ansi_dat_str, ANSI_RAM_VALUE_COL); ansi_dat_str += 1;

}

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

xPortGetFreeHeapSize() и читай документацию по freertos, если уж влез в это дело

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

тем более что этот вариант, ИМХО, не подходит по многим причинам.
в том числе, что куча у меня №3.

и вопрос у меня, если вы обратите внимание, не в том что маленькая куча РТОС. которой мне не хватает.
а вопрос в том почему все показывает правильно: и статика и куча, а стек при запуске РТОС - показывает странные для меня значения.

и раз у меня косноязычие попробую еще раз.

  • интересует не стек задач,
  • интересует не размер памяти и свободное место в куче РТОС
  • интересует распределение банка памяти SRAM.

как мне одноразовым запросом узнать это.
какие изменения в моей функции надо сделать, чтобы правильно посмотреть память после старта РТОС.
причем, статика и куча показываются скорее всего в обоих случаях правильно.
что-то происходит со стеком.
причем, если уменьшаю объем статики и кучи - стек подрастает, и в принципе в сумме итог одинаковый.

Потому что тебе лень напрячься и прочитать документацию и понять как работает freertos. Ты то ли ждешь что кто-то телепатически в мозги закачает информацию, то ли отказываешься читать документацию с официального сайта и ждешь что-то сюда ее специально для тебя перепечатает.

мне не лень.
все что я прочитал - мне не помогло.
то что Вы сказали - тоже не помогло.

А Вы не перепечатывайте, а ссылку дайте, если Вам известен реальный ответ на мой вопрос.

Я думаю что вам хотят объяснить что у каждой задачи свой стек и он может быть ДАЛЕКО от вершины …

насколько я понимаю, стеки отдельных задач должны находиться в HEAP.
имхо, увеличиваю кол-во задач, увеличиваю каждой задаче стек и куча растет.

Насколько у меня хватает мозгов.

  1. Статическая область не меняется ни без РТОС ни с ней.

  2. Куча в которой после запуска, ИМХО, должна быть и РТОС - разумно увеличивается уменьшается.

  3. Стек. До запуска РТОС с ним все в порядке. 152. После запуска указатель стека уходит по идее куда-то в кучу. И все манипуляции со статикой и кучей - все равно стек занимает все остальное + лишку, чтобы быть в куче.

Я понимаю так, что указатель стека, вместо того чтобы показывать границу реального стека, как мне кажется начинает показывать стек задач РТОС в куче. А может я чего-то и не догоняю.

размером кучи и прочим я управлять не могу, так как у меня heap_3.c

Это и есть РЕАЛЬНЫЙ стек.

Если вычислять размер стека как RAMEND - SP, то такое поведение и должно быть…

а вот кстати.
лучше еще раз переспрошу.
Вы хотите сказать что общего стека нет после запуска РТОС?
мерить его не надо?
Статика + куча в которой находится РТОС и все?

Есть много стеков и для каждой задачи он РЕАЛЕН на 200%…