Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Обязательный префикс функции.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Страницы: 1, 2
zltigo
QUOTE (jcxz @ Aug 10 2016, 13:34) *
char b[100] - это только для примера. Если там будет char b[10] - легче что-ли?

Из личного стиля и опыта - много легче. Одно дело, когда те же задачи имеют типично имеют по несколько переменных да несколько вызовов. Понятно, что стек расходуется немного, пиковых нагрузок нет, ну и выделил с небольшим запасом, на этипе тестирования можно и побольше запас сделать и последить за расходом. Если стеки начнут потреблять память сотнями байт при вызове разных функций в произвольные моменты, то тогда уже начнет маячить нехватка памяти, желание урезать стеки по максимуму и начать бороться с возможными последстиями.
jcxz
Цитата(zltigo @ Aug 10 2016, 18:53) *
Из личного стиля и опыта - много легче. Одно дело, когда те же задачи имеют типично имеют по несколько переменных да несколько вызовов. Понятно, что стек расходуется немного, пиковых нагрузок нет, ну и выделил с небольшим запасом, на этипе тестирования можно и побольше запас сделать и последить за расходом. Если стеки начнут потреблять память сотнями байт при вызове разных функций в произвольные моменты, то тогда уже начнет маячить нехватка памяти, желание урезать стеки по максимуму и начать бороться с возможными последстиями.

Во-во! А у нас в некоторых задачах по нескольку КБ стеки уже. Не в моих задачах - я стараюсь экономить память. Но я не один участвую в проекте.
Это хорошо как Вы пишете распланировать когда ты сам себе хозяин и только один пишешь ПО.
Но как трудно объяснить людям почему нежелательно использовать sprintf() или что, если например внутри switch в одном case на стеке используется временная структура1, а в другом - временная структура2, по неск. десятков байт каждая, то очень желательно их объединить в union. Ну и т.п.
И что ещё - хорошо, например сейчас определили, что в задаче1 вызывается такая-то функция, которая ест много стека. Хорошо - выделили этой задаче побольше. Но потом, когда уже подзабыли немного, что эта функция много ест при определённых условиях, и сделали её вызов из другой задачи2, имеющей мало стека. И писал эту функцию совсем другой человек. И отладили, проверили - всё ок, работает ок. А ведь эта функция много ест стека только при определённых редких условиях и на этапе отладки эта ветка выполнения кода не случилась, а вылезет оно потом много позже и неожиданно.

Вот поэтому и очень желательно иметь такой механизм контроля стека, который можно просто включить, когда возникают хоть малейшие подозрения, когда прога ведёт себя как-то неадекватно и подозрительно. И чтобы не надо было лазить вручную проверяя каждый стек или ставя какие-то watchpoint-ы то на один стек, то на другой - трудоёмко это и трудно будет локализовать место проблемы.
scifi
Цитата(jcxz @ Aug 10 2016, 14:43) *
Хорошо. Но как быть с ОЗУ?

Это ваши проблемы.
Пока я вижу такой настрой: "Вы тут мне предлагайте всякое разное, а я придумаю 1000 и одну причину, почему мне это не подходит".
Хозяин - барин, конечно, но выглядит это всё довольно комично.
jcxz
Цитата(scifi @ Aug 11 2016, 02:06) *
Пока я вижу такой настрой: "Вы тут мне предлагайте всякое разное, а я придумаю 1000 и одну причину, почему мне это не подходит".
Хозяин - барин, конечно, но выглядит это всё довольно комично.

