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

 
 
> Инкремент указателя и оптимизация
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, 20:09
Сообщение #2


Знающий
****

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



scifi, мне интересно, что вас задел этот volatile или слово жалоба? через volatile объявляю только приведение типов по указателю, в книжках читал про это. Прерывание есть, какая реальная программа без прерываний. Ещё на время отладки volatile объявляю float, чтобы watch отображался.

_Pasha, ну на птичий язык не совсем тянет, хотя запись с указателями перегружена для непосвящённых biggrin.gif
По записи вроде всё верно, хотя не проверял, до понедельника не на чем. Но смысл не постоянно писать такими громоздкими записями, а завернуть их в макросы или для противников макросов в inline функции и использовать
это макрос один
Код
*(*(volatile uint_setup_addr_t**)&(*ppData_tx))++ = setup_addr;

это второй
Код
*((*ppData_tx)++)

но так получилось, в данной ф-ции, что подряд идущие 2 эти строчки оптимизируется и я вставил NOP между ними. Приводить большие куски кода не вижу смысла т.к. необходимо в любой конструкции работа этих макросов.

немного OFFTOP:
Другой случай где понадобился NOP, это для анализатора стека. При максимальной оптимизации по скорости (на других не пробовал) в switch вызывались различные ф-ции в зависимости значение case. Все вызовы ф-ций при этом подменялись с CALL на JMP (это на AVR) и анализатор выдавал предупреждение о косвенном вызове и не мог составить дерево вызовов. Причём ни прагмой, ни описанием в файле конфигурации, я так и не смог указать правильное дерево вызовов для данного случая. Но если в конце перед выходом из ф-ции (после switch) поставить NOP такой подмены не происходит и анализатор нормально работает.
Естественно, на работоспособность программы это не влияет, но анализатор хорошая штука чего б не использовать.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 3 2015, 05:48
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(Rash @ Oct 2 2015, 23:09) *
По записи вроде всё верно, хотя не проверял, до понедельника не на чем. Но смысл не постоянно писать такими громоздкими записями, а завернуть их в макросы или для противников макросов в inline функции и использовать

1. Не все там верно, нужно же отразить модификацию собственно указателей, т.е. в конце добавить
Код
*ppData_tx = ptx;
*ppData_rx = prx;


2. Ход мыслей понятен, но имхо такое, что нет смысла бояться локальных переменных даже в таком случае.
Т.е. в случае с макросом - обернуть его в do{}while(0) и создавать столько локальных перем. сколько нужно.

3. Не все компиляторы, что существуют, - одинаково хорошие sm.gif и если даже такой не сильно тяжелой строкой удалось вогнать его в багу, - повод задуматься, стоит ли так закручивать сюжет. Если создание лишних сущностей отдать на откуп компилю, совсем не факт, что он справится с этим.
я недавно написал под SDCC, типа поиграться решил
Код
crc = (crc >> 1)^((crc & 1)? 0x8C:0);

так там вообще неправильный код сгенерировался.
пришлось исправить на
Код
crc = ((crc & 1)? 0x8C:0) ^ (crc >> 1);

вот те на, CSE smile3046.gif
но то sdcc. милость к падшим тсз нада проявлять biggrin.gif
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
- - Rash   многопоточности нет (RTOS тоже), раньше код был с ...   Oct 2 2015, 11:07
|- - 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


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

 


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


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