Easyelectronics.ru

Электроника для всех
Текущее время: 21 май 2018, 04:34

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Чтение volatile указателя в цикле
СообщениеДобавлено: 19 дек 2017, 22:19 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 311
Добрый день.
Есть простой код:
Код:
constexpr uint32 address = 0x54;
for(uint8 i = 0; i < 15; ++i)
{
    *reinterpret_cast<volatile uint32*>(address);
}
Обычное холостое чтение из некоторого регистра по адресу address. Значение переменной address здесь выбрано случайным образом, просто чтобы показать пример.
Компиляция ведется с помощью ARM Compiler 6.7, язык C++14, оптимизация -O3. На выходе имею такой код:
Код:
0x0800023C 2054      MOVS          r0,#0x54
0x0800023E 6801      LDR           r1,[r0,#0x00]
0x08000240 6801      LDR           r1,[r0,#0x00]
0x08000242 6801      LDR           r1,[r0,#0x00]
0x08000244 6801      LDR           r1,[r0,#0x00]
0x08000246 6801      LDR           r1,[r0,#0x00]
0x08000248 6801      LDR           r1,[r0,#0x00]
0x0800024A 6801      LDR           r1,[r0,#0x00]
0x0800024C 6801      LDR           r1,[r0,#0x00]
0x0800024E 6801      LDR           r1,[r0,#0x00]
0x08000250 6801      LDR           r1,[r0,#0x00]
0x08000252 6801      LDR           r1,[r0,#0x00]
0x08000254 6801      LDR           r1,[r0,#0x00]
0x08000256 6801      LDR           r1,[r0,#0x00]
0x08000258 6801      LDR           r1,[r0,#0x00]
0x0800025A 6800      LDR           r0,[r0,#0x00]
Т.е. компилятор тупо развернул мой цикл в 15 вызовов. Если я сделаю цикл из 100 итераций, то у меня будет целых 100 LDR.
Вопрос: как сделать так, чтобы цикл не разворачивался? Ведь такое поведение расточительно с точки зрения размера прошивки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение volatile указателя в цикле
СообщениеДобавлено: 19 дек 2017, 22:33 
Заглядывает иногда

Зарегистрирован: 09 ноя 2013, 18:29
Сообщения: 142
ElecDron писал(а):
Если я сделаю цикл из 100 итераций, то у меня будет целых 100 LDR.

Уверены?
ElecDron писал(а):
Ведь такое поведение расточительно с точки зрения размера прошивки.

Чтобы оптимизировать по размеру, нужно другое -O указывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение volatile указателя в цикле
СообщениеДобавлено: 20 дек 2017, 00:37 
Старожил

Зарегистрирован: 11 фев 2016, 18:17
Сообщения: 311
Проверял - было 100 шт.
А вот другое -O помогло. Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение volatile указателя в цикле
СообщениеДобавлено: 20 дек 2017, 01:15 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 3294
Откуда: Кемеровская область, Киселевск
Там же выбор есть -Oz

Вложение:
Новый точечный рисунок.jpg
Новый точечный рисунок.jpg [ 47.45 Кб | Просмотров: 1140 ]


Начиная с 6 версии, KEIL использует ARMCLANG компилятор, при этом сохраняются некоторые старые конструкции компилятора.
http://radiowolf.ru/?p=473

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение volatile указателя в цикле
СообщениеДобавлено: 20 дек 2017, 12:50 
Старожил
Аватара пользователя

Зарегистрирован: 17 апр 2010, 08:38
Сообщения: 4795
Откуда: Усинск, республика Коми
ОЗ... Система защиты на подводных лодках... Если это ОЗ падает, то рыбки будут довольны обедом...

_________________
хаос это непознанный порядок


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение volatile указателя в цикле
СообщениеДобавлено: 20 дек 2017, 13:55 
Старожил
Аватара пользователя

Зарегистрирован: 27 мар 2015, 04:10
Сообщения: 1511
Откуда: Харьков
А в структуре volatile даст такой же эффект как и для обычной переменной?
Код:
struct DeviceData {
    volatile uint8_t Length;
             char    Data[CC1101_BUFFER_LENGTH];
};


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Чтение volatile указателя в цикле
СообщениеДобавлено: 20 дек 2017, 14:04 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 492
alexsam писал(а):
А в структуре volatile даст такой же эффект как и для обычной переменной?

Нет. Именно так объявлены все регистры STM32, какой в этом смысл, если нет никакой разницы...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB