Если вы предпочитаете верования знаниям -- ваше право. Ссылки на то, что буфера под DMA должны быть Volatile я приводил. Если бы статик был "неоптимизируемым", никакой волатайл никогда бы не потребовался. Ему просто не нашлось бы применения.
STM32 новичку в ARM что к чему
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="ARV",url="/forum/viewtopic.php?p=3895773#p3895773"]то есть вы хотите сказать, что если я напишу static char buf[128]; то компилятор сможет его "соптимизировать", даже если я использую ссылку на него?! по-моему, это уже из области фантастики.[/uquote]
Если вы предпочитаете верования знаниям -- ваше право. Ссылки на то, что буфера под DMA должны быть Volatile я приводил. Если бы статик был "неоптимизируемым", никакой волатайл никогда бы не потребовался. Ему просто не нашлось бы применения.
Если вы предпочитаете верования знаниям -- ваше право. Ссылки на то, что буфера под DMA должны быть Volatile я приводил. Если бы статик был "неоптимизируемым", никакой волатайл никогда бы не потребовался. Ему просто не нашлось бы применения.
- Реклама
а если задавать объем буфера не "...[255]", а например [4]
компиль все равно будет кидать предупреждения?
компиль все равно будет кидать предупреждения?
собственно, ваши ссылки так же из области верований... я пытаюсь понять, почему так, а вы просто веруете в "авторитетные источники".a5021 писал(а):Если вы предпочитаете верования знаниям -- ваше право
вы невнимательно прочитали: не статик играет роль, а ссылка на буфер. если в коде есть ссылки на буфер, компилятор не должен (имхо) никак в целях оптимизации его выбрасывать как минимум. и, как мне кажется, передача адреса буфера в любую функцию уже говорит компилятору о том, что нельзя так просто взять и "оптимизировать" буфер, ибо что там внутри функции делается, компилятор не знает.a5021 писал(а):Если бы статик был "неоптимизируемым"
я, конечно, не раз сталкивался с тем, что логика и язык Си вещи, пересекающиеся между собой весьма причудливым, нелинейным образом... но надеюсь, что все-таки в этом вопросе логика компилятора логична
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="ARV",url="/forum/viewtopic.php?p=3895815#p3895815"]собственно, ваши ссылки так же из области верований... я пытаюсь понять, почему так, а вы просто веруете в "авторитетные источники".[/uquote]
Для соревнования в демагогии ищите другого собеседника.
[uquote="a797945",url="/forum/viewtopic.php?p=3895806#p3895806"]а если задавать объем буфера не "...[255]", а например [4]
компиль все равно будет кидать предупреждения?[/uquote]
Что должно измениться, по вашему?
Для соревнования в демагогии ищите другого собеседника.
Вот скажите, что является основанием для таких заключений? Ваше личное мироощущение или есть что-то более осязаемое? Почему буфер, ссылка, что-угодно не могут подвергнутся сокращению, если с точки зрения компилятора это никак не используется и впустую занимает место? Каким волшебным свойством обладает "ссылка на буфер", что ее нельзя взять и выбросить к едреням?вы невнимательно прочитали: не статик играет роль, а ссылка на буфер. если в коде есть ссылки на буфер, компилятор не должен (имхо) никак в целях оптимизации его выбрасывать
[uquote="a797945",url="/forum/viewtopic.php?p=3895806#p3895806"]а если задавать объем буфера не "...[255]", а например [4]
компиль все равно будет кидать предупреждения?[/uquote]
Что должно измениться, по вашему?
изменится ли
сам проверить не могу
просто предложил
пишу кратко чтоб демагогию не разводить
сам проверить не могу
просто предложил
пишу кратко чтоб демагогию не разводить
- Реклама
потому что компилятор не может никаким способом узнать, что и как делает со ссылкой функция, следовательно, должен исходить из наихудшего сценария, т.е. считать, что данные по ссылке нужны.a5021 писал(а):Почему буфер, ссылка, что-угодно не могут подвергнутся сокращению, если с точки зрения компилятора это никак не используется и впустую занимает место?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="a5021",url="/forum/viewtopic.php?p=3895786#p3895786"]Ссылки на то, что буфера под DMA должны быть Volatile я приводил.[/uquote]
Вопрос был про указатели, а не про сами буферы.
http://www.pic24.ru/doku.php/osa/articl ... r_chainiks
[uquote="a5021",url="/forum/viewtopic.php?p=3895786#p3895786"]буфера под DMA должны быть[/uquote]
БуферА у Маньки, а в МК бУферы...
Вопрос был про указатели, а не про сами буферы.
http://www.pic24.ru/doku.php/osa/articl ... r_chainiks
[uquote="a5021",url="/forum/viewtopic.php?p=3895786#p3895786"]буфера под DMA должны быть[/uquote]
БуферА у Маньки, а в МК бУферы...
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="ARV",url="/forum/viewtopic.php?p=3895906#p3895906"]потому что компилятор не может никаким способом узнать, что и как делает со ссылкой функция[/uquote]
А код функции компилирует не компилятор, а силы небесные? Вот так новость!
А код функции компилирует не компилятор, а силы небесные? Вот так новость!
да вы меня удивляете! функция может быть библиотечной, скомпилированной в другом модуле, динамически загружаемой... да даже в вашем, написанном исключительно руками без чужих либ коде, каждый модуль компилируется отдельно, и о том, что делает другой модуль, компилятор понятия не имеет, когда компилирует текущий!a5021 писал(а):А код функции компилирует не компилятор, а силы небесные?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="КРАМ",url="/forum/viewtopic.php?p=3895921#p3895921"]Вопрос был про указатели, а не про сами буферы.[/uquote]
Ну-ка, ну-ка... Вот такая запись:
о чем говорит? Это сам указатель volatile или volatile -- это область, на которую он указывает?
[uquote="ARV",url="/forum/viewtopic.php?p=3895933#p3895933"]да вы меня удивляете![/uquote]
А уж вы-то меня как, не передать.
чтобы функции стать "библиотечной, скомпилированной в другом модуле" потребно чудо или все-таки компилятор? догадайтесь, что этот самый компилятор сделает со всем, что в функции на его взгляд не используется? Ну простые же вещи, чтобы так вот лажать на ровном месте.
Ну-ка, ну-ка... Вот такая запись:
Код: Выделить всё
volatile char * buffer;Да-да, главное букварем трясти, если ни с чем другим не сложилось.[http://www.pic24.ru/doku.php/osa/articles/volatile_for_chainiks
Благодарю, что вы нашли время сообщить об этом. Маньке привет.БуферА у Маньки, а в МК бУферы...
[uquote="ARV",url="/forum/viewtopic.php?p=3895933#p3895933"]да вы меня удивляете![/uquote]
А уж вы-то меня как, не передать.
"динамически-загружаемой" ? в эмбеде? покажете?функция может быть библиотечной, скомпилированной в другом модуле, динамически загружаемой...
чтобы функции стать "библиотечной, скомпилированной в другом модуле" потребно чудо или все-таки компилятор? догадайтесь, что этот самый компилятор сделает со всем, что в функции на его взгляд не используется? Ну простые же вещи, чтобы так вот лажать на ровном месте.
а что, для эмбеда компиляторы какие-то особые, не так работают, как не-для-эмбеда? ну и потом, линух крутится в миллионах эмбеддед-устройствах, наверняка хоть где-то, да есть и динамически подгружаемые библиотеки... хотя это, конечно, мои предположения.a5021 писал(а):"динамически-загружаемой" ? в эмбеде? покажете?
так я об этом и говорю: компилятор собирает функцию, которая получает указаель на какую-то не-volatile память - откуда он узнает, что эта память на самом деле в других местах не нужна и будет выброшена? не узнает, он скомпилирует функцию так, как будто память выделена и востребована.a5021 писал(а):догадайтесь, что этот самый компилятор сделает со всем, что в функции на его взгляд не используется?
в другом модуле вызывается эта уже скомпилированная функция, и ей передается указател на выделенную память - может компилятор знать, будет функция писать/читать эту память или нет? даже если не будет - компилятору это неизвестно, и он, видя, что указатель на блок памяти куда-то передается, обязан предполагать, что это не зря сделано.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Справедливости ради, нужно сказать, что в последнее время сильно продвинулись техники LTO (оптимизации при связывании). Поэтому, если и сама библиотека, и программа, её использующие, комплируются одновременно, то заинлайниться или быть выброшенной из прошивки может и библиотечная (вроде бы сторонняя) функция.
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="ARV",url="/forum/viewtopic.php?p=3895941#p3895941"]а что, для эмбеда компиляторы какие-то особые, не так работают, как не-для-эмбеда?[/uquote]
Таки да. Но я с радостью переменю свое мнение, если вы явите миру динамическую библиотеку, скомпилированную с помощью, скажем, arm-none-eabi.
Таки да. Но я с радостью переменю свое мнение, если вы явите миру динамическую библиотеку, скомпилированную с помощью, скажем, arm-none-eabi.
Раз и в руках фокусника из ниоткуда возник линух. Совсем дело плохо, что так метаться приходится? Вроде ж раньше только про HAL говорили.ну и потом, линух крутится в миллионах эмбеддед-устройствах
Библиотеки -- это те же объектные файлы, где содержится информация о коде, символических именах, переменных и прочем. Все на ладони, можно сказать. Так что это отнюдь не черный ящик. Но давайте вы не будете метаться и ограничимся случаем, когда все функции передаются в исходных кодах и компилятор переваривает их последовательно. Как по вашему, компилятор в этом случае может определить, что и как ему следует оптимизировать?так я об этом и говорю: компилятор собирает функцию, которая получает указаель на какую-то не-volatile память - откуда он узнает, что эта память на самом деле в других местах не нужна и будет выброшена?
вот смотрите, какой пример.a5021 писал(а):Как по вашему, компилятор в этом случае может определить, что и как ему следует оптимизировать?
есть функция printf, получает в параметрах НЕ-volatile указатели на символ. когда я пишу
Код: Выделить всё
#include <stdio.h>
static const char *s = "Hello, world";
int main{
printf(s);
}так, по-вашему?
Добавлено after 4 minutes 58 seconds:
кстати, вывод printf вполне где-то в недрах ОС может кончаться именно DMA-передачей... и чо?
Добавлено after 11 minutes 3 seconds:
а теперь заменим printf на вашу HAL_DMA_что_то_там_инит - что изменится?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
[uquote="a5021",url="/forum/viewtopic.php?p=3895936#p3895936"]Да-да, главное букварем трясти, если ни с чем другим не сложилось.[/uquote]
А почитать?
Также распространенной ошибкой является использование обычного (не volatile) указателя на volatile-переменную. Чем это может нам навредить? Рассмотрим пример (из реальной программы), в котором был использован указатель на регистр порта ввода/вывода. Программа по SPI управляла двумя одинаковыми микросхемами, подключенными на разные выводы микроконтроллера, порт, к которому подключена активная микросхема, выбирался через указатель: .......
[uquote="a5021",url="/forum/viewtopic.php?p=3895936#p3895936"]Ну-ка, ну-ка... Вот такая запись:[/uquote]
Меня за идиота не нужно держать....
А почитать?
Спойлер
Указатели на volatileТакже распространенной ошибкой является использование обычного (не volatile) указателя на volatile-переменную. Чем это может нам навредить? Рассмотрим пример (из реальной программы), в котором был использован указатель на регистр порта ввода/вывода. Программа по SPI управляла двумя одинаковыми микросхемами, подключенными на разные выводы микроконтроллера, порт, к которому подключена активная микросхема, выбирался через указатель: .......
Меня за идиота не нужно держать....
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="ARV",url="/forum/viewtopic.php?p=3895968#p3895968"]компилятор видит, что какой-то массив символов (точнее, его адрес) передается в какую-то функцию, и более нигде никак не используется. и сам массив символов тоже не-volatile. компилятор думает: вот ведь хрень какая: выделили память, инициализировали её символами, подали в какую-то функцию, которая явно нихрена полезного не делает, так как после этого сразу конец main - давай-ка я её "оптимизирую"?
так, по-вашему?[/uquote]Если компилятор видит, что функция ничего не делает, то именно так и будет. А компиляторы сейчас очень многое умеют видеть. Особенно, если программист приложил усилия, чтобы компилятор видел больше.
Листинг
так, по-вашему?[/uquote]Если компилятор видит, что функция ничего не делает, то именно так и будет. А компиляторы сейчас очень многое умеют видеть. Особенно, если программист приложил усилия, чтобы компилятор видел больше.
Код: Выделить всё
void foo(const char *s)
{
*s;
}
static const char *s = "Hello, world";
int main()
{
foo(s);
for(;;);
}Код: Выделить всё
//void foo(const char *s)
//{
// *s;
//}
_Z3fooPKc:
BX LR ;; return
// 8 static const char *s = "Hello, world";
//int main()
//{
// foo(s);
// for(;;);
main:
??main_0:
B.N ??main_0
//}- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ARV",url="/forum/viewtopic.php?p=3895968#p3895968"]компилятор видит, что какой-то массив символов (точнее, его адрес) передается в какую-то функцию, и более нигде никак не используется. и сам массив символов тоже не-volatile. компилятор думает: вот ведь хрень какая: выделили память, инициализировали её символами, подали в какую-то функцию, которая явно нихрена полезного не делает, так как после этого сразу конец main - давай-ка я её "оптимизирую"?[/uquote]
Сначала компилятор сформирует промежуточное представление кода, в котором вызов printf() будет, а оптимизацией он может заниматься когда скомпилирует всю программу и будет знать что эта printf() делает. Если ничего полезного, то ее можно выкинуть, если вызывается в одном месте, то ее можно заинлайнить, если вызывается в разных местах, но размер функции относительно небольшой, то можно заинлайнить везде...
Сначала компилятор сформирует промежуточное представление кода, в котором вызов printf() будет, а оптимизацией он может заниматься когда скомпилирует всю программу и будет знать что эта printf() делает. Если ничего полезного, то ее можно выкинуть, если вызывается в одном месте, то ее можно заинлайнить, если вызывается в разных местах, но размер функции относительно небольшой, то можно заинлайнить везде...
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="КРАМ",url="/forum/viewtopic.php?p=3895980#p3895980"]А почитать?[/uquote]
Вы в курсе, что вы приплыли ? Приплыли вместе с автором вашего букваря. Я ж не зря спрашивал.
Вы в курсе, что вы приплыли ? Приплыли вместе с автором вашего букваря. Я ж не зря спрашивал.
Все в ваших руках.Меня за идиота не нужно держать....
Пока вы тут сретесь, т.е. разбираетесь в пока сложных для меня вещах. ) Можете параллельно ответить, правильно ли до меня доходит, что в Си имя переменной, которое я задал, обозначает некий участок памяти, в котором хранится значение этой переменной. А компилятору на это имя практически пофигу, т.к. в процессе создания исходного файла, он вместо имени тупо поставит ее адрес везде?
Т.е. если я вместо имени буду в теории писать просто адрес в памяти, то это будет тоже самое?
Т.е. если я вместо имени буду в теории писать просто адрес в памяти, то это будет тоже самое?
Станислав
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
В общих чертах все так. Только не компилятор, а линковщик адрес проставляет.


