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

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> Обязательный префикс функции.
jcxz
сообщение Aug 3 2016, 18:14
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 3 2016, 22:11) *
А идея про вставку хуков довольно наивна. В либы все равно хуки не вставить.

Терпимо: у меня в проектах нигде нет либ. Всё только в исходниках.

Цитата(AlexandrY @ Aug 3 2016, 22:11) *
Да и будет повод для появления ошибок Гейзенберга.

Это кто такой? Я его знаю?
Ну тогда и не будем его брать в команду раз он ошибки делает wink.gif
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 3 2016, 19:46
Сообщение #17


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 3 2016, 21:14) *
Терпимо: у меня в проектах нигде нет либ. Всё только в исходниках.


Т.е. ни printf, ни sprintf, ни какой-нить там strcpy или memcpy ? biggrin.gif

Цитата(demiurg_spb @ Aug 3 2016, 20:01) *
Сделаю вид, что не заметил вашего комментария.


Жаль, а я был уже готов мериться не по детски. laughing.gif

Цитата(jcxz @ Aug 3 2016, 21:14) *
Это кто такой? Я его знаю?


Гейзенбаг
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 4 2016, 02:58
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 4 2016, 01:46) *
Т.е. ни printf, ни sprintf, ни какой-нить там strcpy или memcpy ? biggrin.gif

Не поверите, но sprintf() не использую нигде в embedded (в IAR и CCS по-крайней мере). В IAR-проектах вместо неё использую _Printf() - она удобнее.
И вызываю её чаще всего с переключением на отдельный стек (только ейный) защищённый семафором. Так как sprintf()-подобные функции отъедают много стека, а у меня в большинстве проектов памяти мало - приходится экономить и сериализировать выполнение _Printf().
Хотя согласен - завтра может понадобится и её напрямую вызывать из задач без переключения стека. Но с _Printf() чуть проще - ей в качестве методов вывода передаются указатели на мои собственные функции (putchar()-подобные), которые должны вызываться, я думаю, на самой глубине использования стека. Если между входом в _Printf() и входом в мой метод putchar() стек не успеет переполнится, то уже внутри моего putchar() SP зафиксируется.
memcpy() конечно использую, но у неё не очень большая глубина использования стека - массивов на стеке она по-крайней мере не выделяет.

PS: В принципе, я думаю, если есть возможность включить такие префиксы, то возможно перекомпилять стандартную библиотеку с этим ключом и будут они и в библиотечных функциях.
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 4 2016, 05:37
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Вроде бы всю жизнь это называлось "пролог".
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 4 2016, 06:29
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Aug 4 2016, 11:37) *
Вроде бы всю жизнь это называлось "пролог".

По этому слову в доке IAR тоже ничего не находится.... sad.gif
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 4 2016, 06:59
Сообщение #21


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 4 2016, 09:29) *
По этому слову в доке IAR тоже ничего не находится.... sad.gif


Специально залез в доку IAR посмотреть наличие проблемы, потому как немыслимо чтобы IAR не выделял внимания контролю стека.
Ну и точно, там море возможностей прецизионно контролировать стек.
Читайте EWARM_DevelopmentGuide.ENU.pdf со страницы 92

Цитата(jcxz @ Aug 4 2016, 05:58) *
Не поверите, но sprintf() не использую нигде в embedded (в IAR и CCS по-крайней мере). В IAR-проектах вместо неё использую _Printf() - она удобнее.


Почему же, верю.
В моих проектах можно найти по 3-4 отдельных автономных реализаций sprintf.
Ибо каждая RTOS, каждый пакет претендующий на мультиплатформенность содержит файлы с переписанными стандартными библиотеками C-и.
Это не удобство, а трагедия, поскольку возникает еще один повод для путаницы.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 4 2016, 08:23
Сообщение #22


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 4 2016, 12:59) *
Специально залез в доку IAR посмотреть наличие проблемы, потому как немыслимо чтобы IAR не выделял внимания контролю стека.
Ну и точно, там море возможностей прецизионно контролировать стек.
Читайте EWARM_DevelopmentGuide.ENU.pdf со страницы 92

