|
IAR оптимизация, выключить для куска |
|
|
|
Jul 11 2017, 09:12
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Добрый день подскажите как выключить оптимизацию для куска кода внутри функции ? Дело в том что надо определить точное выполнение кода при максимальной оптимизации использую Код SCB_DEMCR |= 0x01000000; DWT_CONTROL|= 1; // enable the counter DWT_CYCCNT = 0; и потом считываю DWT_CYCCNT, но проблема в том что при максимальной оптимизации, программа пролетает breakpoint, который я установил и не понятно какой кусок кода выполнился. Так вот как установить NOP, что бы при максимальной оптимизации он остался, и на него можно было повесить breakpoint ?
|
|
|
|
|
Jul 11 2017, 09:48
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819

|
Цитата(pokk @ Jul 11 2017, 12:12)  Добрый день подскажите как выключить оптимизацию для куска кода внутри функции ? копните в направлении #pragma optimize
|
|
|
|
|
Jul 11 2017, 10:06
|
Частый гость
 
Группа: Участник
Сообщений: 84
Регистрация: 7-05-05
Пользователь №: 4 819

|
Цитата(pokk @ Jul 11 2017, 13:03)  Да это я уже нашёл, но как я понял она только в функциям применяется, а если чтение DWT_CYCCNT запихать в функцию то фиг поймешь сколько он тактов на вход функцию будет тратить и будит ли вообще.
Да и я смотрю что компилятор любитель, местами менять операции. Это бы тоже хотелось избежать при чтении DWT_CYCCNT Сколько тратит на вход в функцию это можно в ассемблере посмотреть. Менять местами - посмотрите pragma inline
|
|
|
|
|
Jul 11 2017, 10:08
|
Гуру
     
Группа: Свой
Сообщений: 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. Можете спать спокойно.
|
|
|
|
|
Jul 11 2017, 12:00
|
Профессионал
    
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Jul 11 2017, 14:03
|
Частый гость
 
Группа: Участник
Сообщений: 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"); ? Я думал при высокой оптимизации он их выкинет совсем, но сегодня вечером увидел что он их только передвинул.
|
|
|
|
|
Jul 11 2017, 15:30
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(pokk @ Jul 11 2017, 17:03)  Дело в том что я там всем почти функциям наставил static+ inline, что бы компилятор выворачивал их. Такое ощущение, что помешались на оптимизации, и теперь пожинаете грабли в отладке. Оптимизация ради оптимизации - зло. Более того, если прошивка отлажена и работает без оптимизации, то пусть так и остаётся. Да, при повышении уровня оптимизации могут вылезти новые ошибки, которые лучше бы исправить, но это уже производная второго порядка.
|
|
|
|
|
Jul 12 2017, 03:11
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Цитата(scifi @ Jul 11 2017, 18:30)  Такое ощущение, что помешались на оптимизации, и теперь пожинаете грабли в отладке. Увы решаю задачу ЦОС, надо оценить сколько тактов остается на запас, да и проанализировать за сколько тактов выполняются фильтры. До написания фильтров на ассемблере ещё не дошел, но если понадобиться то приодеться. Но в принципе сишный код не плохо компилируется.
|
|
|
|
|
Jul 12 2017, 05:40
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(pokk @ Jul 12 2017, 06:11)  Увы решаю задачу ЦОС, надо оценить сколько тактов остается на запас, да и проанализировать за сколько тактов выполняются фильтры. До написания фильтров на ассемблере ещё не дошел, но если понадобиться то приодеться. Но в принципе сишный код не плохо компилируется. Если Вы создаете проект на ASM, в очень-очень жестком реалтайме, на сотню мегагерц тактовой, то считать такты - дело благородное. Если же проеект на С, а то и С++, то это, IMHO, тупик. Если приходится "ужимать" время на выполнение процедур - надо брать более мощный процессор. Или использовать специализированные средства (SW-HW), которые будут считать все "накладные расходы" вместо Вас. ----- В редчайших случаях, когда мне необходимо просчитать (!) время работы какой-либо процедуры, я использую или таймер, который "уже есть", или вывожу "рамочный" строб на вывод порта, который абсолютно точно меряется осцилографом или даже лог. анализатором.
|
|
|
|
|
Jul 12 2017, 09:14
|
Частый гость
 
Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028

|
Цитата(k155la3 @ Jul 12 2017, 09:40)  Если приходится "ужимать" время на выполнение процедур - надо брать более мощный процессор. Да на си, но теоретически запас, в 2 раза должен был остаться, а он хоп и исчез вот и приходится искать, что же все время сьело. А вывод стробом уже имеется, но больше в % на глаз дает информацию. Цитата(k155la3 @ Jul 12 2017, 09:40)  Или использовать специализированные средства (SW-HW), которые будут считать все "накладные расходы" вместо Вас. Это какие к примеру?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|