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

 
 
> Инкремент указателя и оптимизация
Rash
сообщение Oct 1 2015, 13:29
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



День добрый.

Столкнулся с проблемой оптимизации, при инкременте указателя когда 2 строчки подряд. Оптимизация макс. по скорости. IAR ARM 7.40.3. Мк STMF4
Код
static void _setup_resp_ready(uint8_t** ppData_rx, bool allow_addr, uint8_t** ppData_tx)
{
  if(allow_addr != false)
    *(*(volatile uint_setup_addr_t**)&(*ppData_tx))++ = setup_addr;
  
  // !!! если NOP нет, то код будет оптимизирован
  __ASM("NOP");
    
   *((*ppData_tx)++) = *((*ppData_rx)++);
  
  return;
}

Прим. uint_setup_addr_t - задаётся тип, на данный момент uint16_t


скрины ассемблера
без оптимизации

макс. оптимизация по скорости

макс. оптимизация по скорости + NOP


Вопрос, возможно ли сделать запись чтобы не оптимизировался инкремент указателя? NOP конечно не критичен, но костыль. Отключить оптимизацию только для ф-ции не рассматриваю, т.к. подобные записи оформил виде макросов и могут быть в разных участках кода
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rash
сообщение Oct 2 2015, 11:07
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 639
Регистрация: 5-09-05
Пользователь №: 8 231



многопоточности нет (RTOS тоже), раньше код был с разделением взятия переменной и инкрементом указателя, работало с оптимизацией и без. решил записать всё в одну строчку, для компактности и чтобы сделать макрос. Нет проблемы записать по другому с доп. переменной и т.п., хотелось записать одной строчкой.

По поводу говнокода, каждому своё, тогда и DSP Lib от ARM тоже говнокод, там такие записи встречаются.
Найти ошибку будет сложнее, но эта запись как результат сворачивая из нескольких записей на уже отлаженном коде.

Цитата(Kabdim @ Oct 2 2015, 14:06) *
*((*ppData_tx)++) = *((*ppData_rx)++);
Вообще это изменение одной переменной между двумя точками следования. Это в свою очередь UB. Поэтому компилятор прав, вы - нет. Пишите подобное с временной переменной. Это работает в отладке потому что там компилятор что видит, то и поёт. С нопом это работает по счастливой случайности, из-за особенностей оптимизации конкретным компилятором.


переменная тут не меняется, она копируется из _rx в _tx, а адреса буферов меняются

переменные нигде не меняются, меняется (инкрементируется) только указатель на входные буфера
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Rash   Инкремент указателя и оптимизация   Oct 1 2015, 13:29
- - scifi   Многабукаффниасилил. Я не пойму, жалоба на некорре...   Oct 1 2015, 13:43
- - Rash   да вроде не так много букв ). Проблема в том, что ...   Oct 1 2015, 16:50
|- - scifi   Цитата(Rash @ Oct 1 2015, 19:50) А вопрос...   Oct 1 2015, 16:53
- - Rash   1. Не нравятся костыли в любом виде, в данном случ...   Oct 1 2015, 17:08
|- - scifi   Вы не ответили на важный вопрос: "жалоба на н...   Oct 1 2015, 17:43
- - Rash   жалоба на то, что исчез инкремент, который не долж...   Oct 1 2015, 17:51
|- - scifi   Цитата(Rash @ Oct 1 2015, 20:51) жалоба н...   Oct 1 2015, 18:13
- - _Pasha   да там наверное нездоровый упор на CSE. просто сде...   Oct 1 2015, 18:31
|- - scifi   Цитата(_Pasha @ Oct 1 2015, 21:31) да там...   Oct 1 2015, 18:41
- - Rash   Цитата(scifi @ Oct 1 2015, 21:13) Жалоба ...   Oct 1 2015, 19:09
|- - scifi   Цитата(Rash @ Oct 1 2015, 22:09) Программ...   Oct 1 2015, 19:17
- - Rash   естественно, стоит при определении типа на указате...   Oct 1 2015, 19:23
|- - megajohn   Цитата(Rash @ Oct 1 2015, 23:23) естестве...   Oct 2 2015, 07:16
- - Valentine Loginov   Вам бы не полениться и сделать код читаемым, как н...   Oct 2 2015, 06:52
- - scifi   Кстати, безотносительно к тому, есть ли там volati...   Oct 2 2015, 07:27
- - zltigo   QUOTE (Rash @ Oct 1 2015, 16:29) *(*(vola...   Oct 2 2015, 08:12
- - Valentine Loginov   Цитата(megajohn @ Oct 2 2015, 10:16) я та...   Oct 2 2015, 10:27
- - Kabdim   *((*ppData_tx)++) = *((*ppData_rx)++); Вообще это ...   Oct 2 2015, 11:06
|- - Kabdim   Цитата(Rash @ Oct 2 2015, 14:07) переменн...   Oct 2 2015, 11:12
|- - scifi   Цитата(Rash @ Oct 2 2015, 14:07) многопот...   Oct 2 2015, 11:43
- - Rash   компилятор я нигде не обвинял, а только спрашивал,...   Oct 2 2015, 11:56
|- - scifi   Цитата(Rash @ Oct 2 2015, 14:56) компилят...   Oct 2 2015, 14:20
- - _Pasha   я правильно перевел с птичьего языка на норм.? Код...   Oct 2 2015, 15:51
- - Rash   scifi, мне интересно, что вас задел этот volatile ...   Oct 2 2015, 20:09
- - _Pasha   Цитата(Rash @ Oct 2 2015, 23:09) По запис...   Oct 3 2015, 05:48


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

 


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


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