Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAR оптимизация
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
pokk
Добрый день подскажите как выключить оптимизацию для куска кода внутри функции ?

Дело в том что надо определить точное выполнение кода при максимальной оптимизации использую
Код
    SCB_DEMCR |= 0x01000000;
    DWT_CONTROL|= 1; // enable the counter
    DWT_CYCCNT  = 0;

и потом считываю DWT_CYCCNT, но проблема в том что при максимальной оптимизации, программа пролетает breakpoint, который я установил
и не понятно какой кусок кода выполнился.

Так вот как установить NOP, что бы при максимальной оптимизации он остался, и на него можно было повесить breakpoint ?
0men
Цитата(pokk @ Jul 11 2017, 12:12) *
Добрый день подскажите как выключить оптимизацию для куска кода внутри функции ?


копните в направлении #pragma optimize
pokk
Да это я уже нашёл, но как я понял она только в функциям применяется, а если чтение DWT_CYCCNT запихать в функцию то фиг поймешь сколько он тактов на вход функцию будет тратить и будит ли вообще.

Да и я смотрю что компилятор любитель, местами менять операции. Это бы тоже хотелось избежать при чтении DWT_CYCCNT
0men
Цитата(pokk @ Jul 11 2017, 13:03) *
Да это я уже нашёл, но как я понял она только в функциям применяется, а если чтение DWT_CYCCNT запихать в функцию то фиг поймешь сколько он тактов на вход функцию будет тратить и будит ли вообще.

Да и я смотрю что компилятор любитель, местами менять операции. Это бы тоже хотелось избежать при чтении DWT_CYCCNT


Сколько тратит на вход в функцию это можно в ассемблере посмотреть. Менять местами - посмотрите pragma inline
scifi
Цитата(pokk @ Jul 11 2017, 12:12) *
и потом считываю DWT_CYCCNT, но проблема в том что при максимальной оптимизации, программа пролетает breakpoint, который я установил

Найти в дизассемблере нужную операцию и поставить точку останова там.

Цитата(pokk @ Jul 11 2017, 13:03) *
Да и я смотрю что компилятор любитель, местами менять операции. Это бы тоже хотелось избежать при чтении DWT_CYCCNT

Компилятор не будет менять порядок операций с переменными volatile. Можете спать спокойно.
SSerge
Цитата(pokk @ Jul 11 2017, 16:12) *
Так вот как установить NOP, что бы при максимальной оптимизации он остался, и на него можно было повесить breakpoint ?

#include <intrinsics.h>
__no_operation();
или
__NOP();
pokk
Цитата(0men @ Jul 11 2017, 13:06) *
Менять местами - посмотрите pragma inline

Хорошо гляну, а оно разве не просто выворачивание функции?
Цитата(scifi @ Jul 11 2017, 13:08) *
Найти в дизассемблере нужную операцию и поставить точку останова там.

Дело в том что я там всем почти функциям наставил static+ inline, что бы компилятор выворачивал их.
так вот после этого в дизассемблере, комментарии сишного когда начинают пропадать. Точнее они есть, но целиком кусок комментарий функции на си, а потом кусок ассемблерного когда, и там становиться логику сложновато понять.
Цитата(SSerge @ Jul 11 2017, 15:00) *
#include <intrinsics.h>
__no_operation();
или
__NOP();

Это тоже самое что asm("nop"); ?
Я думал при высокой оптимизации он их выкинет совсем, но сегодня вечером увидел что он их только передвинул.

scifi
Цитата(pokk @ Jul 11 2017, 17:03) *
Дело в том что я там всем почти функциям наставил static+ inline, что бы компилятор выворачивал их.

