STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3895773#p3895773"]то есть вы хотите сказать, что если я напишу static char buf[128]; то компилятор сможет его "соптимизировать", даже если я использую ссылку на него?! по-моему, это уже из области фантастики.[/uquote]
Если вы предпочитаете верования знаниям -- ваше право. Ссылки на то, что буфера под DMA должны быть Volatile я приводил. Если бы статик был "неоптимизируемым", никакой волатайл никогда бы не потребовался. Ему просто не нашлось бы применения.
Реклама
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

а если задавать объем буфера не "...[255]", а например [4]
компиль все равно будет кидать предупреждения?
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18694
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

a5021 писал(а):Если вы предпочитаете верования знаниям -- ваше право
собственно, ваши ссылки так же из области верований... я пытаюсь понять, почему так, а вы просто веруете в "авторитетные источники".
a5021 писал(а):Если бы статик был "неоптимизируемым"
вы невнимательно прочитали: не статик играет роль, а ссылка на буфер. если в коде есть ссылки на буфер, компилятор не должен (имхо) никак в целях оптимизации его выбрасывать как минимум. и, как мне кажется, передача адреса буфера в любую функцию уже говорит компилятору о том, что нельзя так просто взять и "оптимизировать" буфер, ибо что там внутри функции делается, компилятор не знает.

я, конечно, не раз сталкивался с тем, что логика и язык Си вещи, пересекающиеся между собой весьма причудливым, нелинейным образом... но надеюсь, что все-таки в этом вопросе логика компилятора логична :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3895815#p3895815"]собственно, ваши ссылки так же из области верований... я пытаюсь понять, почему так, а вы просто веруете в "авторитетные источники".[/uquote]
Для соревнования в демагогии ищите другого собеседника.
вы невнимательно прочитали: не статик играет роль, а ссылка на буфер. если в коде есть ссылки на буфер, компилятор не должен (имхо) никак в целях оптимизации его выбрасывать
Вот скажите, что является основанием для таких заключений? Ваше личное мироощущение или есть что-то более осязаемое? Почему буфер, ссылка, что-угодно не могут подвергнутся сокращению, если с точки зрения компилятора это никак не используется и впустую занимает место? Каким волшебным свойством обладает "ссылка на буфер", что ее нельзя взять и выбросить к едреням?

[uquote="a797945",url="/forum/viewtopic.php?p=3895806#p3895806"]а если задавать объем буфера не "...[255]", а например [4]
компиль все равно будет кидать предупреждения?[/uquote]
Что должно измениться, по вашему?
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

изменится ли
сам проверить не могу
просто предложил
пишу кратко чтоб демагогию не разводить
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18694
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25448
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[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]
БуферА у Маньки, а в МК бУферы... :)))
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3895906#p3895906"]потому что компилятор не может никаким способом узнать, что и как делает со ссылкой функция[/uquote]
А код функции компилирует не компилятор, а силы небесные? Вот так новость!
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18694
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

a5021 писал(а):А код функции компилирует не компилятор, а силы небесные?
да вы меня удивляете! функция может быть библиотечной, скомпилированной в другом модуле, динамически загружаемой... да даже в вашем, написанном исключительно руками без чужих либ коде, каждый модуль компилируется отдельно, и о том, что делает другой модуль, компилятор понятия не имеет, когда компилирует текущий!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3895921#p3895921"]Вопрос был про указатели, а не про сами буферы.[/uquote]
Ну-ка, ну-ка... Вот такая запись:

Код: Выделить всё

volatile char * buffer;
о чем говорит? Это сам указатель volatile или volatile -- это область, на которую он указывает?
[http://www.pic24.ru/doku.php/osa/articles/volatile_for_chainiks
Да-да, главное букварем трясти, если ни с чем другим не сложилось.
БуферА у Маньки, а в МК бУферы... :)))
Благодарю, что вы нашли время сообщить об этом. Маньке привет.

[uquote="ARV",url="/forum/viewtopic.php?p=3895933#p3895933"]да вы меня удивляете![/uquote]
А уж вы-то меня как, не передать.
функция может быть библиотечной, скомпилированной в другом модуле, динамически загружаемой...
"динамически-загружаемой" ? в эмбеде? покажете?

чтобы функции стать "библиотечной, скомпилированной в другом модуле" потребно чудо или все-таки компилятор? догадайтесь, что этот самый компилятор сделает со всем, что в функции на его взгляд не используется? Ну простые же вещи, чтобы так вот лажать на ровном месте.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18694
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

