Форум Микро-Чип

Форум Микро-Чип (http://www.microchip.su/index.php)
-   Продукция MICROCHIP (http://www.microchip.su/forumdisplay.php?f=6)
-   -   Как рассчитать глубину использования стека? (http://www.microchip.su/showthread.php?t=18579)

alex_zas 12.01.2020 13:08

Как рассчитать глубину использования стека?
 
Здравствуйте.
Я пишу ПО для PIC16F18877 на ассемблере, пользуюсь старым MPASM v5.76 под Win98. Возникла необходимость подсчёта максимальной глубины использования стека. Цель - определить участки программы с большой вложенностью подпрограмм.
Будьте добры - подскажите с помощью каких утилит можно автоматически рассчитать максимальную глубину стека в программе?
MPLAB это может делать? Если да то начиная с какой версии? Как представляются результаты расчёта?
Заранее благодарен, Алексей.

Марк 12.01.2020 17:31

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242594)
Здравствуйте.
Я пишу ПО для PIC16F18877 на ассемблере

Вы что, не в состоянии узнать сколько вложенных call у вас в коде и прибавить к ним 1 (это прерывания)?
Или Вы допускаете рекурсии?
Какая длина кода?

Марк 12.01.2020 17:42

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242594)
Здравствуйте.
Я пишу ПО для PIC16F18877 на ассемблере, пользуюсь старым MPASM v5.76 под Win98.

А каким образом Вы пишите на ассемблере, который не поддерживает выбранный Вами контроллер?

masterok999 12.01.2020 20:12

Re: Как рассчитать глубину использования стека?
 
Вероятно он добавил файл "p16f18877.inc" из новой версии, которая не идет под под Win98.
Ассемблеру до лампочки, лишь бы описание контроллера было.

alex_zas 12.01.2020 20:48

Re: Как рассчитать глубину использования стека?
 
Вложений: 1
Я сейчас считаю вручную - это очень утомительно. Конечно если прерывания занимают один уровень стека и в основной программе 2-3 call то посчитать просто.
У меня в прерываниях вложенность 3, два параллельных процесса с разделением стека на две части, в каждом процессе вложенность как выясняется местами достигала 5, 11 банков памяти программ по 2к слов заняты процентов на 90 - приходится попотеть...
Рекурсий нет. Я надеюсь.
В моём случае чтобы вручную сформировать по каждому call глубину вложенности нужно часов 5 кропотливой работы. Я думал может я - пещерный человек, в цивилизованном мире всё уже автоматизировано...

Откуда информация что не поддерживает? У меня всё работает.
Посмотрите вложенную картинку.
Конечно на порядок медленнее, чем MPASM v5.02.
Кстати - может кому-то интересно. Для "навороченных" MCU семейства EMR типа 16F18877, 16F19197 выхода нет - только MPASM v5.76.
А для простых MCU семейства EMR скажем 16F1829 можно пользоваться MPASM v5.02. Указываете тип контроллера 16F876A, формируете (.INC) файл с описанием регистров 16F1829, а недостающие команды EMR реализуете макросами. Всё отлично работает. И ооочень быстро.

Марк 13.01.2020 01:50

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242598)
Я думал может я - пещерный человек, в цивилизованном мире всё уже автоматизировано...

Может я чего не понимаю, но для контроля уровня стека нужна полноценная симуляция. А Вы макросами недостающие команды реализуете...
Насколько я понял, Вы реализуете вытесняющую многозадачность и вложенные прерывания мало того, что на АСМе, но и на не слишком приспособленной для этого платформе?
Любопытно, а в чем причина таких страданий? Замена пин2пин 877-го на 18877-ой?

Марк 13.01.2020 01:57

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от masterok999 (Сообщение 242597)
Ассемблеру до лампочки

Лишь до тех пор, пока система команд МК поддерживается в полном объеме. Ну или не применяются те команды, которых в этом АСМе нет.

alex_zas 13.01.2020 09:56

Re: Как рассчитать глубину использования стека?
 
