STM32 новичку в ARM что к чему
А то, что лежит по этому адресу определяется типом данных. И тогда линковщик просто проверят, чтобы по этому адресу был именно тот тип данных? А если , условно говоря, все данные представляются нулями и единицами, то как потом программа понимает, что у нее именно действительные числа записаны, а не строка? Как он потом отличает эти нули и единицы?
Станислав
- Реклама
так да, в конечном итоге от программиста все и зависит.VladislavS писал(а):Особенно, если программист приложил усилия, чтобы компилятор видел больше.
в общем, если LTO не использовать, ничего компилятор не видит, если ничегонеделающая функция находится в другом модуле. а с LTO не обманешь - проверил, правда, на avr-gcc.
что ж, дискуссия для меня оказалась полезной, очередной вклад в копилочку знаний, спасибо всем, кто разъяснял.
Добавлено after 1 minute 52 seconds:
проверка типов это задача компилятора, линковщик тупо адреса подставляетСКАЗОЧНИК писал(а):И тогда линковщик просто проверят, чтобы по этому адресу был именно тот тип данных?
как в программе вы написали, так эти нули и единицы и трактуются, это не компилятора вопрос, а программистаСКАЗОЧНИК писал(а):как потом программа понимает, что у нее именно действительные числа записаны, а не строка?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="ARV",url="/forum/viewtopic.php?p=3896058#p3896058"]в общем, если LTO не использовать, ничего компилятор не видит, если ничегонеделающая функция находится в другом модуле. а с LTO не обманешь - проверил, правда, на avr-gcc.[/uquote]
Помимо LTO есть еще Whole Program Optimization(-fwhole-program) которая делает примерно то же самое.
Помимо LTO есть еще Whole Program Optimization(-fwhole-program) которая делает примерно то же самое.
[uquote="ARV",url="/forum/viewtopic.php?p=3896058#p3896058"]в общем, если LTO не использовать, ничего компилятор не видит[/uquote]
А если для Вашей целевой архитектуры будет кодогенератор из LLVM, то там возникнет еще один этап оптимизации - уже на уровне IR кода после линковки. И без volatile он там такого накое может наоптимизячить, что действительно буфера в памяти не найдете )
А если для Вашей целевой архитектуры будет кодогенератор из LLVM, то там возникнет еще один этап оптимизации - уже на уровне IR кода после линковки. И без volatile он там такого накое может наоптимизячить, что действительно буфера в памяти не найдете )
когда-то я пытался сравнить эти варианты... в применении avr-gcc разных версий всегда получал один и тот же результат: не работала либо одна, либо другая оптимизация. не работала - в смысле компиляция выдавала какие-то ошибки.Reflector писал(а):Помимо LTO есть еще Whole Program Optimization(-fwhole-program) которая делает примерно то же самое
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
Я просто подумал, что проблема моя (может и многих) в понимании указателей (или тех же структур), в том, что нет понимания, как это происходит в железе... Т.е. что мы видим в программном коде - это одно. Это для удобства понимания сделано. А комп это как-то по своему обрабатывает.
Всегда раньше почему-то думал, что имя переменной тоже где-то хранится.
Позже через некоторые ассемблерные (дизассемблерные) листинги стало понятно, что нет имен в программе. Если четко понимать связь того, что написано пером и преобразовано в компьютерный язык, то придет и понимание размещения в памяти всего.
Всегда раньше почему-то думал, что имя переменной тоже где-то хранится.
Станислав
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3896046#p3896046"]Т.е. если я вместо имени буду в теории писать просто адрес в памяти, то это будет тоже самое?[/uquote]
Адрес в памяти - это числовая константа. Просто так вместо имени ее писать нельзя. Ее сначала нужно определить как указатель на необходимый тип и присвоить значение по этому указателю:
[uquote="a5021",url="/forum/viewtopic.php?p=3896016#p3896016"][uquote="КРАМ",url="/forum/viewtopic.php?p=3895980#p3895980"]А почитать?[/uquote]
Вы в курсе, что вы приплыли ? Приплыли вместе с автором вашего букваря. Я ж не зря спрашивал.[/uquote]
Спрашивал о чём?
Если о:
,то это указатель на volatile char-переменную
А volatile-указатель будет:
Куда мы "с автором" приплыли Вам виднее. Моряки - ходят, а не плавают.
[uquote="a5021",url="/forum/viewtopic.php?p=3896016#p3896016"]
Да, в моих руках всё. Но разговор был о ваших.
По существу есть что сказать?
Адрес в памяти - это числовая константа. Просто так вместо имени ее писать нельзя. Ее сначала нужно определить как указатель на необходимый тип и присвоить значение по этому указателю:
Код: Выделить всё
*(uint32_t*)0x...address... = 0x1234;Вы в курсе, что вы приплыли ? Приплыли вместе с автором вашего букваря. Я ж не зря спрашивал.[/uquote]
Спрашивал о чём?
Если о:
Код: Выделить всё
volatile char * buffer;А volatile-указатель будет:
Код: Выделить всё
char * volatile buffer;[uquote="a5021",url="/forum/viewtopic.php?p=3896016#p3896016"]
Все в ваших руках.[/uquote]Меня за идиота не нужно держать....
Да, в моих руках всё. Но разговор был о ваших.
По существу есть что сказать?
- Сообщения: 6517
- Зарегистрирован: Сб янв 28, 2006 22:47:24
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3896051#p3896051"]А то, что лежит по этому адресу определяется типом данных. И тогда линковщик просто проверят, чтобы по этому адресу был именно тот тип данных? А если , условно говоря, все данные представляются нулями и единицами, то как потом программа понимает, что у нее именно действительные числа записаны, а не строка? Как он потом отличает эти нули и единицы?[/uquote]
ИМХО, программа в двоичных кодах в процессоре вообще ничего не различает, а тупо выполняется по командам из памяти программ. Пойти по такому то адресу в память данных - взять то и то - отправить в АЛУ - сложить - результат сохранить в ОЗУ по определенному адресу. После работы препроцессора, линковщика и компилятора нету там ни типов, ни структур, ни переменных, и нет вообще ничего привычного из того, что мы видим в редакторе IDE.
ИМХО, программа в двоичных кодах в процессоре вообще ничего не различает, а тупо выполняется по командам из памяти программ. Пойти по такому то адресу в память данных - взять то и то - отправить в АЛУ - сложить - результат сохранить в ОЗУ по определенному адресу. После работы препроцессора, линковщика и компилятора нету там ни типов, ни структур, ни переменных, и нет вообще ничего привычного из того, что мы видим в редакторе IDE.
Астролябия-сама меряет, было бы что мерять!!!
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="КРАМ",url="/forum/viewtopic.php?p=3896108#p3896108"]
,то это указатель на volatile char-переменную
А volatile-указатель будет:
Куда мы "с автором" приплыли Вам виднее.[/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]
По существу, вы процитировали лажу.
Код: Выделить всё
volatile char * buffer;А volatile-указатель будет:
Код: Выделить всё
char * volatile buffer;ща и вам виднее станет. Ваши слова и цитата вашего "умника":
[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]
По существу, вы процитировали лажу.
позвольте еще один глупый вопрос:
объявление функции:
"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"
так ?
объявление функции:
"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"
так ?
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Asmodey",url="/forum/viewtopic.php?p=3896179#p3896179"]После работы препроцессора, линковщика и компилятора нету там ни типов, ни структур, ни переменных, и нет вообще ничего привычного из того, что мы видим в редакторе IDE.[/uquote]Вообще говоря, это не так. В С++, например, есть технология Run Time Type Information. Она позволяет получать имя типа переменных и объектов во время выполнения.
Очередной тупой вопрос от меня...
На многих сайтах с описанием языка Си, вижу пример объявления какой-либо функции на именем Foo. Почему именно такое имя?
На многих сайтах с описанием языка Си, вижу пример объявления какой-либо функции на именем Foo. Почему именно такое имя?
Станислав
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
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/
https://tproger.ru/articles/foo-bar-history/
[uquote="a5021",url="/forum/viewtopic.php?p=3896183#p3896183"]Читайте по буквам:[/uquote]
Чукча - писатель... Может стоит прочесть первоисточник ПОСЛЕ многоточия в цитате?
Несете какую то рандомную хрень...
Тимофеев совершенно определенно объясняет необходимость использования указателей на volatile в случае возможности присвоения им адресов volatile-переменных. И приводит ДВА примера - ошибочный и правильный.
То есть квалификатор volatile должен быть и у переменной и у указателя на нее. Что не так?
ЗЫ. Вам стоит познакомиться с автором текста по ссылке, кстати. Заочно, конечно. Прежде чем быковать. А то ведь стыдно будет, любезный...
Чукча - писатель... Может стоит прочесть первоисточник ПОСЛЕ многоточия в цитате?
Несете какую то рандомную хрень...
Тимофеев совершенно определенно объясняет необходимость использования указателей на volatile в случае возможности присвоения им адресов volatile-переменных. И приводит ДВА примера - ошибочный и правильный.
То есть квалификатор volatile должен быть и у переменной и у указателя на нее. Что не так?
ЗЫ. Вам стоит познакомиться с автором текста по ссылке, кстати. Заочно, конечно. Прежде чем быковать. А то ведь стыдно будет, любезный...
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="КРАМ",url="/forum/viewtopic.php?p=3896303#p3896303"]Чукча - писатель... Может стоит прочесть первоисточник ПОСЛЕ многоточия в цитате?
Несете какую то рандомную хрень...
[/uquote]
И понеслось дерьмо по трубам. Вы одним термином назвали разное. Я точно показал, что именно. Обтекайте теперь оба. Голосите про "рандомную херь". Фигли вам остается.
volatile unsigned int *Port -- это тот самый обычный (не volatile) указатель на volatile переменую. Вы так сами сказали. Вот и разберитесь со своим Тимофеевым, у кого из вас двоих "распространненая ошибка" случилась.
А теперь идите и посмотрите на "правильный пример" вашего Тихонова. Так кто из вас двоих лажает?
Несете какую то рандомную хрень...
И понеслось дерьмо по трубам. Вы одним термином назвали разное. Я точно показал, что именно. Обтекайте теперь оба. Голосите про "рандомную херь". Фигли вам остается.
Вот в этой фразе? "Также распространенной ошибкой является использование обычного (не volatile) указателя на volatile-переменную." Так я вам открою глаза, что использование обычного указателя на volatile является правильной практикой, а не "распространенной ошибкой".Тимофеев совершенно определенно объясняет необходимость использования указателей на volatile в случае возможности присвоения им адресов volatile-переменных.
volatile unsigned int *Port -- это тот самый обычный (не volatile) указатель на volatile переменую. Вы так сами сказали. Вот и разберитесь со своим Тимофеевым, у кого из вас двоих "распространненая ошибка" случилась.
Вы в курсе, что вязните все глубже? Ваше "volatile должен быть и у переменной и у указателя на нее" тогда будет выглядеть так:И приводит ДВА примера - ошибочный и правильный.
То есть квалификатор volatile должен быть и у переменной и у указателя на нее. Что не так?
Код: Выделить всё
volatile unsigned int * volatile PortЯ без вас разберусь, с кем мне знакомиться. И понты свои приберите дешевые. Быдлецой какой-то повеяло.Вам стоит познакомиться с автором текста по ссылке, кстати. Заочно, конечно. Прежде чем быковать. А то ведь стыдно будет, любезный...
Чудовищный демагог и шулер. Сам выдумывает, сам и отрицает.
Почему из моих слов вы опустили слово квалификатор, начав цитату с volatile?
Что я имел ввиду вы отлично поняли, как и то, что имел ввиду Тимофеев. Но продолжаете кривляться.
Почему из моих слов вы опустили слово квалификатор, начав цитату с volatile?
Что я имел ввиду вы отлично поняли, как и то, что имел ввиду Тимофеев. Но продолжаете кривляться.
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Если честно, то Тимофеев допустил ляп в процитированном абзаце. Но дальше по тексту все подробно разжёвывает с правильными примерами где volatile буфер, а где volatile указатель.
При всём при этом, это никак не влияет на ненужность volatile в параметрах HAL-овской функции, с которой начиналась дискуссия. С обсуждения которой так упорно соскальзывает на личности аппонент.
При всём при этом, это никак не влияет на ненужность volatile в параметрах HAL-овской функции, с которой начиналась дискуссия. С обсуждения которой так упорно соскальзывает на личности аппонент.
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="КРАМ",url="/forum/viewtopic.php?p=3896357#p3896357"]Чудовищный демагог и шулер. Сам выдумывает, сам и отрицает.[/uquote]
Да ладно вам плакать. Я цитировал вас обоих и теперь уже дважды повторил, где и кто слажал. Что вы возразили по существу? Ничего! Только персональные наезды. Оно и понятно.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3896366#p3896366"]При всём при этом, это никак не влияет на ненужность volatile в параметрах HAL-овской функции, с которой начиналась дискуссия.[/uquote]
То, что компилятор выдает предупреждения на абсолютно правильные передаваемые параметры вас не смущает? Это и есть точка непонимания.
Да ладно вам плакать. Я цитировал вас обоих и теперь уже дважды повторил, где и кто слажал. Что вы возразили по существу? Ничего! Только персональные наезды. Оно и понятно.
У вас галлюцинации? Разуйте глаза: я цитировал вас и вашего визави целиком. Причем, уже не один раз.Почему из моих слов вы опустили слово квалификатор, начав цитату с volatile?
Ваш Тимофеев сказал одно, в то время, как хотел сказать совсем другое. Такое бывает, когда недостает квалификации. Ваши отчаянные вопли ни ему, ни вам никак не помогут -- из песни слов не выкинешь.Что я имел ввиду вы отлично поняли, как и то, что имел ввиду Тимофеев. Но продолжаете кривляться.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3896366#p3896366"]При всём при этом, это никак не влияет на ненужность volatile в параметрах HAL-овской функции, с которой начиналась дискуссия.[/uquote]
То, что компилятор выдает предупреждения на абсолютно правильные передаваемые параметры вас не смущает? Это и есть точка непонимания.
Повторение этой фразы каждый раз показывает лишь то, как вы тщетно стараетесь наскрести хоть какого-нибудь дерьмеца.С обсуждения которой так упорно соскальзывает на личности аппонент.
- Сообщения: 1849
- Зарегистрирован: Вс дек 25, 2016 08:34:54
И так имеем
Но это не всеЯ, конечно не селен в магических числах, но это все как-то работает.
Меняюи получаю предупреждение компилятораУважаемый a5021, в чем проблема и как решить ее?
Код: Выделить всё
uint8_t DMABuffer[24];
/* Write to DMAy Channelx CNDTR */
DMA1_Channel3->CNDTR = sizeof(DMABuffer);
/* Write to DMAy Channelx CPAR */
DMA1_Channel3->CPAR = (uint32_t) & (TIM3->CCR4);
/* Write to DMAy Channelx CMAR */
DMA1_Channel3->CMAR = (uint32_t) DMABuffer;
Код: Выделить всё
volatile bool ws_status;
/* Handles DMA1_Channel3 interrupt request */
void DMA1_Channel2_3_IRQHandler(void)
{
DMA1->IFCR = DMA1_IT_GL3; /* Clear all interrupt flags */
ws_status = 1;
}
и там в коде где-то
memset(DMABuffer, 0, (sizeof(DMABuffer)));
/* сброс */
ws_status = 0;
while(!ws_status){}; // ждать изменение состояния ws_status = 1
ws_status = 0;
ну и сама загрузка буфера
DMABuffer[i] = g & mask ? PULSE_HIGH : PULSE_LOW;
Меняю
Код: Выделить всё
uint8_t DMABuffer[24];
на volatile uint8_t DMABuffer[24];Код: Выделить всё
warning: passing argument 1 of 'memset' discards 'volatile' qualifier from pointer target type [enabled by default]- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="a5021",url="/forum/viewtopic.php?p=3896374#p3896374"]То, что компилятор выдает предупреждения на абсолютно правильные передаваемые параметры вас не смущает?[/uquote]Ни капли, приведение типов обыденная для С программиста процедура, выполняемая много раз в день.