Вообще-то вопрос был конкретный: про вставку пролога в функции в IAR. Ни одного дельного предложения по этому вопросу не было.
И причины я никакие не придумываю: причины все существуют, вот они передо мной, в проектах. Не понимаю - что именно комично? Объём кода большой (около 70 тыс. строк), памяти впритык (почти во всех проектах так), написателей кода - куча, задач - куча. И ПО ведёт себя как-то неадекватно. И что в этом случае делать-то прикажете? При каждой проблеме всё вручную пепрепроверять? Во всех режимах работы и функциях и их комбинациях коих тьма? И делать это после каждого внесения изменений в код каждым разработчиком? И что именно проверять? Как быстро определить где искать проблему???
Для такого тестирования у нас есть полигон, где стоит несколько десятков устройств и работают круглосуточно в реальных режимах работы. И нужно чтобы залить в них ПО и чтобы оно там крутилось долго и когда проявится проблема - вылетело на ловушку, сохранив состояние, по которому можно локализовать проблему.
Вот и хочется для наиболее типичных вариантов проблем (в частности - переполнение стека) сделать какие-то методы быстрой локализации, чтобы в случае поиска проблемы, быстро отсечь эти варианты.

Решение проблемы в тепличных условиях, когда весь код можно за неск. минут проглядеть и весь он свой и известен и куча свободных ресурсов, и проблема проявляется стабильно - мне неинтересна, ибо тут всё очевидно.
AlexandrY
Цитата(jcxz @ Aug 11 2016, 04:58) *
И причины я никакие не придумываю: причины все существуют, вот они передо мной, в проектах...


70 тыс. строк это несложный проект. В такой размер помещается простейшая RTOS и с пару десятков модулей с логикой и аппаратной поддержкой.
Такой проект должен делать один человек.
Переполнение стека это не типичная ошибка.
Косвенных вызовов в таком проекте будет не более десятка. У вас все решения лежат на виду.
Проблема чисто организационная. Либо у вас проблема с выбором платформы и отладочных инструментов.

Про "круглосуточно в реальных режимах работы" тоже можете не плакаться.
У нас в Австралийской пустыне и на Тайване техподдержка через teamwiewer собирает логи и апгрейдит программу.
В Саудовской Аравии специалист спокойно сидел на объекте и JTAG-ом ловил баги.
Китайцы, так те самостоятельно отреверсили наши протоколы, присобачили беспроводные модули и сделали круглосуточное наблюдение через облака.

Не далее как вчера мне пришла ссылка на хорошую статью про выбор платформы - http://www.edn.com/electronics-blogs/embed...ampaignId=29190

Сдается мне у вас скверно выбрана платформа ( ну кроме того, что еще и скверная команда) laughing.gif
jcxz
Цитата(AlexandrY @ Aug 11 2016, 12:30) *
70 тыс. строк это несложный проект. В такой размер помещается простейшая RTOS и с пару десятков модулей с логикой и аппаратной поддержкой.
Такой проект должен делать один человек.
Переполнение стека это не типичная ошибка.
Косвенных вызовов в таком проекте будет не более десятка. У вас все решения лежат на виду.

Ну да-да - рассказывайте сколько у меня косвенных вызовов - Вам конечно виднее. И какая разница - сколько их? Что от этого меняется?
И про простейшую ОС - тоже. В каком-то ином мире Вы живёте видно. У нас ОС занимает менее 13тыс. строк. И это с кучей комментов и портом под ядро.
А в 70тыс.строк я ОС не включал. И эти 70тыс. - это почти без комментов.
И про объём это Вы похоже слабо владеете предметом. Вероятно у Вас ПО состоит из набора откуда-то стянутых чужих кусков. И для Вас писать ПО - слепить эти куски воедино. Так и 700тыс. - не проблема.
У нас же в этих 70тыс.строках нет ни строки чужого кода.

Цитата(AlexandrY @ Aug 11 2016, 12:30) *
У нас в Австралийской пустыне и на Тайване техподдержка через teamwiewer собирает логи и апгрейдит программу.
В Саудовской Аравии специалист спокойно сидел на объекте и JTAG-ом ловил баги.

И что Вы этим хотели сказать??? У нас тоже основное ПО устройства обновляется удалённо через любой доступный канал связи по рабочему протоколу и без всяких тимвьюверов и безопасно. И даже с рестрансляцией через несколько устройств (если целевое устройство не поключено к глобальному каналу связи). И не только основное встроенное ПО можно обновить, но и встроенное ПО любого из входящих в состав устройства связных модулей (ZigBee, RF, GSM, PLC). И тоже безопасно.
Только какое это имеет отношение к вопросу???
Почему не получится отловить JTAG-ом, я тут уже несколько раз объяснил. Если не поняли - извините.