Симулятор выполнит эту функцию, транслятор или отдельная утилита - не важно. Вопрос чем и как это сделать.
Понятно что старый MPASM этого не умеет.
Вложенных прерываний нет, просто прерываний очень много, обработка очень сложная и внутри прерываний есть call-ы.
Многозадачность использована не от "хорошей жизни".
У меня в проекте 6 последовательных интерфейсов, а MCU один, в котором один UART. Пришлось делать пять SOFT-UART-ов. Из-за этого длительность обработки прерываний должна быть минимальной.
Основной процесс у меня - это "терминальный профиль" (работа с GSM-модулем). А вспомогательный процесс - сбор, расчёт и накопление данных.
И оба эти процессы должны выполняться непрерывно и параллельно.
Конечно удобно было бы выполнять вспомогательный процесс в прерываниях, но там есть расчёты с плавающей точкой, которые занимают много времени.
Но суть собственно не в этом. Программа очень сложная, call-ов очень много, ручной анализ сложно делать.
Неужели никто не задавался вопросом - какую глубину стека использует его программа?

Марк 13.01.2020 10:33

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242603)
Симулятор выполнит эту функцию, транслятор или отдельная утилита - не важно. Вопрос чем и как это сделать.
Понятно что старый MPASM этого не умеет.

Вы меня не услышали. Определить уровень вложенности может ТОЛЬКО симулятор (ну если не считать очевидных случаев). И не просто симулятор, а с генератором более-менее реальных сигналов.
И ассемблер тут вообще не причем. Ни старый, ни новый, ни вообще никакой.
Симулятор есть В СРЕДЕ разработки (IDE). И в MPLAB 8, и в MPLAB X.
Вы вообще среду то используете?
ЗЫ. Оффтоп. Так чем вызван такой странный выбор МК? Если Вам нужно шесть UARTов, так и брали бы МК с шестью UARTами...
Не пришлось бы заниматься всем этим мазохизмом...

Марк 13.01.2020 10:39

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242603)
И оба эти процессы должны выполняться непрерывно и параллельно.

В одном ядре никакие процессы не могут выполняться "параллельно и непрерывно". По определению. Поэтому весь вопрос только в допустимых ожиданиях задач. Использовать МК с хардварным стеком для вытесняющей (наиболее близкой к Вашим требованиям) псевдо многозадачности - это какой то фееричный мазохизм..., извините.
К тому же Вы утверждаете, что в прерываниях нет времени, но при этом тратите время на call-return, да еще и не один... Я теряюсь в догадках.

Марк 13.01.2020 10:42

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242603)
но там есть расчёты с плавающей точкой, которые занимают много времени.

Чисто в порядке обмена опытом.
Чем вызвано использование флоатов? Вы используете стандартный флоат или нет?

Рак 13.01.2020 10:54

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242594)
Здравствуйте.
Я пишу ПО для PIC16F18877 на ассемблере, пользуюсь старым MPASM v5.76 под Win98. Возникла необходимость подсчёта максимальной глубины использования стека. Цель - определить участки программы с большой вложенностью подпрограмм.
Будьте добры - подскажите с помощью каких утилит можно автоматически рассчитать максимальную глубину стека в программе?
MPLAB это может делать? Если да то начиная с какой версии? Как представляются результаты расчёта?
Заранее благодарен, Алексей.

Как сказал Марк, никак не определить максимальный уровень вложености аппартного стека. В этом контроллере есть сброс по переполнению стека, его можно использовать для понимания хватает ли стека вообще.

alex_zas 13.01.2020 11:18

Re: Как рассчитать глубину использования стека?
 