a5021 писал(а):"динамически-загружаемой" ? в эмбеде? покажете?
а что, для эмбеда компиляторы какие-то особые, не так работают, как не-для-эмбеда? ну и потом, линух крутится в миллионах эмбеддед-устройствах, наверняка хоть где-то, да есть и динамически подгружаемые библиотеки... хотя это, конечно, мои предположения.
a5021 писал(а):догадайтесь, что этот самый компилятор сделает со всем, что в функции на его взгляд не используется?
так я об этом и говорю: компилятор собирает функцию, которая получает указаель на какую-то не-volatile память - откуда он узнает, что эта память на самом деле в других местах не нужна и будет выброшена? не узнает, он скомпилирует функцию так, как будто память выделена и востребована.
в другом модуле вызывается эта уже скомпилированная функция, и ей передается указател на выделенную память - может компилятор знать, будет функция писать/читать эту память или нет? даже если не будет - компилятору это неизвестно, и он, видя, что указатель на блок памяти куда-то передается, обязан предполагать, что это не зря сделано.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Справедливости ради, нужно сказать, что в последнее время сильно продвинулись техники LTO (оптимизации при связывании). Поэтому, если и сама библиотека, и программа, её использующие, комплируются одновременно, то заинлайниться или быть выброшенной из прошивки может и библиотечная (вроде бы сторонняя) функция.
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3895941#p3895941"]а что, для эмбеда компиляторы какие-то особые, не так работают, как не-для-эмбеда?[/uquote]
Таки да. Но я с радостью переменю свое мнение, если вы явите миру динамическую библиотеку, скомпилированную с помощью, скажем, arm-none-eabi.
ну и потом, линух крутится в миллионах эмбеддед-устройствах
Раз и в руках фокусника из ниоткуда возник линух. Совсем дело плохо, что так метаться приходится? Вроде ж раньше только про HAL говорили.
так я об этом и говорю: компилятор собирает функцию, которая получает указаель на какую-то не-volatile память - откуда он узнает, что эта память на самом деле в других местах не нужна и будет выброшена?
Библиотеки -- это те же объектные файлы, где содержится информация о коде, символических именах, переменных и прочем. Все на ладони, можно сказать. Так что это отнюдь не черный ящик. Но давайте вы не будете метаться и ограничимся случаем, когда все функции передаются в исходных кодах и компилятор переваривает их последовательно. Как по вашему, компилятор в этом случае может определить, что и как ему следует оптимизировать?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18694
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

a5021 писал(а):Как по вашему, компилятор в этом случае может определить, что и как ему следует оптимизировать?
вот смотрите, какой пример.

есть функция printf, получает в параметрах НЕ-volatile указатели на символ. когда я пишу

Код: Выделить всё

#include <stdio.h>
static const char *s = "Hello, world";

int main{
   printf(s);
}
компилятор видит, что какой-то массив символов (точнее, его адрес) передается в какую-то функцию, и более нигде никак не используется. и сам массив символов тоже не-volatile. компилятор думает: вот ведь хрень какая: выделили память, инициализировали её символами, подали в какую-то функцию, которая явно нихрена полезного не делает, так как после этого сразу конец main - давай-ка я её "оптимизирую"?

так, по-вашему?

Добавлено after 4 minutes 58 seconds:
кстати, вывод printf вполне где-то в недрах ОС может кончаться именно DMA-передачей... и чо?

Добавлено after 11 minutes 3 seconds:
а теперь заменим printf на вашу HAL_DMA_что_то_там_инит - что изменится?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 25448
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

[uquote="a5021",url="/forum/viewtopic.php?p=3895936#p3895936"]Да-да, главное букварем трясти, если ни с чем другим не сложилось.[/uquote]
А почитать?
СпойлерУказатели на volatile
Также распространенной ошибкой является использование обычного (не volatile) указателя на volatile-переменную. Чем это может нам навредить? Рассмотрим пример (из реальной программы), в котором был использован указатель на регистр порта ввода/вывода. Программа по SPI управляла двумя одинаковыми микросхемами, подключенными на разные выводы микроконтроллера, порт, к которому подключена активная микросхема, выбирался через указатель: .......
[uquote="a5021",url="/forum/viewtopic.php?p=3895936#p3895936"]Ну-ка, ну-ка... Вот такая запись:[/uquote]
Меня за идиота не нужно держать....
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3895968#p3895968"]компилятор видит, что какой-то массив символов (точнее, его адрес) передается в какую-то функцию, и более нигде никак не используется. и сам массив символов тоже не-volatile. компилятор думает: вот ведь хрень какая: выделили память, инициализировали её символами, подали в какую-то функцию, которая явно нихрена полезного не делает, так как после этого сразу конец main - давай-ка я её "оптимизирую"?

так, по-вашему?[/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

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3895968#p3895968"]компилятор видит, что какой-то массив символов (точнее, его адрес) передается в какую-то функцию, и более нигде никак не используется. и сам массив символов тоже не-volatile. компилятор думает: вот ведь хрень какая: выделили память, инициализировали её символами, подали в какую-то функцию, которая явно нихрена полезного не делает, так как после этого сразу конец main - давай-ка я её "оптимизирую"?[/uquote]
Сначала компилятор сформирует промежуточное представление кода, в котором вызов printf() будет, а оптимизацией он может заниматься когда скомпилирует всю программу и будет знать что эта printf() делает. Если ничего полезного, то ее можно выкинуть, если вызывается в одном месте, то ее можно заинлайнить, если вызывается в разных местах, но размер функции относительно небольшой, то можно заинлайнить везде...
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3895980#p3895980"]А почитать?[/uquote]
Вы в курсе, что вы приплыли ? Приплыли вместе с автором вашего букваря. Я ж не зря спрашивал.
Меня за идиота не нужно держать....
Все в ваших руках.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Пока вы тут сретесь, т.е. разбираетесь в пока сложных для меня вещах. ) Можете параллельно ответить, правильно ли до меня доходит, что в Си имя переменной, которое я задал, обозначает некий участок памяти, в котором хранится значение этой переменной. А компилятору на это имя практически пофигу, т.к. в процессе создания исходного файла, он вместо имени тупо поставит ее адрес везде?

Т.е. если я вместо имени буду в теории писать просто адрес в памяти, то это будет тоже самое?
Станислав
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

В общих чертах все так. Только не компилятор, а линковщик адрес проставляет.
Ответить

Вернуться в «ARM»