Например TDA7294

Форум РадиоКот • Просмотр темы - О volatile замолвлю я слово
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 23:44:06

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


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 64 ]    , 2, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Пн янв 17, 2022 21:48:57 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Reflector писал(а):
Программист читая регистр знает, что должно генериться прерывание, возможно именно для этого он его и читает, а без volatile результат непредсказуем...
это программист. программист всеми силами стремится в ногу не стрелять. опасность подстерегает "не совсем программиста" :) который может думать, что бессмысленное чтение ни на что не влияет.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Пн янв 17, 2022 22:00:45 
Друг Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 1320
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 10429
Рейтинг сообщения: 0
Что-то у меня подозрение, что в мою сторону камни. Но я там был именно за понимание всего механизма работы с volatile, опциями оптимизатора, для чего, почему и как. А не за бездумное использование.

_________________
добавь radiokot.ru##.tablebg > tbody > tr:has(td>a[href*="?f=17"]) в адблок, сделай форум чище!
"Э-э-э-хей... растёт правосознание!"


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Пн янв 17, 2022 22:10:45 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
лично я никаких камней не кидаю.
volatile мешает оптимизатору.
помогает ли программиступисателю программ - это вопрос другой.

например, постоянно можно услышать, что все переменные, изменяемые в прерываниях, должны быть volatile... это не так. НЕ ВСЕ, а только те, которые в том нуждаются. просто надо понимать, какие нуждаются, а какие нет. если не выжимать до последнего байта всю память, то можно ставить volatile бездумно, попасть на "предсказанный" мной вариант ошибки будет редким "везением"...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Пн янв 17, 2022 23:39:06 
Друг Кота
Аватар пользователя

Карма: 29
Рейтинг сообщений: 1320
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 10429
Рейтинг сообщения: 0
Да и вообще, почему что-то быть именно должно? я вот не очень командный игрок, чаще один. Внутри команды да, есть соглашения, их все придерживаются, единый стиль, это тоже удобно. Но когда один работаю с 8-битными мк, у меня идет смесь Си с ассемблером. Ну, привычка такая, мне раньше часто доставалось от ошибок оптимизатора (да, именно его ошибок, которые впоследствии официально признавались и фиксились, а не от того, что я недоволатилил), да и мне нравится эдакое соревнование, могу ли изначально слепить оптимальный код, который оптимизатор не сможет оптимизировать.
На простых задачах это не отнимает много времени и доставляет удовольствие.
Поэтому, я против догм. Да, программист обязан знать все тонкости volatile и если глянуть на ссылку, что я приводил в той ветке и на первый пост этой ветки а так же замечаний ARV, ну никак не обойтись короткой фразой. Но применение не должно быть догмой, предложение о применении необходимо сопровождать разъяснением, почему. Потому что "оптимизатор всегда вкл" тоже не обязано быть догмой. И это мы вообще рассуждаем о фундаментальном сферическом, а вот в частном случае с частным компилятором вообще всё может быть не так. Тоже чтение регистров, например. У меня вот компилятор космика не выкидывает "пустое в никуда" неволатильное чтение регистра. Хотя, глядя на код, мне хочется его выкинуть самому.
Ну вот какая-то такая мысль. Извините, если сумбурно - малость с похмелья.

_________________
добавь radiokot.ru##.tablebg > tbody > tr:has(td>a[href*="?f=17"]) в адблок, сделай форум чище!
"Э-э-э-хей... растёт правосознание!"


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Вт янв 18, 2022 14:29:06 
Друг Кота

Карма: 17
Рейтинг сообщений: 11
Зарегистрирован: Пт янв 12, 2007 11:21:39
Сообщений: 13115
Откуда: Томск
Рейтинг сообщения: 0
volatile мешает оптимизатору.
помогает ли программиступисателю программ - это вопрос другой.


volatile не мешает оптимизатору. Он просто делает обращение к конкретной ячейке памяти предсказуемыми. И только.

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

Применение volatile, равно как и других инструментов, не отменяет необходимости думать головой. Это главное правило. Компилятор думать за программиста не будет.

Добавлено after 1 hour 21 minute 23 seconds:
кстати, кому не нравится volatile, то вот способ обхода. Пишите две функции (пример для байтовой ячейки) в виде отдельной библиотеки.

Код:
#include <stdint.h>

uint8_t getByte(void* adr) {
    return *((uint8_t*)adr);
}

void setByte(void* adr, uint8_t byte) {
    *((uint8_t*)adr) = byte;
}

Использовать соответственно:

Код:
a=getByte((void*)0xABCD); // Чтение из ячейки памяти с адресом 0xABCD

setByte((void*)0xABCD, 0xFE); // Запись байта 0xFE по адресу 0xABCD


Компилятор такое не оптимизирует. Но это для извратов:)