Именно эту доку я и изучал. На этой странице у меня "CHOOSING A LINKER CONFIGURATION FILE" и др. мало относящиеся к контролю стека главы.
Не сочтите за труд указать название главы?

Цитата(AlexandrY @ Aug 4 2016, 12:59) *
Ибо каждая RTOS, каждый пакет претендующий на мультиплатформенность содержит файлы с переписанными стандартными библиотеками C-и.
Это не удобство, а трагедия, поскольку возникает еще один повод для путаницы.

Я не гонюсь за мультиплатформенностью. Она малополезна в embedded, когда проект привязан даже не только к ядру, но и более сильно - периферии.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 4 2016, 08:40
Сообщение #23


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 4 2016, 11:23) *
Не сочтите за труд указать название главы?

Я не гонюсь за мультиплатформенностью. Она малополезна в embedded, когда проект привязан даже не только к ядру, но и более сильно - периферии.


"Stack usage analysis"

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

Открытые проекты с исходниками все поголовно мультиплатформенные, это не нам решать, это их природа такая, иначе они не выживают.
Мы их берем и затачиваем.
А если не можем заточить, то юзаем GCC и говорим что это круто. biggrin.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 4 2016, 10:11
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 4 2016, 14:40) *
"Stack usage analysis"

Не подходит. Толку от него мало. В коде куча косвенных вызовов функций.
И это не подходит: but if there are indirect calls (calls using function pointers) in your application, you must supply a list of possible functions that can be called from each calling function.
Так как не я один пишу этот код, а есть товарищи, любящие всякие классы с виртуальными член-функциями и пихающие их куда нужно и не нужно. А заставить их делать это для своего кода - нереально. Да и малоэффективно.
Да и опять-же - в случае использования чужого кода (всяких стеков и либ), что делать? Шерстить весь этот код для supply a list of possible functions???
Нужен именно run-time контроль, а не build-time.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 4 2016, 12:38
Сообщение #25


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 4 2016, 13:11) *
Не подходит. Толку от него мало. В коде куча косвенных вызовов функций.

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


Не куча, а где нибудь в районе сотни.
IAR все косвенные вызовы аккуратно показывает в Call graph-е.

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

Про эффективность не понял. Анализатор вызовов абсолютно точно считает стек.
И если стоит задача урезать максимально стек лучшего способа не существует.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 5 2016, 08:28
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 4 2016, 18:38) *
Если у вас есть к тому же товарищи, то раздать им по десятку таких вызовов и вы за день сделаете управляющий файл для анализатора вызовов.
По любому косвенные вызовы надо знать в лицо, как самые граблеопасные места.

Это Вы так считаете. И я. А товарищам объяснить невозможно - они всё равно делают как делали и не хотят ни в чём разбираться. А ПО потом глючить начинает совсем в другом месте, не там где набыдлокодили.

Цитата(AlexandrY @ Aug 4 2016, 18:38) *
Про эффективность не понял.

Неэффективно, так как требует постоянного контроля кода, заполнения чего-то там при каждом изменении/добавлении/убирании этих самых функций. Да и ещё и правильного заполнения. 100% что забудут добавить или неправильно добавят или.... и всё насмарку - опять ищи почему глючит.
Механизм контроля должен быть внешний, не требующий постояных трудозатрат на его поддержание и чтобы его один раз реализовал и забыл. И только включать быстро (одним дефайном или ещё чем) когда надо и отключать когда не надо.
А иначе проще тогда уж по-старинке: залить стеки шаблоном и глазами проконтролировать затёртость шаблона.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 5 2016, 10:52
Сообщение #27


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 5 2016, 11:28) *
Неэффективно, так как требует постоянного контроля кода, заполнения чего-то там ...


Т.е. хотите забабахать статистический движок как в линуксах?
И стека не жалко, и ресурсов процессорного времени и риалтайма?

Я думаю если даже Segger этого не сделал, то это никому и не надо.
Старых добрых методов хватает.

