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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 25894
Зарегистрирован: Чт янв 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]
Меня за идиота не нужно держать....
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 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() делает. Если ничего полезного, то ее можно выкинуть, если вызывается в одном месте, то ее можно заинлайнить, если вызывается в разных местах, но размер функции относительно небольшой, то можно заинлайнить везде...
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

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

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

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

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

Сообщение a5021 »

В общих чертах все так. Только не компилятор, а линковщик адрес проставляет.
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

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

Сообщение ARV »

VladislavS писал(а):Особенно, если программист приложил усилия, чтобы компилятор видел больше.
так да, в конечном итоге от программиста все и зависит.

в общем, если LTO не использовать, ничего компилятор не видит, если ничегонеделающая функция находится в другом модуле. а с LTO не обманешь - проверил, правда, на avr-gcc.

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

Добавлено after 1 minute 52 seconds:
СКАЗОЧНИК писал(а):И тогда линковщик просто проверят, чтобы по этому адресу был именно тот тип данных?
проверка типов это задача компилятора, линковщик тупо адреса подставляет
СКАЗОЧНИК писал(а):как потом программа понимает, что у нее именно действительные числа записаны, а не строка?
как в программе вы написали, так эти нули и единицы и трактуются, это не компилятора вопрос, а программиста
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="ARV",url="/forum/viewtopic.php?p=3896058#p3896058"]в общем, если LTO не использовать, ничего компилятор не видит, если ничегонеделающая функция находится в другом модуле. а с LTO не обманешь - проверил, правда, на avr-gcc.[/uquote]
Помимо LTO есть еще Whole Program Optimization(-fwhole-program) которая делает примерно то же самое.
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

[uquote="ARV",url="/forum/viewtopic.php?p=3896058#p3896058"]в общем, если LTO не использовать, ничего компилятор не видит[/uquote]
А если для Вашей целевой архитектуры будет кодогенератор из LLVM, то там возникнет еще один этап оптимизации - уже на уровне IR кода после линковки. И без volatile он там такого накое может наоптимизячить, что действительно буфера в памяти не найдете )
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Reflector писал(а):Помимо LTO есть еще Whole Program Optimization(-fwhole-program) которая делает примерно то же самое
когда-то я пытался сравнить эти варианты... в применении avr-gcc разных версий всегда получал один и тот же результат: не работала либо одна, либо другая оптимизация. не работала - в смысле компиляция выдавала какие-то ошибки.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Я просто подумал, что проблема моя (может и многих) в понимании указателей (или тех же структур), в том, что нет понимания, как это происходит в железе... Т.е. что мы видим в программном коде - это одно. Это для удобства понимания сделано. А комп это как-то по своему обрабатывает.

Всегда раньше почему-то думал, что имя переменной тоже где-то хранится. :oops: :facepalm: Позже через некоторые ассемблерные (дизассемблерные) листинги стало понятно, что нет имен в программе. Если четко понимать связь того, что написано пером и преобразовано в компьютерный язык, то придет и понимание размещения в памяти всего.
Станислав
Друг Кота
Аватара пользователя
Сообщения: 25894
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3896046#p3896046"]Т.е. если я вместо имени буду в теории писать просто адрес в памяти, то это будет тоже самое?[/uquote]
Адрес в памяти - это числовая константа. Просто так вместо имени ее писать нельзя. Ее сначала нужно определить как указатель на необходимый тип и присвоить значение по этому указателю:

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

*(uint32_t*)0x...address... = 0x1234;
[uquote="a5021",url="/forum/viewtopic.php?p=3896016#p3896016"][uquote="КРАМ",url="/forum/viewtopic.php?p=3895980#p3895980"]А почитать?[/uquote]
Вы в курсе, что вы приплыли ? Приплыли вместе с автором вашего букваря. Я ж не зря спрашивал.[/uquote]
Спрашивал о чём?
Если о:

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

volatile char * buffer;
,то это указатель на volatile char-переменную
А volatile-указатель будет:

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