Последний раз редактировалось SfS Вт янв 18, 2022 15:54:16, всего редактировалось 1 раз.

Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Вт янв 18, 2022 14:42:08 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
Компилятор такое не оптимизирует.

Компилятор такое и не компилирует, по крайней мере gcc :)
А если имелось в виду:
Код:
*((uint8_t*)adr) = byte;

то такое замечательно оптимизируется.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Вт янв 18, 2022 16:08:20 
Друг Кота

Карма: 17
Рейтинг сообщений: 11
Зарегистрирован: Пт янв 12, 2007 11:21:39
Сообщений: 13115
Откуда: Томск
Рейтинг сообщения: 0
Компилятор такое не оптимизирует.

Компилятор такое и не компилирует, по крайней мере gcc :)


Замечательно комплирует. Сейчас проверил. Там почемуто амперсанды лишние из редактора копирнулись. Убрал.
Если функции делать в виде отдельной либы - то работает всё именно как задумано.

Но volatile - проще и правильней:)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Вт янв 18, 2022 16:22:10 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
Если функции делать в виде отдельной либы - то работает всё именно как задумано.

Проверяем, пишу:
Код:
setByte((void*)&GPIOB->ODR, 0x55);
setByte((void*)&GPIOB->ODR, 0xAA);

При этом setByte() находится в другом .cpp файле. Получаем вполне ожидаемый результат:
Код:
ldr r3, [pc, #516]
movs r2, #170   ; 0xaa
strb r2, [r3, #20]


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Вт янв 18, 2022 16:31:40 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Reflector писал(а):
Получаем вполне ожидаемый результат
LTO?

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Вт янв 18, 2022 16:37:15 
Поставщик валерьянки для Кота

Карма: 20
Рейтинг сообщений: 253
Зарегистрирован: Вс июн 19, 2016 09:32:03
Сообщений: 2090
Рейтинг сообщения: 0
Естественно LTO.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Вт янв 18, 2022 17:29:27 
Друг Кота

Карма: 17
Рейтинг сообщений: 11
Зарегистрирован: Пт янв 12, 2007 11:21:39
Сообщений: 13115
Откуда: Томск
Рейтинг сообщения: 0
Я в виде двух объектных файлов скомпилил тоже под арм. И там в асме прекрасно сработало.

Отдельная библиотека это вообще архив объектников. Там можно и секции лишние стрипнуть.

Добавлено after 31 second:
Другое дело, чтов реальном проекте я так делать не буду:)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Вт янв 18, 2022 17:45:50 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 403
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2479
Рейтинг сообщения: 0
кстати, кому не нравится volatile
Чего??? Сегодня кому-то volatile не нравится, завтра const нелюб будет, а послезавтра что следующее?

Добавлено after 9 minutes 26 seconds:
Адепты мантры - «а у меня и так работает» - часто нарываются на очень неожиданное поведение кода в самый неподходящий момент времени. Удачи им в скачке по граблям.

И там в асме прекрасно сработало.
А как дышал, как дышал :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Вт янв 18, 2022 17:57:42 
Друг Кота

Карма: 17
Рейтинг сообщений: 11
Зарегистрирован: Пт янв 12, 2007 11:21:39
Сообщений: 13115
Откуда: Томск
Рейтинг сообщения: 0
И там в асме прекрасно сработало.
А как дышал, как дышал :)


А как дышал? :)
Дышал ровно и выступал за стандарты:)

Но привел пример извращения. Почему не привести ради прикола и для оживления темы? :)

Но выше товарищи правы, с lto компилерами без отключения оного lto не прокатит. А я както и не написал об этом.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Ср янв 19, 2022 04:49:39 
Встал на лапы

Карма: -8
Рейтинг сообщений: 3
Зарегистрирован: Сб апр 24, 2021 18:42:11
Сообщений: 111
Рейтинг сообщения: 0
"Си — инструмент, острый, как бритва: с его помощью можно создать и элегантную программу, и кровавое месиво". © Керниган.
RTFM. Все остальное - на совести издателей конкретного компилятора. Дьявол всегда кроется в деталях (мелочах). Разговор ни о чем, IMHO.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Чт янв 20, 2022 09:38:52 
Друг Кота

Карма: 17
Рейтинг сообщений: 11
Зарегистрирован: Пт янв 12, 2007 11:21:39
Сообщений: 13115
Откуда: Томск
Рейтинг сообщения: 0
RTFM. Все остальное - на совести издателей конкретного компилятора.