PS: Пустой трёп про китайцев в облаках поскипан.
AlexandrY
Цитата(jcxz @ Aug 11 2016, 11:23) *
Только какое это имеет отношение к вопросу???


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

Ну разве это не диагноз? biggrin.gif

jcxz
Цитата(AlexandrY @ Aug 11 2016, 15:15) *
Видите ли, поскольку вы хотите обсуждать здесь коня в вакууме и при этом утверждаете, что у этого коня очень частые проблемы со стеком, то и получаете ответы по поводу таких же коней.
Сейчас мы знаем кое-что больше о вашем коне.

Я не обсуждаю здесь лошадей, не обсуждаю и проект. Это Вы всё время стараетесь стащить тему во флейм.
Вопрос был конкретный - в заголовке. Или более расширенно - о методах контроля стеков задач в многозадачной среде в общем случае, а не в частных типа: имеем вагон+тележка памяти и можем каждой задаче по мегабайту на стек выделить.
И чтобы это было удобно сделано - при малейшем подозрении на проблему со стеком: включил чекбокс/define, проконтролировал работу девайса в течение длительного времени на нескольких устройствах. И не надо было при каждом подозрении на стек, делать кучу ручной работы (ставить watchpoint-ы, снимать, просматривать стеки задач и т.п.). Я думаю это полезно будет не только в моих проектах.
Недостатки проектов, в которых я участвую, более здесь обсуждать я не намерен. Я их сам прекрасно знаю и чьё-либо мнение здесь на этот счёт меня не интересует.
Если нечем заняться и нечего сказать по существу - лучше пройдите мимо.
ViKo
В Кейловской РТОС можно включить контроль переполнения стека, одной галочкой в настройке. Если случится, вылетаем в os_error, и там можно определить, из какой задачи прилетели.
Kabdim
Может попробовать использовать MPU? Расставить за концами стеков области с запретом на доступ...
Хотя кмк с такими запросами пора переходить на чип толще, с защитой адресного пространства задач. Ну или программистов строить - устроить кодревью репозитория с прошивкой.
AlexandrY
Цитата(Kabdim @ Aug 12 2016, 10:54) *
Может попробовать использовать MPU?


Следует перед этим спросить автора, а есть ли у него MPU.
А то оно ведь опционально. И они к тому же разные бывают.

TC похоже этим еще не интересовался даже.
http://www.freertos.org/FreeRTOS-MPU-memor...ction-unit.html
jcxz
Цитата(Kabdim @ Aug 12 2016, 13:54) *
Может попробовать использовать MPU? Расставить за концами стеков области с запретом на доступ...

Я уже писал про такой вариант. Во-первых: нужно довольно много доп. памяти, а её в обрез; во-вторых: задач около 10 (даже больше), а в MPU регионов всего 8 и большую часть из них я уже использую.

Цитата(Kabdim @ Aug 12 2016, 13:54) *
Хотя кмк с такими запросами пора переходить на чип толще, с защитой адресного пространства задач. Ну или программистов строить - устроить кодревью репозитория с прошивкой.

Это точно! Но не получается у меня так, проще уволиться самому... sm.gif
На следующей работе обязательно для такой задачи буду требовать чип с MMU.

Цитата(ViKo @ Aug 12 2016, 11:25) *
В Кейловской РТОС можно включить контроль переполнения стека, одной галочкой в настройке. Если случится, вылетаем в os_error, и там можно определить, из какой задачи прилетели.

Как это реализовано? Скорей всего - периодический контроль затёртости шаблона в стеке. Именно так сделано в uCOS. Это малоэффективно. Я уже писал почему.

Цитата(AlexandrY @ Aug 12 2016, 14:08) *
TC похоже этим еще не интересовался даже.

Ну-ну продолжайте острить дальше. Память у Вас видно коротка (а не только в моём проекте), так хотя-бы почитайте весь тред.
ViKo
Цитата(jcxz @ Aug 12 2016, 11:48) *
Как это реализовано? Скорей всего - периодический контроль затёртости шаблона в стеке. Именно так сделано в uCOS. Это малоэффективно. Я уже писал почему.

