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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Инкремент указателя и оптимизация
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
scifi
сообщение Oct 1 2015, 13:43
Сообщение #2


Гуру
******

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



Многабукаффниасилил.
Я не пойму, жалоба на некорректный код, так как исчез инкремент, который никак не должен исчезать?
Если так, то такой вопрос: а вы уверены, что у вас исходник корректный? Что там, где надо, написано volatile и так далее? Потому что из приведённых отрывков этого совсем не видно.
Go to the top of the page
 
+Quote Post
Rash
сообщение Oct 1 2015, 16:50
Сообщение #3


Знающий
****

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



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

Жалобы нет, т.к. код мой.
А вопрос как написать тоже, но без NOPа?
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 16:53
Сообщение #4


Гуру
******

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



Цитата(Rash @ Oct 1 2015, 19:50) *
А вопрос как написать тоже, но без NOPа?

Зачем?
Ведь нет жалобы:
Цитата(Rash @ Oct 1 2015, 19:50) *
Жалобы нет

То есть всё нормально. Честно, не понимаю.
Go to the top of the page
 
+Quote Post
Rash
сообщение Oct 1 2015, 17:08
Сообщение #5


Знающий
****

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



1. Не нравятся костыли в любом виде, в данном случае NOP.
2. Нет гарантии, что в следующий раз я могу что то не учесть, подобной записью.
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 17:43
Сообщение #6


Гуру
******

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



Вы не ответили на важный вопрос: "жалоба на некорректный код, так как исчез инкремент, который никак не должен исчезать?"
Да или нет?
От этого многое зависит.
Go to the top of the page
 
+Quote Post
Rash
сообщение Oct 1 2015, 17:51
Сообщение #7


Знающий
****

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



жалоба на то, что исчез инкремент, который не должен исчезать
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 18:13
Сообщение #8


Гуру
******

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



Цитата(Rash @ Oct 1 2015, 20:51) *
жалоба на то, что исчез инкремент, который не должен исчезать

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

UPDATE:
Забыл спросить. Жалоба только на то, что код в окне дизассемблера выглядит не так, как хотелось бы? Или реально программа работает не так, как задумано?
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Oct 1 2015, 18:31
Сообщение #9


;
******

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



да там наверное нездоровый упор на CSE.
просто сделать через добавление локальных переменных - попустит дерево синтаксиса и станет код вменяемым
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 18:41
Сообщение #10


Гуру
******

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



Цитата(_Pasha @ Oct 1 2015, 21:31) *
да там наверное нездоровый упор на CSE.
просто сделать через добавление локальных переменных - попустит дерево синтаксиса и станет код вменяемым

То есть уже установлено, что компилятор виноват. А если бы были судьёй, то всех расстреливали бы без следствия?
Go to the top of the page
 
+Quote Post
Rash
сообщение Oct 1 2015, 19:09
Сообщение #11


Знающий
****

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



Цитата(scifi @ Oct 1 2015, 21:13) *
Жалоба только на то, что код в окне дизассемблера выглядит не так, как хотелось бы? Или реально программа работает не так, как задумано?


Программа работает как задумано, без оптимизации или при добавлении NOP.
Go to the top of the page
 
+Quote Post
scifi
сообщение Oct 1 2015, 19:17
Сообщение #12


Гуру
******

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



Цитата(Rash @ Oct 1 2015, 22:09) *
Программа работает как задумано, без оптимизации или при добавлении NOP.

Обычное дело, если не понимать, что такое volatile, и где его нужно применять.
Go to the top of the page
 
+Quote Post
Rash
сообщение Oct 1 2015, 19:23
Сообщение #13


Знающий
****

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



естественно, стоит при определении типа на указатель, куда уж не правильней
Go to the top of the page
 
+Quote Post
Valentine Logino...
сообщение Oct 2 2015, 06:52
Сообщение #14


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

Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462



Вам бы не полениться и сделать код читаемым, как например ввести дополнительные переменные. Оптимизация всё уберет, зато сам код и дизасм читать легче станет.
Очень очень очень некрасивый код:
Цитата
*((*ppData_tx)++) = *((*ppData_rx)++);
Go to the top of the page
 
+Quote Post
megajohn
сообщение Oct 2 2015, 07:16
Сообщение #15


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

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(Rash @ Oct 1 2015, 23:23) *
естественно, стоит при определении типа на указатель, куда уж не правильней

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


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post

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

 


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


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