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

|
Цитата(AlexandrY @ Aug 3 2016, 22:11)  А идея про вставку хуков довольно наивна. В либы все равно хуки не вставить. Терпимо: у меня в проектах нигде нет либ. Всё только в исходниках. Цитата(AlexandrY @ Aug 3 2016, 22:11)  Да и будет повод для появления ошибок Гейзенберга. Это кто такой? Я его знаю? Ну тогда и не будем его брать в команду раз он ошибки делает
|
|
|
|
|
Aug 4 2016, 02:58
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AlexandrY @ Aug 4 2016, 01:46)  Т.е. ни printf, ни sprintf, ни какой-нить там strcpy или memcpy ?  Не поверите, но sprintf() не использую нигде в embedded (в IAR и CCS по-крайней мере). В IAR-проектах вместо неё использую _Printf() - она удобнее. И вызываю её чаще всего с переключением на отдельный стек (только ейный) защищённый семафором. Так как sprintf()-подобные функции отъедают много стека, а у меня в большинстве проектов памяти мало - приходится экономить и сериализировать выполнение _Printf(). Хотя согласен - завтра может понадобится и её напрямую вызывать из задач без переключения стека. Но с _Printf() чуть проще - ей в качестве методов вывода передаются указатели на мои собственные функции (putchar()-подобные), которые должны вызываться, я думаю, на самой глубине использования стека. Если между входом в _Printf() и входом в мой метод putchar() стек не успеет переполнится, то уже внутри моего putchar() SP зафиксируется. memcpy() конечно использую, но у неё не очень большая глубина использования стека - массивов на стеке она по-крайней мере не выделяет. PS: В принципе, я думаю, если есть возможность включить такие префиксы, то возможно перекомпилять стандартную библиотеку с этим ключом и будут они и в библиотечных функциях.
|
|
|
|
|
Aug 4 2016, 06:59
|

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

|
Цитата(jcxz @ Aug 4 2016, 09:29)  По этому слову в доке IAR тоже ничего не находится....  Специально залез в доку IAR посмотреть наличие проблемы, потому как немыслимо чтобы IAR не выделял внимания контролю стека. Ну и точно, там море возможностей прецизионно контролировать стек. Читайте EWARM_DevelopmentGuide.ENU.pdf со страницы 92 Цитата(jcxz @ Aug 4 2016, 05:58)  Не поверите, но sprintf() не использую нигде в embedded (в IAR и CCS по-крайней мере). В IAR-проектах вместо неё использую _Printf() - она удобнее. Почему же, верю. В моих проектах можно найти по 3-4 отдельных автономных реализаций sprintf. Ибо каждая RTOS, каждый пакет претендующий на мультиплатформенность содержит файлы с переписанными стандартными библиотеками C-и. Это не удобство, а трагедия, поскольку возникает еще один повод для путаницы.
|
|
|
|
|
Aug 4 2016, 08:23
|
Гуру
     
Группа: Свой
Сообщений: 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, когда проект привязан даже не только к ядру, но и более сильно - периферии.
|
|
|
|
|
Aug 4 2016, 08:40
|

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

|
Цитата(jcxz @ Aug 4 2016, 11:23)  Не сочтите за труд указать название главы?
Я не гонюсь за мультиплатформенностью. Она малополезна в embedded, когда проект привязан даже не только к ядру, но и более сильно - периферии. "Stack usage analysis" А кто гонится? Все мы работаем одинаково. Поэтому я и знаю где реальная проблема обсуждается, а где надуманная или несущественная. Открытые проекты с исходниками все поголовно мультиплатформенные, это не нам решать, это их природа такая, иначе они не выживают. Мы их берем и затачиваем. А если не можем заточить, то юзаем GCC и говорим что это круто.
|
|
|
|
|
Aug 4 2016, 10:11
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Aug 4 2016, 12:38
|

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

|
Цитата(jcxz @ Aug 4 2016, 13:11)  Не подходит. Толку от него мало. В коде куча косвенных вызовов функций.
Так как не я один пишу этот код, а есть товарищи, любящие всякие классы с виртуальными член-функциями и пихающие их куда нужно и не нужно. А заставить их делать это для своего кода - нереально. Да и малоэффективно. Не куча, а где нибудь в районе сотни. IAR все косвенные вызовы аккуратно показывает в Call graph-е. Если у вас есть к тому же товарищи, то раздать им по десятку таких вызовов и вы за день сделаете управляющий файл для анализатора вызовов. По любому косвенные вызовы надо знать в лицо, как самые граблеопасные места. Про эффективность не понял. Анализатор вызовов абсолютно точно считает стек. И если стоит задача урезать максимально стек лучшего способа не существует.
|
|
|
|
|
Aug 5 2016, 08:28
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AlexandrY @ Aug 4 2016, 18:38)  Если у вас есть к тому же товарищи, то раздать им по десятку таких вызовов и вы за день сделаете управляющий файл для анализатора вызовов. По любому косвенные вызовы надо знать в лицо, как самые граблеопасные места. Это Вы так считаете. И я. А товарищам объяснить невозможно - они всё равно делают как делали и не хотят ни в чём разбираться. А ПО потом глючить начинает совсем в другом месте, не там где набыдлокодили. Цитата(AlexandrY @ Aug 4 2016, 18:38)  Про эффективность не понял. Неэффективно, так как требует постоянного контроля кода, заполнения чего-то там при каждом изменении/добавлении/убирании этих самых функций. Да и ещё и правильного заполнения. 100% что забудут добавить или неправильно добавят или.... и всё насмарку - опять ищи почему глючит. Механизм контроля должен быть внешний, не требующий постояных трудозатрат на его поддержание и чтобы его один раз реализовал и забыл. И только включать быстро (одним дефайном или ещё чем) когда надо и отключать когда не надо. А иначе проще тогда уж по-старинке: залить стеки шаблоном и глазами проконтролировать затёртость шаблона.
|
|
|
|
|
Aug 5 2016, 10:52
|

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

