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

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

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

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

Сообщение ARV »

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

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

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

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

Всегда раньше почему-то думал, что имя переменной тоже где-то хранится. :oops: :facepalm: Позже через некоторые ассемблерные (дизассемблерные) листинги стало понятно, что нет имен в программе. Если четко понимать связь того, что написано пером и преобразовано в компьютерный язык, то придет и понимание размещения в памяти всего.
Станислав
Реклама
Друг Кота
Аватара пользователя
Сообщения: 25447
Зарегистрирован: Чт янв 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:
По существу есть что сказать?
Друг Кота
Аватара пользователя
Сообщения: 6517
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3896051#p3896051"]А то, что лежит по этому адресу определяется типом данных. И тогда линковщик просто проверят, чтобы по этому адресу был именно тот тип данных? А если , условно говоря, все данные представляются нулями и единицами, то как потом программа понимает, что у нее именно действительные числа записаны, а не строка? Как он потом отличает эти нули и единицы?[/uquote]
ИМХО, программа в двоичных кодах в процессоре вообще ничего не различает, а тупо выполняется по командам из памяти программ. Пойти по такому то адресу в память данных - взять то и то - отправить в АЛУ - сложить - результат сохранить в ОЗУ по определенному адресу. После работы препроцессора, линковщика и компилятора нету там ни типов, ни структур, ни переменных, и нет вообще ничего привычного из того, что мы видим в редакторе IDE.
Астролябия-сама меряет, было бы что мерять!!!
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 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"
так ?
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 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. Почему именно такое имя?
Станислав
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 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/
Друг Кота
Аватара пользователя
Сообщения: 25447
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

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

Сообщение a5021 »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3896303#p3896303"]Чукча - писатель... Может стоит прочесть первоисточник ПОСЛЕ многоточия в цитате?
Несете какую то рандомную хрень... :facepalm:[/uquote]
И понеслось дерьмо по трубам. Вы одним термином назвали разное. Я точно показал, что именно. Обтекайте теперь оба. Голосите про "рандомную херь". Фигли вам остается.
Тимофеев совершенно определенно объясняет необходимость использования указателей на volatile в случае возможности присвоения им адресов volatile-переменных.
Вот в этой фразе? "Также распространенной ошибкой является использование обычного (не volatile) указателя на volatile-переменную." Так я вам открою глаза, что использование обычного указателя на volatile является правильной практикой, а не "распространенной ошибкой".

volatile unsigned int *Port -- это тот самый обычный (не volatile) указатель на volatile переменую. Вы так сами сказали. Вот и разберитесь со своим Тимофеевым, у кого из вас двоих "распространненая ошибка" случилась.

И приводит ДВА примера - ошибочный и правильный.
То есть квалификатор volatile должен быть и у переменной и у указателя на нее. Что не так?
Вы в курсе, что вязните все глубже? Ваше "volatile должен быть и у переменной и у указателя на нее" тогда будет выглядеть так:

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

volatile unsigned int * volatile Port
А теперь идите и посмотрите на "правильный пример" вашего Тихонова. Так кто из вас двоих лажает?
Вам стоит познакомиться с автором текста по ссылке, кстати. Заочно, конечно. Прежде чем быковать. А то ведь стыдно будет, любезный...
Я без вас разберусь, с кем мне знакомиться. И понты свои приберите дешевые. Быдлецой какой-то повеяло.
Друг Кота
Аватара пользователя
Сообщения: 25447
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

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

Чудовищный демагог и шулер. Сам выдумывает, сам и отрицает.
Почему из моих слов вы опустили слово квалификатор, начав цитату с volatile?
Что я имел ввиду вы отлично поняли, как и то, что имел ввиду Тимофеев. Но продолжаете кривляться.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Если честно, то Тимофеев допустил ляп в процитированном абзаце. Но дальше по тексту все подробно разжёвывает с правильными примерами где volatile буфер, а где volatile указатель.

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

Сообщение a5021 »

[uquote="КРАМ",url="/forum/viewtopic.php?p=3896357#p3896357"]Чудовищный демагог и шулер. Сам выдумывает, сам и отрицает.[/uquote]
Да ладно вам плакать. Я цитировал вас обоих и теперь уже дважды повторил, где и кто слажал. Что вы возразили по существу? Ничего! Только персональные наезды. Оно и понятно.
Почему из моих слов вы опустили слово квалификатор, начав цитату с volatile?
У вас галлюцинации? Разуйте глаза: я цитировал вас и вашего визави целиком. Причем, уже не один раз.
Что я имел ввиду вы отлично поняли, как и то, что имел ввиду Тимофеев. Но продолжаете кривляться.
Ваш Тимофеев сказал одно, в то время, как хотел сказать совсем другое. Такое бывает, когда недостает квалификации. Ваши отчаянные вопли ни ему, ни вам никак не помогут -- из песни слов не выкинешь.

[uquote="VladislavS",url="/forum/viewtopic.php?p=3896366#p3896366"]При всём при этом, это никак не влияет на ненужность volatile в параметрах HAL-овской функции, с которой начиналась дискуссия.[/uquote]

То, что компилятор выдает предупреждения на абсолютно правильные передаваемые параметры вас не смущает? Это и есть точка непонимания.
С обсуждения которой так упорно соскальзывает на личности аппонент.
Повторение этой фразы каждый раз показывает лишь то, как вы тщетно стараетесь наскрести хоть какого-нибудь дерьмеца.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

И так имеем

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

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]
Уважаемый a5021, в чем проблема и как решить ее?
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3896374#p3896374"]То, что компилятор выдает предупреждения на абсолютно правильные передаваемые параметры вас не смущает?[/uquote]Ни капли, приведение типов обыденная для С программиста процедура, выполняемая много раз в день.
Ответить

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