Да и статистика дело тонкое.
Не скажете же заказчику после того как все рухнуло, что вероятность переполнения стека была всего то 0.1% с уровнем доверия 95% при эмпирической гипотезе о распределении.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 8 2016, 11:24
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 5 2016, 16:52) *
Т.е. хотите забабахать статистический движок как в линуксах?
И стека не жалко, и ресурсов процессорного времени и риалтайма?

Причём тут какой-то движок? Причём тут заказчик??? Речь идёт об отладке ПО и средствах отладки.
Идея простейшая: при каждом изменении SP (в си - после входа в функцию и выделения стекового фрейма), проверять SP на допустимость (нахождение в некотором диапазоне адресов). Переменные, хранящие контролируемый диапазон, обновлять при каждом переключении задач (в соответствующем хуке ОС).
Это если бы была возможность написать свой пролог функции.
Если нет, другой способ: так же контролировать SP на нахождение в диапазоне только периодически, как можно чаще, в высокочастотном таймерном прерывании.

Дополнительного стека для этого не нужно. Процессорное время конечно нужно, но этот контроль нужно включать только тогда когда нужно - при отладке, при возникновении подозрения на переполнение стека, при каком-то непонятном поведении ПО, чтобы отбросить вариант переполнения стека.
Когда проверять не нужно - просто комментируем соответствующий #define и всё. У меня сейчас так же уже реализована проверка на максимальную длительность запрета прерываний в ПО: запускается ВЧ прерывание и контролируются интервалы времени между прерываниями. Работает отлично - уже не одно место нашёл, где коллеги кривыми ручками надолго запрещали прерывания, нарушая тем самым работу драйверов периферии.
Можно конечно по-старинке: просматривать затёртость шаблона заполнения стека. Но это менее удобно и самое главное - высока вероятность пропуска некоторых случаев переполнения стека.

Идеально было-бы если бы процессорное ядро имело средства контроля выхода SP за некий диапазон - генерило какое-либо исключение в таком случае. Но разработчики ядра не позаботились об этом, жаль...
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 8 2016, 12:47
Сообщение #29


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 8 2016, 14:24) *
Идея простейшая: при каждом изменении SP (в си - после входа в функцию и выделения стекового фрейма), проверять SP на допустимость


Этот пункт вроде проехали. Это делать нет смысла. Статический анализатор по сравнению с этим гораздо легче настроить.
Если, конечно, не брать в расчет неких демонов-товарищей, целенаправленно мешающих настроить анализатор. biggrin.gif

Цитата(jcxz @ Aug 8 2016, 14:24) *
другой способ: так же контролировать SP на нахождение в диапазоне только периодически


А это сделано под линуксом, и это именно движок и именно статистический со своим набором переменных, каналом связи и проч. и расходом стека естественно.

А про контроль времени выполнения прерываний и их блокировки я уже говорил.
J-Link с точностью до такта логирует все! без исключения события прерываний и ведет их статистику (мин. макс. интервалы, длительности и проч. )
Здесь ничего "реализовывать" не требуется.


Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 9 2016, 10:55
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 8 2016, 18:47) *
Этот пункт вроде проехали. Это делать нет смысла. Статический анализатор по сравнению с этим гораздо легче настроить.

Что такое "Статический анализатор" и как его настроить?

Цитата(AlexandrY @ Aug 8 2016, 18:47) *
А это сделано под линуксом, и это именно движок и именно статистический со своим набором переменных, каналом связи и проч. и расходом стека естественно.

Вопрос не про линух.

Цитата(AlexandrY @ Aug 8 2016, 18:47) *
А про контроль времени выполнения прерываний и их блокировки я уже говорил.
J-Link с точностью до такта логирует все! без исключения события прерываний и ведет их статистику (мин. макс. интервалы, длительности и проч. )

Как этим пользоваться? А если длинный запрет прерывания происходит только иногда, достаточно редко, при совпадении неких условий? Просматривать полотенца логов и искать?
Go to the top of the page
 
+Quote Post

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

 


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


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