реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Как определить максимальную реальную глубину CSTACK моей программы?, в отладчике
Ga_ry
сообщение Nov 25 2015, 19:15
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



Что то читал, читал эту ветку и так и не понял как определить хватает места программе для стека или нет.
Вот например (IAR AVR) изначально по умолчанию 0x20 явно не хватало, шли сбои, увеличил до 0x44
вот последние строчки из MAP
Цитата
CSTACK DATA 00000100 - 00000144 45 dse 0
RSTACK DATA 00000145 - 00000178 34 dse 0
NEAR_I DATA 00000179 - 00000284 10C rel 0
NEAR_Z DATA 00000285 - 000002DF

во вложении скриншот memory data после работы программы

Как понять сейчас хватает программе этого размера?
Какой минимум можно оставить для CSTACK?



Сообщение отредактировал Ga_ry - Nov 25 2015, 19:31
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Nov 25 2015, 20:49
Сообщение #17


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Ga_ry @ Nov 25 2015, 22:15) *
...Как понять сейчас хватает программе этого размера?Какой минимум можно оставить для CSTACK?..


делаете три вещи
1) при выделении стэка расписываете магическим числом всю память под стэк.
2) в определённые срезы времени проверяете сколько памяти осталось расписанной вашим магическим числом(например при переключении задач, если ось)
3) скидываете каждые изменения размеров остатков стэков в лог

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

Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Nov 25 2015, 21:09
Сообщение #18


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



Понятно.
Вот только логи мне писать некуда, 8к почти под завязку (20 байт осталось) т.е. код для формир. лога вставить тоже некуда. Ноги МК тоже, НИ ОДНОЙ свободной.
Брать контроллер с большей памятью, отладку делать на нем?

А вот это изначальное заполнение FF не пойдет для магического числа?
Go to the top of the page
 
+Quote Post
Target
сообщение Nov 26 2015, 08:20
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 21-05-08
Пользователь №: 37 691



Цитата(SSerge @ Nov 25 2015, 15:51) *
#pragma segment = "NEAR_ID" __farflash
char __farflash* pNEAR_ID_end = __segment_end("NEAR_ID");


Спасибо!

Помогло так:

#pragma segment = "NEAR_ID" __farflash
void __farflash * pNEAR_ID_end = __segment_end("NEAR_ID");


Цитата(Ga_ry @ Nov 26 2015, 00:09) *
А вот это изначальное заполнение FF не пойдет для магического числа?


Обычно там 00. Можно в прерывании по таймеру или кнопке искать адрес первого ненулевого байта.
Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Nov 26 2015, 10:32
Сообщение #20


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



Цитата(Target @ Nov 26 2015, 10:20) *
Обычно там 00.

Странно, в скриншоте, который прикреплен, видно FF
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Nov 26 2015, 19:37
Сообщение #21


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Ga_ry @ Nov 26 2015, 00:09) *
...изначальное заполнение FF не пойдет для магического числа?


20 байт - можно использовать для многого sm.gif под отладчиком для просмотра/контроля - вполне.
а вот FF - тут дело такое. для скорости проверки необходимо брать всю разрядность шины данных. т.е. если у вас используются 32 разрядный мк -
то это уже 4 байта за раз можно писать/тестировать/сравнивать...

нолик 0x00 как и минус один(в стандарте сей) 0xFF чаще встречается чем какие-либо другие комбинации.
Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Nov 26 2015, 21:21
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



kolobok0, а зачем надо умножать на два?
Go to the top of the page
 
+Quote Post
x893
сообщение Nov 26 2015, 22:04
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



а разве DEADBEEF не помогает - или религия запрещает ?
проблема из пальца выдуманная
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Nov 26 2015, 23:40
Сообщение #24


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(Ga_ry @ Nov 27 2015, 00:21) *
kolobok0, а зачем надо умножать на два?


тут именно посыл вектора поиска от большего к меньшему. т.е. не искать где нехватка, а искать где слишком много и не юзается...
Go to the top of the page
 
+Quote Post
Ga_ry
сообщение Nov 27 2015, 06:23
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 494
Регистрация: 23-06-09
Из: Полтава, UA
Пользователь №: 50 579



Цитата(x893 @ Nov 27 2015, 00:04) *
а разве DEADBEEF не помогает - или религия запрещает ?
проблема из пальца выдуманная

Этот Ваш стиль надменно-пренебрежительный это врожденное или приобретенное?
Ссылку дайте, я первый раз слышу о таком.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 29 2015, 09:38
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(kolobok0 @ Nov 26 2015, 00:49) *
делаете три вещи
1) при выделении стэка расписываете магическим числом всю память под стэк.
2) в определённые срезы времени проверяете сколько памяти осталось расписанной вашим магическим числом(например при переключении задач, если ось)
3) скидываете каждые изменения размеров остатков стэков в лог

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


В ОС (из-за многостековости) имеются "включаемые" режимы контроля размера стек(ов).
Алгоритм тот что указан выше.

freeRTOS:
Код
#if( configCHECK_FOR_STACK_OVERFLOW == 1 )

    /* FreeRTOSConfig.h is only set to use the first method of
    overflow checking. */
    #define taskSECOND_CHECK_FOR_STACK_OVERFLOW()

#endif
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 10th July 2025 - 23:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.0147 секунд с 7
ELECTRONIX ©2004-2016