Нет. Там можно другой галкой задавать шаблон (watermark) или не задавать. А проверка все равно работает.
jcxz
Цитата(ViKo @ Aug 12 2016, 15:31) *
Нет. Там можно другой галкой задавать шаблон (watermark) или не задавать. А проверка все равно работает.

хм... странно... А как тогда работает? По какому алгоритму. У меня IAR, Keil-а нет.
scifi
Цитата(jcxz @ Aug 12 2016, 12:45) *
хм... странно... А как тогда работает? По какому алгоритму. У меня IAR, Keil-а нет.

Мануал намекает, что проверка стека производится во время переключения задачи:
Цитата
Enabled Stack Checking slightly decreases the kernel performance because on every task switch the kernel needs to execute additional code for stack checking.
zltigo
QUOTE (scifi @ Aug 12 2016, 12:59) *
Мануал намекает, что проверка стека производится во время переключения задачи:

Тогда это делается очень просто, но больше для галочки, ибо если задача переключается не в момент "преступления", то ей за это ничего не будет sm.gif.
Контроль по маркерам много более инфрмативен, нежели такое.

AlexandrY
Цитата(jcxz @ Aug 12 2016, 11:48) *
Ну-ну продолжайте острить дальше. Память у Вас видно коротка (а не только в моём проекте), так хотя-бы почитайте весь тред.


Ладно, допустим вы даже читали про MPU.

В STM32F4 и STM32F7 оно действительно есть, хоть там дальше все равно идут нюансы с картой памяти, атрибутами доступа её областей и кэшированием свойственные только STM-ам.
А в Kinetis сделанных на том же Cortex-M4 ARM-овского MPU нет, а сделано свое MPU.

Или вот обычная практика для задач выделять стек в динамической памяти (ну для динамических задач), и эта же задача должна иметь доступ ко всей динамической памяти.
Т.е. задача не может взять и изолировать кусок в памяти поскольку должна иметь полное право писать и выше и ниже стека.
И все!
Красивая идея стухла и превратилась в костыль.
jcxz
Цитата(AlexandrY @ Aug 12 2016, 19:36) *
А в Kinetis сделанных на том же Cortex-M4 ARM-овского MPU нет, а сделано свое MPU.

Пока Kinetis и STM не интересуют, интересуют TI и NXP главным образом.

Цитата(AlexandrY @ Aug 12 2016, 19:36) *
Или вот обычная практика для задач выделять стек в динамической памяти (ну для динамических задач), и эта же задача должна иметь доступ ко всей динамической памяти.
Т.е. задача не может взять и изолировать кусок в памяти поскольку должна иметь полное право писать и выше и ниже стека.

В динамической памяти стеки задачам никогда не выделяю, все задачи живут постоянно - нет удаления задач.
При избытке памяти и "изолировать" ничего не мешает - выделить кусок заведомо большего размера, внутри него - выровненный на степени 2 регион1, закрыть его от доступа через MPU, внутри региона1 - регион2 меньшего размера - разрешить его для доступа (с бОльшим приоритетом чем у региона1). Регион2 расположен внутри региона1 так, чтобы между началом региона1 и региона2 и между их концами были некоторые защитные интервалы памяти.
Всё.
Но я уже сказал - облегчённые частные случаи типа: избыток памяти, избыток свободных регионов в MPU и пр. - не рассматриваю.

Цитата(zltigo @ Aug 12 2016, 16:47) *
Тогда это делается очень просто, но больше для галочки,

Это точно.
zltigo
QUOTE (jcxz @ Aug 13 2016, 11:16) *
В динамической памяти стеки задачам никогда не выделяю, все задачи живут постоянно - нет удаления задач.

Между прочим, при динамическом выделении памяти под стек, каждый блок памяти имеет MCB, разрушение которого тоже является диагностическими признаком. Просмотр блоков памяти возможен в любой момент и для любого варианта сборки не надо иметь соответствующий ему MAP файл.

Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.