Перейти к содержанию
    

Инкремент указателя и оптимизация

День добрый.

 

Столкнулся с проблемой оптимизации, при инкременте указателя когда 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

 

скрины ассемблера

без оптимизации

no_optimize.jpg

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

max_speed.jpg

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

max_speed_NOP.jpg

 

Вопрос, возможно ли сделать запись чтобы не оптимизировался инкремент указателя? NOP конечно не критичен, но костыль. Отключить оптимизацию только для ф-ции не рассматриваю, т.к. подобные записи оформил виде макросов и могут быть в разных участках кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Многабукаффниасилил.

Я не пойму, жалоба на некорректный код, так как исчез инкремент, который никак не должен исчезать?

Если так, то такой вопрос: а вы уверены, что у вас исходник корректный? Что там, где надо, написано volatile и так далее? Потому что из приведённых отрывков этого совсем не видно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да вроде не так много букв ). Проблема в том, что исчезает инкремент, второй скрин, если между строчками где идёт присваивание по одному и тому же указателю с инкрементом поставить NOP, то всё хорошо, скрин 3 (как и без оптимизации). volatile по типу поставил, хотя он не влияет.

 

Жалобы нет, т.к. код мой.

А вопрос как написать тоже, но без NOPа?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вопрос как написать тоже, но без NOPа?

Зачем?

Ведь нет жалобы:

Жалобы нет

То есть всё нормально. Честно, не понимаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Не нравятся костыли в любом виде, в данном случае NOP.

2. Нет гарантии, что в следующий раз я могу что то не учесть, подобной записью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы не ответили на важный вопрос: "жалоба на некорректный код, так как исчез инкремент, который никак не должен исчезать?"

Да или нет?

От этого многое зависит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

жалоба на то, что исчез инкремент, который не должен исчезать

Ну наконец-то.

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

А вот понять, где ошибка, я точно не смогу, потому что приведён мелкий кусочек кода.

Ну а если покажете мегапростыню кода, то не обещаю, что буду в ней разбираться :laughing:

 

UPDATE:

Забыл спросить. Жалоба только на то, что код в окне дизассемблера выглядит не так, как хотелось бы? Или реально программа работает не так, как задумано?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да там наверное нездоровый упор на CSE.

просто сделать через добавление локальных переменных - попустит дерево синтаксиса и станет код вменяемым

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да там наверное нездоровый упор на CSE.

просто сделать через добавление локальных переменных - попустит дерево синтаксиса и станет код вменяемым

То есть уже установлено, что компилятор виноват. А если бы были судьёй, то всех расстреливали бы без следствия?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Жалоба только на то, что код в окне дизассемблера выглядит не так, как хотелось бы? Или реально программа работает не так, как задумано?

 

Программа работает как задумано, без оптимизации или при добавлении NOP.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Программа работает как задумано, без оптимизации или при добавлении NOP.

Обычное дело, если не понимать, что такое volatile, и где его нужно применять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вам бы не полениться и сделать код читаемым, как например ввести дополнительные переменные. Оптимизация всё уберет, зато сам код и дизасм читать легче станет.

Очень очень очень некрасивый код:

*((*ppData_tx)++) = *((*ppData_rx)++);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

естественно, стоит при определении типа на указатель, куда уж не правильней

я так понимаю: указатель1->указатель2->данные и ваш volatile относится к данным, а не к указателям

Но могу ошибаться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...