Ну почему?) Используйте стандарты) Они так.. эмм.. стандартны. И работают в любом компиляторе:)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Чт янв 20, 2022 11:32:37 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
SfS писал(а):
Они так.. эмм.. стандартны
вот именно, что "эмм"... в стандарте полно мест, которые "на усмотрение реализаторов компилятора"
к тому же мало кто видел этот стандарт на русском языке...

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Чт янв 20, 2022 14:46:24 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 840
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 5592
Откуда: Minsk
Рейтинг сообщения: 0
Я на AVR Си не применяю, но вот любопытная ситуация произошла. На родственном форуме у студента возникла прооблема с точками "остановки". Я по доброте душевной :) , хоть в этом и не шибко секу, посоветовал ему обратить взор на volatile - не исключено, что компилятор оптимизнул - выбросил этот бессмысленный с его точки зрения фрагмент.
СпойлерНужна помощь! При составление программы на языке С+ возникает проблема с точками остановки. Может кто подскажет что я делаю не так.
Код:
#include "compiler.h"
#include <avr/interrupt.h>
#include "conf_example.h"

// Only use Pin Change Interrupt handler for devices supporting this.
#ifdef EXAMPLE_PCINT_vect


ISR(EXAMPLE_PCINT_vect)
{

PIND = (1 << PIND0);
}

#endif


int main(void)
{

uint8_t val;

DDRD = 0xff;

// Set output levels high. Will turn off STK600 LEDs.
PORTD = 0xff;

// Set output levels low. Will turn on STK600 LEDs.
PORTD = 0;

PORTB = 0xff;

val = PINB;

while (1)
{
PORTD |= (1 << PORTD0);

PORTD &= ~(1 << PORTD0);
}
}

А мне стало интересно: как "заволатилить" порт?

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Чт янв 20, 2022 14:52:24 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Jack_A писал(а):
как "заволатилить" порт?
порт уже заволатилен

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Чт янв 20, 2022 15:06:39 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 840
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 5592
Откуда: Minsk
Рейтинг сообщения: 0
Так что моя версия - ошибочная ? А как же тогда в примере SfS (от 16.01) из-за UDR произошёл такой казус? Ведь UDR - это тоже регистр. Хотя чисто по логике, может, не в volatile дело? Загрузив байт в UDR, следовало бы дождаться флага готовности перед загрузкой следующего.
Ну а стьюденьт тоже зря лил слёзы. Загрузил в Студию hex - и всё видно, что оно там накомпиляло.
----------
СпойлерПравильно говорит мне мой кот Мурзик: "Не занимайся фигнёй. Хочешь написать для AVR - ну ты же на асме - как на родном
:)

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: О volatile замолвлю я слово
СообщениеДобавлено: Вс янв 23, 2022 06:33:57 
Друг Кота

Карма: 17
Рейтинг сообщений: 11
Зарегистрирован: Пт янв 12, 2007 11:21:39
Сообщений: 13115
Откуда: Томск
Рейтинг сообщения: 0
Я на AVR Си не применяю, но вот любопытная ситуация произошла. На родственном форуме у студента возникла прооблема с точками "остановки". Я по доброте душевной :) , хоть в этом и не шибко секу, посоветовал ему обратить взор на volatile - не исключено, что компилятор оптимизнул - выбросил этот бессмысленный с его точки зрения фрагмент.
СпойлерНужна помощь! При составление программы на языке С+ возникает проблема с точками остановки. Может кто подскажет что я делаю не так.
Код:
#include "compiler.h"
#include <avr/interrupt.h>
#include "conf_example.h"

// Only use Pin Change Interrupt handler for devices supporting this.
#ifdef EXAMPLE_PCINT_vect


ISR(EXAMPLE_PCINT_vect)
{

PIND = (1 << PIND0);
}

#endif


int main(void)
{

uint8_t val;

DDRD = 0xff;

// Set output levels high. Will turn off STK600 LEDs.
PORTD = 0xff;

// Set output levels low. Will turn on STK600 LEDs.
PORTD = 0;

PORTB = 0xff;

val = PINB;

while (1)
{
PORTD |= (1 << PORTD0);

PORTD &= ~(1 << PORTD0);
}
}

А мне стало интересно: как "заволатилить" порт?


Не очень понятно о каком именно фрагменте речь.

val - обычная переменная и компилер может её выбрасить, как неиспользуемую. Всё по правилам.

PORTx и PINx - волатильные. Их не должен выбросить.

Добавлено after 2 minutes 4 seconds:
Так что моя версия - ошибочная ? А как же тогда в примере SfS (от 16.01) из-за UDR произошёл такой казус? Ведь UDR - это тоже регистр. Хотя чисто по логике, может, не в volatile дело? Загрузив байт в UDR, следовало бы дождаться флага готовности перед загрузкой следующего.


Мои примеры - абстрактные - НЕ ДЛЯ AVR. И там оговорено, что UDR - это регистр записи-чтения FIFO-буфера.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 64 ]    , 2, ,  

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


Кто сейчас на форуме

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


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

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


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y