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

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


Гуру
******

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



Интересно - есть-ли у IAR возможность вставки префикса в начало каждой функции при компиляции?
Т.е. - чтобы после входа в каждую функцию в проекте, после PUSH, он вставлял некий фиксированный код (hook). Возможно это несколько ассемблерных строк или просто вызов функции BL (естественно с предварительным сохранением исходного LR на стеке). Видел такую возможность у какого-то компилятора, не помню точно, но вроде у CCS.
Думаю добавить в проект функционал контроля стеков задач. И думаю как это удобнее всего сделать. С помощью такого хука это можно было-бы реализовать.
Go to the top of the page
 
+Quote Post
ig_z
сообщение Aug 3 2016, 08:58
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 437
Регистрация: 27-08-04
Пользователь №: 551



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

В яре такого вроде не было, лично я так и не нашел. Такое точно есть в гцц. Совсем недавно натыкался на бложик с описанием такого механизма. Там его применяли для построения стека вызовов
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 3 2016, 09:08
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(jcxz @ Aug 3 2016, 11:47) *
Думаю добавить в проект функционал контроля стеков задач. И думаю как это удобнее всего сделать. С помощью такого хука это можно было-бы реализовать.

А в idle задаче не хотите делать такую проверку?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 3 2016, 10:05
Сообщение #4


Гуру
******

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



Цитата(ViKo @ Aug 3 2016, 15:08) *
А в idle задаче не хотите делать такую проверку?

Во-первых: в idle-задаче у меня выполняется WFE.
Во-вторых (и главное): в idle-задаче управление находится когда все задачи находятся в ожидании семафора, майлбокса, ... или просто выполняя sleep(N-секунд). Т.е. - когда ничем не заняты. А наибольшее использование стека происходит как раз когда задача что-то делает.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 3 2016, 10:08
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Да, вроде, ни первое ни второе не помеха хорошему танцору. Забейте стек шаблоном и проверяйте его. А как закончите проверку, сразу в спячку.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 3 2016, 10:23
Сообщение #6


Гуру
******

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



Цитата(ViKo @ Aug 3 2016, 16:08) *
Да, вроде, ни первое ни второе не помеха хорошему танцору. Забейте стек шаблоном и проверяйте его. А как закончите проверку, сразу в спячку.

Забитие шаблоном - не лучший метод. Так как стек успеет переполниться, ПО повиснет, а я об этом так и не узнаю. Не говоря уже о ненулевой вероятности совпадения записываемых данных с шаблоном.
Был бы в Cortex-M более функциональный MPU, сделал бы на нём.
А так: или префикс в начало каждой функции или периодическая проверка в ISR высокочастотного таймера. Других способов не вижу пока.
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 3 2016, 10:44
Сообщение #7


Гуру
******

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



Цитата(jcxz @ Aug 3 2016, 13:23) *
Других способов не вижу пока.

В ассемблерном листинге заменить все BL на запрещённый опкод (уж это, наверное, можно автоматизировать). Далее обрабатывать исключение на invalid opcode.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 3 2016, 10:47
Сообщение #8


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.
Покажет и переполнение менеджера памяти и фрагментацию памяти.


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


Гуру
******

Группа: Свой
Сообщений: 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,#...
Go to the top of the page
 
+Quote Post
k155la3
сообщение Aug 3 2016, 13:16
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



да простят меня .... sm.gif
переобразовать 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
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 3 2016, 13:36
Сообщение #11


неотягощённый злом
******

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



Цитата(ig_z @ Aug 3 2016, 11:58) *
Такое точно есть в гцц.
Да. Это опция компилятора/линкера -pg
Можно почитать про mcount и profile hook.
Наверняка какой то профайлер и для яра имеется.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 3 2016, 15:20
Сообщение #12


Гуру
******

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



Цитата(k155la3 @ Aug 3 2016, 19:16) *
да простят меня .... sm.gif
переобразовать return в Return по тексту проекта или тамгденадо

Ну да:
void func1() { func2(); }
void func2() { func3(); }
void func3() { func4(); }
...
А теперь представьте, что переполнение стека произошло ещё в func1(). До func4() (где Вашим способом это можно будет обнаружить) дело уже может и не дойти, так как к этому времени перепахает полпамяти.
Да и очень желательно всё-же оставаться в синтаксисе языка си, который не обязывает ставить return в таких функциях.
К тому же: не все функции, которые будут в результирующем коде, присутствуют в исходниках (оптимизатор тоже может сам генерить функции).
Я уже не говорю, что "вывернуться с аргументом для ret" получится далеко не для всех аргументов.
И вообще - надо чтобы си-исходник оставался обычным читаемым си-исходником, а не некоей тарабарщиной на непонятном языке.

PS: Вобщем, похоже, что вариант с высокочастотным таймером - безальтернативен для IAR... 05.gif

Цитата(demiurg_spb @ Aug 3 2016, 19:36) *
Наверняка какой то профайлер и для яра имеется.

Вот потому и спрашиваю. Прошерстил мануал IAR-а - не нашёл подходящего. Может плохо искал.....
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 3 2016, 16:00
Сообщение #13


неотягощённый злом
******

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



Цитата(jcxz @ Aug 3 2016, 18:20) *
Прошерстил мануал IAR-а - не нашёл подходящего. Может плохо искал.....
Вот и повод перейти на gcc)))
Я уже давным давно на gcc подсел - ни разу не пожалел.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 3 2016, 16:11
Сообщение #14


Ally
******

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



Цитата(demiurg_spb @ Aug 3 2016, 19:00) *
Вот и повод перейти на gcc)))
Я уже давным давно на gcc подсел - ни разу не пожалел.


Ну и как минимум теперь тратите вдвое больше времени на отладку.

А идея про вставку хуков довольно наивна. В либы все равно хуки не вставить.
Да и будет повод для появления ошибок Гейзенберга.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 3 2016, 17:01
Сообщение #15


неотягощённый злом
******

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



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


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


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