|
Цитата(jcxz @ Aug 5 2016, 11:28)  Неэффективно, так как требует постоянного контроля кода, заполнения чего-то там ... Т.е. хотите забабахать статистический движок как в линуксах? И стека не жалко, и ресурсов процессорного времени и риалтайма? Я думаю если даже Segger этого не сделал, то это никому и не надо. Старых добрых методов хватает. Да и статистика дело тонкое. Не скажете же заказчику после того как все рухнуло, что вероятность переполнения стека была всего то 0.1% с уровнем доверия 95% при эмпирической гипотезе о распределении.
|
|
|
|
|
Aug 8 2016, 11:24
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AlexandrY @ Aug 5 2016, 16:52)  Т.е. хотите забабахать статистический движок как в линуксах? И стека не жалко, и ресурсов процессорного времени и риалтайма? Причём тут какой-то движок? Причём тут заказчик??? Речь идёт об отладке ПО и средствах отладки. Идея простейшая: при каждом изменении SP (в си - после входа в функцию и выделения стекового фрейма), проверять SP на допустимость (нахождение в некотором диапазоне адресов). Переменные, хранящие контролируемый диапазон, обновлять при каждом переключении задач (в соответствующем хуке ОС). Это если бы была возможность написать свой пролог функции. Если нет, другой способ: так же контролировать SP на нахождение в диапазоне только периодически, как можно чаще, в высокочастотном таймерном прерывании. Дополнительного стека для этого не нужно. Процессорное время конечно нужно, но этот контроль нужно включать только тогда когда нужно - при отладке, при возникновении подозрения на переполнение стека, при каком-то непонятном поведении ПО, чтобы отбросить вариант переполнения стека. Когда проверять не нужно - просто комментируем соответствующий #define и всё. У меня сейчас так же уже реализована проверка на максимальную длительность запрета прерываний в ПО: запускается ВЧ прерывание и контролируются интервалы времени между прерываниями. Работает отлично - уже не одно место нашёл, где коллеги кривыми ручками надолго запрещали прерывания, нарушая тем самым работу драйверов периферии. Можно конечно по-старинке: просматривать затёртость шаблона заполнения стека. Но это менее удобно и самое главное - высока вероятность пропуска некоторых случаев переполнения стека. Идеально было-бы если бы процессорное ядро имело средства контроля выхода SP за некий диапазон - генерило какое-либо исключение в таком случае. Но разработчики ядра не позаботились об этом, жаль...
|
|
|
|
|
Aug 8 2016, 12:47
|

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

|
Цитата(jcxz @ Aug 8 2016, 14:24)  Идея простейшая: при каждом изменении SP (в си - после входа в функцию и выделения стекового фрейма), проверять SP на допустимость Этот пункт вроде проехали. Это делать нет смысла. Статический анализатор по сравнению с этим гораздо легче настроить. Если, конечно, не брать в расчет неких демонов-товарищей, целенаправленно мешающих настроить анализатор. Цитата(jcxz @ Aug 8 2016, 14:24)  другой способ: так же контролировать SP на нахождение в диапазоне только периодически А это сделано под линуксом, и это именно движок и именно статистический со своим набором переменных, каналом связи и проч. и расходом стека естественно. А про контроль времени выполнения прерываний и их блокировки я уже говорил. J-Link с точностью до такта логирует все! без исключения события прерываний и ведет их статистику (мин. макс. интервалы, длительности и проч. ) Здесь ничего "реализовывать" не требуется.
|
|
|
|
|
Aug 9 2016, 10:55
|
Гуру
     
Группа: Свой
Сообщений: 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 с точностью до такта логирует все! без исключения события прерываний и ведет их статистику (мин. макс. интервалы, длительности и проч. ) Как этим пользоваться? А если длинный запрет прерывания происходит только иногда, достаточно редко, при совпадении неких условий? Просматривать полотенца логов и искать?
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|