...Определить уровень вложенности может ТОЛЬКО симулятор...
Когда то давно я видел в листинге в каком-то трансляторе в списке меток напротив меток подпрограмм в скобках уровень вложенности.
Я немного неверно сформулировал задачу. Мне не нужно знать - какого максимального уровня достигнет указатель стека при работе моей программы (для чего нужен симулятор). Мне нужно знать по каждому call - какая по нему максимальная вложенность. По моему это функция транслятора.
Среду не использую.
К сожалению в 16-й серии нет MCU c 6-ю UART-ами. А использование MCU других серий - для меня связано с целым рядом сложностей (потребуется среда, другая ОС, другой PC, другой программатор, освоить программирование на С, переписать всё ПО на С и освоить новый сложный MCU). Вот это - МАЗОХИЗМ.
Будьте добры - подскажите в каком MCU есть 6 UART-ов?
Конечно "параллельность" условная. У меня как в Windows - по таймеру 256гц происходит переключение между процессами.
Мазохизм? Реализовать это переключение очень просто.
Использование FLOAT32 вызвано требованием высокой точности расчёта некоторых параметров + сложная математика, полиномы + накапливаемая погрешность.
Использую урезанный модуль FLOAT32 Microchip.

Марк 13.01.2020 11:36

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242608)
К сожалению в 16-й серии нет MCU c 6-ю UART-ами. А использование MCU других серий - для меня связано с целым рядом сложностей (потребуется среда, другая ОС, другой PC, другой программатор, освоить программирование на С, переписать всё ПО на С и освоить новый сложный MCU).

6 УАРТов у микрочиповских МК с собственными (не MIPS и не ARM) ядрами есть только в одном МК - PIC24FJ128GA606 (в четырех его разновидностях).
5 УАРТов есть в новых PIC18 K40 и Q43.
Для работы с PIC24F достаточно того же инструментария, что и для PIC16.
Делать сложные проекты без среды, ссылаясь на отсутствие "другой ОС", - истинно мазохизм.
Писать на АСМе 16-разрядной платформы (ASM30/ASM16) Микрочипа НА ПОРЯДОК проще, чем на MPASM.
Даже если делать софтовые UART-ы на самых дешевых PIC24 - это не потребует извращений с переключением задач в хардварном стеке. На этой платформе стек имеет любой размер, который влезет в свободный участок ОЗУ. Ну и тактовая частота ядра будет вдвое выше, а плотность кода выше раза в 4.

Марк 13.01.2020 11:38

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242608)
Мне нужно знать по каждому call - какая по нему максимальная вложенность.

В смысле его ПОВТОРНЫХ параллельных вызовов?

Марк 13.01.2020 11:44

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242608)
Использование FLOAT32 вызвано требованием высокой точности расчёта некоторых параметров + сложная математика, полиномы + накапливаемая погрешность.
Использую урезанный модуль FLOAT32 Microchip.

Сложность математики не влияет на выбор между фикспойнтом и флоатом.
Выбор флоата определяется только ДИНАМИЧЕСКИМ ДИАПАЗОНОМ обработки. Мне трудно представить себе источник данных в ВОСЬМИБИТНОМ контроллере, которому бы не хватило 32 разрядного фикспойнта для любой обработки.
Но даже если это и так, то ТЕМ БОЛЕЕ, нужно было выбирать МК под задачу. И PIC24 (при Вашем контексте разработки) тут очевиден.

alex_zas 13.01.2020 17:01

Re: Как рассчитать глубину использования стека?
 
Вот фрагмент условного исходника:
Код:

x0        call        x1
        return
x1        call        x2
        return
x2        call        x3
        return
x3        call        x4
        return
x4        nop
        return

А вот что требуется получить (фрагмент листинга трансляции):
Код:

x0        XXXXH        (4)
x1        XXXXH        (3)
x2        XXXXH        (2)
x3        XXXXH        (1)
x4        XXXXH        (0)