Такое ощущение, что помешались на оптимизации, и теперь пожинаете грабли в отладке. Оптимизация ради оптимизации - зло. Более того, если прошивка отлажена и работает без оптимизации, то пусть так и остаётся. Да, при повышении уровня оптимизации могут вылезти новые ошибки, которые лучше бы исправить, но это уже производная второго порядка.
Kabdim
А после этого оптимизировать понадобилось, да вот в прошивке UB на UB и UB погоняет. А ловить их только огромной кровью, когда неизвестно в каком комите они появились. Не понимаю я людей которые в процессе разработки не тестируют работоспособность при максимальной оптимизации.
scifi
Цитата(Kabdim @ Jul 11 2017, 18:39) *
А после этого оптимизировать понадобилось, да вот в прошивке UB на UB и UB погоняет. А ловить их только огромной кровью, когда неизвестно в каком комите они появились. Не понимаю я людей которые в процессе разработки не тестируют работоспособность при максимальной оптимизации.

1) А вот не надо лепить UB.
2) Очевидно, ТС со столь высокими материями не заморачивается. Ему бы тупо научиться отлаживать хоть что-то.
pokk
Цитата(scifi @ Jul 11 2017, 18:30) *
Такое ощущение, что помешались на оптимизации, и теперь пожинаете грабли в отладке.

Увы решаю задачу ЦОС, надо оценить сколько тактов остается на запас, да и проанализировать за сколько тактов выполняются фильтры. До написания фильтров на ассемблере ещё не дошел, но если понадобиться то приодеться. Но в принципе сишный код не плохо компилируется.




k155la3
Цитата(pokk @ Jul 12 2017, 06:11) *
Увы решаю задачу ЦОС, надо оценить сколько тактов остается на запас, да и проанализировать за сколько тактов выполняются фильтры. До написания фильтров на ассемблере ещё не дошел, но если понадобиться то приодеться. Но в принципе сишный код не плохо компилируется.

Если Вы создаете проект на ASM, в очень-очень жестком реалтайме, на сотню мегагерц тактовой, то
считать такты - дело благородное.
Если же проеект на С, а то и С++, то это, IMHO, тупик.
Если приходится "ужимать" время на выполнение процедур - надо брать более мощный процессор.
Или использовать специализированные средства (SW-HW), которые будут считать все "накладные расходы" вместо Вас.
-----
В редчайших случаях, когда мне необходимо просчитать (!) время работы какой-либо процедуры,
я использую или таймер, который "уже есть", или вывожу "рамочный" строб на вывод порта, который абсолютно точно
меряется осцилографом или даже лог. анализатором.



pokk
Цитата(k155la3 @ Jul 12 2017, 09:40) *
Если приходится "ужимать" время на выполнение процедур - надо брать более мощный процессор.

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

Цитата(k155la3 @ Jul 12 2017, 09:40) *
Или использовать специализированные средства (SW-HW), которые будут считать все "накладные расходы" вместо Вас.

Это какие к примеру?
Kabdim
Цитата(scifi @ Jul 11 2017, 22:03) *
1) А вот не надо лепить UB.

У вас нет коллег и общих библиотек? laughing.gif
jcxz
Цитата(pokk @ Jul 12 2017, 06:11) *
Увы решаю задачу ЦОС, надо оценить сколько тактов остается на запас, да и проанализировать за сколько тактов выполняются фильтры.

А что простой способ: "выполнить этот фильтр N раз, измерить общее время (по таймеру) и поделить на N" - не помогает?
megajohn
Цитата(pokk @ Jul 12 2017, 12:14) *
Это какие к примеру?


к примеру, страница 39
http://supp.iar.com/FilesPublic/UPDINFO/00..._AddOn1.ENU.pdf
k155la3
Цитата(pokk @ Jul 12 2017, 12:14) *
. . . .
Это какие к примеру?

Из доступных моему интеллекту - симулятор и профайлер sm.gif
Хотя я имел ввиду специализированные для ЭТОГО компиляторы и HW отладчики.

AHTOXA
Чтобы найти в ассемблерном листинге место, куда поставить точку останова, можно поставить в это место пару-тройку nop-ов. Поскольку они volatile, компилятор их не имеет права переставлять.
Или более простой вариант - скопировать результат замера в переменную, и выдать её на печать. Тут уж пусть компилятор как хочет всё переставляет, всё равно это не помешает вам увидеть результат.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.