char * volatile buffer;
Куда мы "с автором" приплыли Вам виднее. Моряки - ходят, а не плавают. :wink:
[uquote="a5021",url="/forum/viewtopic.php?p=3896016#p3896016"]
Меня за идиота не нужно держать....
Все в ваших руках.[/uquote]
Да, в моих руках всё. Но разговор был о ваших. :tea:
По существу есть что сказать?
Друг Кота
Аватара пользователя
Сообщения: 7060
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3896051#p3896051"]А то, что лежит по этому адресу определяется типом данных. И тогда линковщик просто проверят, чтобы по этому адресу был именно тот тип данных? А если , условно говоря, все данные представляются нулями и единицами, то как потом программа понимает, что у нее именно действительные числа записаны, а не строка? Как он потом отличает эти нули и единицы?[/uquote]
ИМХО, программа в двоичных кодах в процессоре вообще ничего не различает, а тупо выполняется по командам из памяти программ. Пойти по такому то адресу в память данных - взять то и то - отправить в АЛУ - сложить - результат сохранить в ОЗУ по определенному адресу. После работы препроцессора, линковщика и компилятора нету там ни типов, ни структур, ни переменных, и нет вообще ничего привычного из того, что мы видим в редакторе IDE.
Астролябия-сама меряет, было бы что мерять!!!
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3896108#p3896108"]

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

volatile char * buffer;
,то это указатель на volatile char-переменную
А volatile-указатель будет:

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

char * volatile buffer;
Куда мы "с автором" приплыли Вам виднее.[/uquote]
ща и вам виднее станет. Ваши слова и цитата вашего "умника":
[uquote="КРАМ",url="/forum/viewtopic.php?p=3895980#p3895980"]А почитать?
Указатели на volatile
Также распространенной ошибкой является использование обычного (не volatile) указателя на volatile-переменную. Чем это может нам навредить? Рассмотрим пример (из реальной программы), в котором был использован указатель на регистр порта ввода/вывода. Программа по SPI управляла двумя одинаковыми микросхемами, подключенными на разные выводы микроконтроллера, порт, к которому подключена активная микросхема, выбирался через указатель: .......
[/uquote]

Читайте по буквам: "ошибкой является использование обычного (не volatile) указателя на volatile-переменную". Ваш автор имеет ввиду просто указатель, ни на какой ни волатайл, но называет его точно, как вы -- "указатель на volatile", при этом он и вы одинаковым образом называете разное, а раз так, то это зашквар-зашквар. Говорю ж, приплыли.
Моряки - ходят, а не плавают.
Про ходят и плавает я в курсе.

[uquote="a5021",url="/forum/viewtopic.php?p=3896016#p3896016"]По существу есть что сказать?[/uquote]
По существу, вы процитировали лажу.
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

позвольте еще один глупый вопрос:

объявление функции:
"HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)"

объявление массива и вызов функции:
volatile uint8_t good_buffer[255];
HAL_SPI_Receive_DMA( *hspi, good_buffer, sizeof(good_buffer));

а как происходит подстановка параметров
"pData" на "volatile uint8_t good_buffer" т.е. с подстановкой читает: "uint8_t * volatile uint8_t good_buffer"
так ?
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="Asmodey",url="/forum/viewtopic.php?p=3896179#p3896179"]После работы препроцессора, линковщика и компилятора нету там ни типов, ни структур, ни переменных, и нет вообще ничего привычного из того, что мы видим в редакторе IDE.[/uquote]Вообще говоря, это не так. В С++, например, есть технология Run Time Type Information. Она позволяет получать имя типа переменных и объектов во время выполнения.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Очередной тупой вопрос от меня...

На многих сайтах с описанием языка Си, вижу пример объявления какой-либо функции на именем Foo. Почему именно такое имя?
Станислав
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Foo и bar произошли от армейского акронима времён Второй мировой, FUBAR — «Fucked Up Beyond All Recognition» (англ. «Разбито в хлам»). Во время кампаний в Северной Африке и Сицилии (1942–1943) возникло целое семейство таких сокращений, которые можно найти в книге Рика Эткинсона Day of Battle: The War in Sicily and Italy, 1943-1944. Например, сокращение JANFU означает «Joint Army Navy Fucked Up» (англ. «Союз армии и флота облажался»), и применялось, в частности, для описания инцидента 11 июля 1943 года, когда британский флот сбил 23 транспортных самолёта США с десантом.

https://tproger.ru/articles/foo-bar-history/
Друг Кота
Аватара пользователя
Сообщения: 25894
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

[uquote="a5021",url="/forum/viewtopic.php?p=3896183#p3896183"]Читайте по буквам:[/uquote]
Чукча - писатель... Может стоит прочесть первоисточник ПОСЛЕ многоточия в цитате?
Несете какую то рандомную хрень... :facepalm:
Тимофеев совершенно определенно объясняет необходимость использования указателей на volatile в случае возможности присвоения им адресов volatile-переменных. И приводит ДВА примера - ошибочный и правильный.
То есть квалификатор volatile должен быть и у переменной и у указателя на нее. Что не так?
ЗЫ. Вам стоит познакомиться с автором текста по ссылке, кстати. Заочно, конечно. Прежде чем быковать. А то ведь стыдно будет, любезный...
Ответить

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