|
|
  |
Обязательный префикс функции. |
|
|
|
Aug 3 2016, 08:58
|
Местный
  
Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551

|
QUOTE (jcxz @ Aug 3 2016, 11:47)  Т.е. - чтобы после входа в каждую функцию в проекте, после PUSH, он вставлял некий фиксированный код (hook). Возможно это несколько ассемблерных строк или просто вызов функции BL (естественно с предварительным сохранением исходного LR на стеке). Видел такую возможность у какого-то компилятора, не помню точно, но вроде у CCS. В яре такого вроде не было, лично я так и не нашел. Такое точно есть в гцц. Совсем недавно натыкался на бложик с описанием такого механизма. Там его применяли для построения стека вызовов
|
|
|
|
|
Aug 3 2016, 10:47
|

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

|
Цитата(jcxz @ Aug 3 2016, 13:23)  Забитие шаблоном - не лучший метод. Так как стек успеет переполниться, ПО повиснет, а я об этом так и не узнаю. Не говоря уже о ненулевой вероятности совпадения записываемых данных с шаблоном. Был бы в Cortex-M более функциональный MPU, сделал бы на нём. А так: или префикс в начало каждой функции или периодическая проверка в ISR высокочастотного таймера. Других способов не вижу пока. J-Link Pro в IAR показывает полную пирамиду вызовы в реальном времени в окне timeline. И весь перечень вызовов в любой точке останова в окне Call Stack. Если применить MQX то будет отображаться стек вызовов для каждой задачи отдельно. Также будет виден максимальный расход стека для каждой задачи. Также покажет автоматически все повреждения служебных структур RTOS. Покажет и переполнение менеджера памяти и фрагментацию памяти.
|
|
|
|
|
Aug 3 2016, 11:11
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(AlexandrY @ Aug 3 2016, 16:47)  J-Link Pro в IAR показывает полную пирамиду вызовы в реальном времени в окне timeline. И весь перечень вызовов в любой точке останова в окне Call Stack. И что это даст? Мне нужно максимальное использование стека. По всем задачам. Цитата(AlexandrY @ Aug 3 2016, 16:47)  Если применить MQX то будет отображаться стек вызовов для каждой задачи отдельно. Также будет виден максимальный расход стека для каждой задачи. У меня не MQX. И как интересно MQX это вычисляет? Периодически анализируя затёртость шаблона в отдельной сервисной задаче? Плохо, так как это никак не спасает при переполнении стека. Я прекрасно понимаю, что заполняя стек шаблоном, можно с большой долей вероятности оценить глубину использования стека. И собственно так сейчас и делаю. Но это работает, только если нет случаев переполнения стека! Цитата(scifi @ Aug 3 2016, 16:44)  В ассемблерном листинге заменить все BL на запрещённый опкод (уж это, наверное, можно автоматизировать). Далее обрабатывать исключение на invalid opcode. Ну да. А ещё BLX. А ещё и все B проанализировать, так как они тоже могут являться вызовами функций (если такой вызов находится в конце другой функции). Да и что потом с этим листингом делать? Как из него прошивку получить? Заменять тогда уж надо не BL, а все PUSH и SUB SP,#...
|
|
|
|
|
Aug 3 2016, 13:16
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
да простят меня ....  переобразовать return в Return по тексту проекта или тамгденадо Код #define RET_SWITCH
#ifndef RET_SWITCH #define Return return #else #define Return SavePC(); SaveStack; \ return(1); \ #endif С аргументом для ret надо вывернуться и для void f() всеравно писать return.
Сообщение отредактировал k155la3 - Aug 3 2016, 13:18
|
|
|
|
|
Aug 3 2016, 13:36
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(ig_z @ Aug 3 2016, 11:58)  Такое точно есть в гцц. Да. Это опция компилятора/линкера -pgМожно почитать про mcount и profile hook. Наверняка какой то профайлер и для яра имеется.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Aug 3 2016, 15:20
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(k155la3 @ Aug 3 2016, 19:16)  да простят меня ....  переобразовать return в Return по тексту проекта или тамгденадо Ну да: void func1() { func2(); } void func2() { func3(); } void func3() { func4(); } ... А теперь представьте, что переполнение стека произошло ещё в func1(). До func4() (где Вашим способом это можно будет обнаружить) дело уже может и не дойти, так как к этому времени перепахает полпамяти. Да и очень желательно всё-же оставаться в синтаксисе языка си, который не обязывает ставить return в таких функциях. К тому же: не все функции, которые будут в результирующем коде, присутствуют в исходниках (оптимизатор тоже может сам генерить функции). Я уже не говорю, что "вывернуться с аргументом для ret" получится далеко не для всех аргументов. И вообще - надо чтобы си-исходник оставался обычным читаемым си-исходником, а не некоей тарабарщиной на непонятном языке. PS: Вобщем, похоже, что вариант с высокочастотным таймером - безальтернативен для IAR...  Цитата(demiurg_spb @ Aug 3 2016, 19:36)  Наверняка какой то профайлер и для яра имеется. Вот потому и спрашиваю. Прошерстил мануал IAR-а - не нашёл подходящего. Может плохо искал.....
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|