Напротив имени метки в скобках - количество вложенных call-ов в данной подпрограмме.
И если выясняется что при работе происходит переполнение стека то нужно перелопачивать не весь объём исходников, а только подпрограммы с максимальным числом в скобках.
Можно эти числа определить вручную, а хочется это определять автоматически...
Упомянутое в данной теме изделие растиражировано и находится в эксплуатации. При очередном наращивании функционала был (как в последствии выяснилось) превышен порог глубины стека, что выразилось в периодических перезапусках (с ошибкой стека). Для того чтобы понять где слабое место в программе пришлось проанализировать все подпрограммы на глубину вложенности вручную. Подпрограммы с большой вложенностью обнаружены, исправления сделаны - всё в порядке.
Вопрос открытый - как определять вложенность подпрограмм автоматически?
Когда проектировалось данное изделие ставилась задача - достичь результата с минимальными затратами времени и средств. Поэтому был применён MCU 16-й серии, FLOAT32 и т.д. Не всегда при решении поставленной задачи есть возможность выбора оптимальных средств и методов.
С 24-й серией нужно разбираться, это перспектива. Если в будущем будут аналогичные проекты то конечно нужно использовать 24-ю серию.
Скажите - какие преимущества даёт использование среды (кроме возможности отладки)?.
Фикспойнт раньше не использовал - какие его преимущества по сравнению с флоат?

Марк 13.01.2020 17:42

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242618)
Скажите - какие преимущества даёт использование среды (кроме возможности отладки)?.
Фикспойнт раньше не использовал - какие его преимущества по сравнению с флоат?

Среда позволяет пользоваться удобным редактором и интегрирована с инструментами программирования и отладки, включая симулятор.
В MPLAB X редактор дает возможность цветового выделения всех компонент исходного текста, имеет разного рода форматирования, ведет хоть и простой, но контроль версий (историю). Ну и дебаг, включая симулятор.
Фикспойнт - это обычный int (uint), но с ПОДРАЗУМЕВАЕМОЙ точкой.
В отличии от флоата разрешение этого типа линейно во всем диапазоне, а точность в пределах диапазона фикспойнта у последнего выше, чем у флоата, уже потому, что разрядность мантиссы всегда меньше общей разрядности (24 против 32, например). Вся арифметика ничем не отличается от целочисленной арифметики.
Флоат, на самом деле, необходим крайне редко. То есть только тогда, когда динамический диапазон переменной составляет сотни децибел.
И речь идет не о точности, а именно об этом диапазоне.
По поводу вложенности call.
Любые инструменты создают под некий спрос. Доступ к указателю стека в PIC12/16 появился совсем недавно, а сам стек очень куцый. Поэтому подобные Вашим извращения с этим стеком никому в голову не приходят. Ну то есть понятно, что это возможно, но тратить на это силы и время нет никакого желания. Для таких решений есть иные платформы.

alex_zas 13.01.2020 17:49

Re: Как рассчитать глубину использования стека?
 
Марк - огромное спасибо за ответы.
Всё толково и понятно.

Марк 13.01.2020 18:02

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242618)
И если выясняется что при работе происходит переполнение стека то нужно перелопачивать не весь объём исходников, а только подпрограммы с максимальным числом в скобках.

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

alex_zas 13.01.2020 20:05

Re: Как рассчитать глубину использования стека?
 
Совершенно верно. Я так и поступил. Заменил один call на макрос в прерываниях и один в основной программе. В итоге - экономия двух уровней из восьми доступных.
Спасибо!

HHIMERA 13.01.2020 20:52

Re: Как рассчитать глубину использования стека?
 
Цитата:

Сообщение от alex_zas (Сообщение 242618)
Когда проектировалось данное изделие ставилась задача - достичь результата с минимальными затратами времени и средств. Поэтому был применён MCU 16-й серии, FLOAT32 и т.д.

У вас неправильное понятие "достичь результата с минимальными затратами времени и средств"... увы... И выбор неправильный... ввиду отсутствия такового...
Цитата:

Не всегда при решении поставленной задачи есть возможность выбора оптимальных средств и методов.
Отсюда и вопросы... и выбор камня... и решения...
Цитата:

С 24-й серией нужно разбираться, это перспектива. Если в будущем будут аналогичные проекты то конечно нужно использовать 24-ю серию.
Призрачная перспектива... но хоть какая-то...

alex_zas 13.01.2020 21:17

Re: Как рассчитать глубину использования стека?
 
Да Вы наверно правы.
Нужно немного исправить фразу:
Когда проектировалось данное изделие ставилась задача - достичь результата с минимальными для меня затратами времени и средств.


Часовой пояс GMT +3, время: 19:28.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot