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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> IAR оптимизация, выключить для куска
pokk
сообщение Jul 11 2017, 09:12
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Добрый день подскажите как выключить оптимизацию для куска кода внутри функции ?

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

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

Так вот как установить NOP, что бы при максимальной оптимизации он остался, и на него можно было повесить breakpoint ?
Go to the top of the page
 
+Quote Post
0men
сообщение Jul 11 2017, 09:48
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819



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


копните в направлении #pragma optimize
Go to the top of the page
 
+Quote Post
pokk
сообщение Jul 11 2017, 10:03
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



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

Да и я смотрю что компилятор любитель, местами менять операции. Это бы тоже хотелось избежать при чтении DWT_CYCCNT
Go to the top of the page
 
+Quote Post
0men
сообщение Jul 11 2017, 10:06
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819



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

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


Сколько тратит на вход в функцию это можно в ассемблере посмотреть. Менять местами - посмотрите pragma inline
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2017, 10:08
Сообщение #5


Гуру
******

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



Цитата(pokk @ Jul 11 2017, 12:12) *
и потом считываю DWT_CYCCNT, но проблема в том что при максимальной оптимизации, программа пролетает breakpoint, который я установил

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

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

Компилятор не будет менять порядок операций с переменными volatile. Можете спать спокойно.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jul 11 2017, 12:00
Сообщение #6


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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

#include <intrinsics.h>
__no_operation();
или
__NOP();


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
pokk
сообщение Jul 11 2017, 14:03
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Цитата(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"); ?
Я думал при высокой оптимизации он их выкинет совсем, но сегодня вечером увидел что он их только передвинул.

Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2017, 15:30
Сообщение #8


Гуру
******

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



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

Такое ощущение, что помешались на оптимизации, и теперь пожинаете грабли в отладке. Оптимизация ради оптимизации - зло. Более того, если прошивка отлажена и работает без оптимизации, то пусть так и остаётся. Да, при повышении уровня оптимизации могут вылезти новые ошибки, которые лучше бы исправить, но это уже производная второго порядка.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 11 2017, 15:39
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



А после этого оптимизировать понадобилось, да вот в прошивке UB на UB и UB погоняет. А ловить их только огромной кровью, когда неизвестно в каком комите они появились. Не понимаю я людей которые в процессе разработки не тестируют работоспособность при максимальной оптимизации.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 11 2017, 19:03
Сообщение #10


Гуру
******

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



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

1) А вот не надо лепить UB.
2) Очевидно, ТС со столь высокими материями не заморачивается. Ему бы тупо научиться отлаживать хоть что-то.
Go to the top of the page
 
+Quote Post
pokk
сообщение Jul 12 2017, 03:11
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Цитата(scifi @ Jul 11 2017, 18:30) *
Такое ощущение, что помешались на оптимизации, и теперь пожинаете грабли в отладке.

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




Go to the top of the page
 
+Quote Post
k155la3
сообщение Jul 12 2017, 05:40
Сообщение #12


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

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



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

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



Go to the top of the page
 
+Quote Post
pokk
сообщение Jul 12 2017, 09:14
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



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

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

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

Это какие к примеру?
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 12 2017, 09:52
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



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

У вас нет коллег и общих библиотек? laughing.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 12 2017, 12:58
Сообщение #15


Гуру
******

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



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

А что простой способ: "выполнить этот фильтр N раз, измерить общее время (по таймеру) и поделить на N" - не помогает?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 15:10
Рейтинг@Mail.ru


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