STM32 Warning при компиляции библиотечной функции

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 74
Зарегистрирован: Пт июл 12, 2013 13:53:52
Откуда: Санкт-Петербург

Сообщение Michael_Sch »

Всем доброго!
Пытаюсь внедрить в проект библиотеку https://github.com/Celeron/gcc-STM32_ADS1256_ADC_driver
Имеем функцию:
Спойлер

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

void ADS1256_Command_Reset(void)
{
  // Синхронная задержка до готовности АЦП
  while(ADS1256_DRDY_BUSY());

  // Буфер
  uint8_t TxBuffer = ADS1256_COMMAND_RESET;
  // Команда
  assert_param(HAL_OK == HAL_SPI_Transmit(&SPI_ADC_HANDLE, &TxBuffer, 1, HAL_IO_TIMEOUT));

  // Обязательная "задержка между командами", пока АЦП восстановится после только что принятой команды
  delay_us(ADS1256_DELAY_T11_US);
  
  // Datasheet: "After a reset, the ADS1255/6 performs self-calibration... "
  // Синхронная задержка до готовности АЦП  (пока завершится автокалибровка)
  while(ADS1256_DRDY_BUSY());
}
В строке
uint8_t TxBuffer = ADS1256_COMMAND_RESET;
возникает warning
../Drivers/ADS1256_Driver/ads1256.c:330:11: warning: unused variable 'TxBuffer' [-Wunused-variable]
Но ведь она же используется в следующей же строке!
Что же я делаю не так?
IDE:
STM32CubeIDE Version: 1.7.0 Build: 10852_20210715_0634 (UTC)
Компилятор GCC
Зачем, зубодер распроклятый, мучительный тянешь момент?
Тебе, стоматолог, сто матов измученный шлет пациент! (с) Вадим Шефнер
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

assert_param - это не макрос случаем, который при "чистовой сборке" выбрасывается?
Как обычно, советую выкинуть калокуб куда подальше!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1405
Зарегистрирован: Чт фев 19, 2015 12:41:04

Сообщение astrahard »

Если TxBuffer упоминается в коде один раз усего, компилятор не считает TxBuffer переменной, поскольку TxBuffer не меняется (похожа на константу (адрес константы)). Будете дальше писать текст, упомяните TxBuffer на запись и, Warning уйдет не переживайте это не Error.

P.S. Чего Вы тушуетесь от недоверия? Компилятор же сказал Вам, что TxBuffer не меняется у Вас. Это намек, что Вы что то не дописали в тексте кода, например, забыли добавить то что запланировали.

P.P.S. Поэтому я противник "инициализации" буферов, иначе важный намек (Warning) не будет "озвучен". Еще, здорово иметь статистику, где и сколько раз переменная упоминается на запись в явном и особенно неявном виде.

P.P.S. У меня бывало, отлично работающий код изобиловал Warning-ми, поскольку не желая явно переходить на ассемблер я писал на Си в стиле ассемблера (неявное приведение типов). Я знал эти места, поэтому на Warning ноль внимания (зато не было ошибок времени выполнения, даже удавалось их, таким образом, обойти), кроме Вашего случая, когда "прозрачный намек", что код неполный забыли дописать.
"Every profession is a conspiracy against the uninitiated" (B. Shaw)
"A textbook can be defined as a book unsuitable for reading" (B. Shaw)
Tautology is humor in "this" place (Vigo Carpathian)
Мудрый кот
Сообщения: 1779
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4199109#p4199109"]assert_param - это не макрос случаем, который при "чистовой сборке" выбрасывается?
Как обычно, советую выкинуть калокуб куда подальше![/uquote]Не ратую за калокуб, но в данном случае он не при чём.
А накосячил быдлокодер, написавший:

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

assert_param(HAL_OK == HAL_SPI_Transmit(&SPI_ADC_HANDLE, &TxBuffer, 1, HAL_IO_TIMEOUT));
вместо:

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

тип r = HAL_SPI_Transmit(&SPI_ADC_HANDLE, &TxBuffer, 1, HAL_IO_TIMEOUT);
assert_param(r == HAL_OK);
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Аватара пользователя
Сообщения: 74
Зарегистрирован: Пт июл 12, 2013 13:53:52
Откуда: Санкт-Петербург

Сообщение Michael_Sch »

Большое спасибо всем за ответы!
Последний вариант с промежуточной переменной - к нему и склонялся, попробую.
А вообще, если не включен FULL_ASSERT, то корректно ли писать assert_param()?
Нужен ли он?
Зачем, зубодер распроклятый, мучительный тянешь момент?
Тебе, стоматолог, сто матов измученный шлет пациент! (с) Вадим Шефнер
Реклама
Мудрый кот
Сообщения: 1779
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Michael_Sch",url="/forum/viewtopic.php?p=4199166#p4199166"]А вообще, если не включен FULL_ASSERT, то корректно ли писать assert_param()?[/uquote]Что значит "корректно"?
Очевидно, что при компиляции в режиме DEBUG, этот макрос должен порождать какой-то проверочный код; при компиляции в RELEASE - не должен порождать кода. Так как эти проверки нужны только для отладки и в уже отлаженном коде содают только лишний вес.

[uquote="Michael_Sch",url="/forum/viewtopic.php?p=4199166#p4199166"]Нужен ли он?[/uquote]Нужна или нет проверка чего-либо assert-ом в коде - определяет программист, пишущий этот код. А ему это диктует его профессионализм и требования следования какому-то стилю построения кода.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 74
Зарегистрирован: Пт июл 12, 2013 13:53:52
Откуда: Санкт-Петербург

Сообщение Michael_Sch »

[uquote="jcxz",url="/forum/viewtopic.php?p=4199175#p4199175"][uquote="Michael_Sch",url="/forum/viewtopic.php?p=4199166#p4199166"]Нужен ли он?[/uquote]Нужна или нет проверка чего-либо assert-ом в коде - определяет программист, пишущий этот код. А ему это диктует его профессионализм и требования следования какому-то стилю построения кода.[/uquote]
Совершенно согласен.
Правильно ли я понимаю, что в функции должны были быть директивы предпроцессору вида:

#ifndef FULL_ASSERT...
<код RELEASE>
#else
<DEBUG>// где и используется assert_param()
#endif

и аффтар просто так не сделал?

PS С промежуточной переменной тоже не прокатило, появился warning про эту переменную.
Вообще убрал присвоения, просто вызвал функцию HAL_SPI_Transmit() и компилятор успокоился.
Но для чего то был же написан вызов assert_param?
Зачем, зубодер распроклятый, мучительный тянешь момент?
Тебе, стоматолог, сто матов измученный шлет пациент! (с) Вадим Шефнер
Мудрый кот
Сообщения: 1779
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Michael_Sch",url="/forum/viewtopic.php?p=4199182#p4199182"]Правильно ли я понимаю, что в функции должны были быть директивы предпроцессору вида:
#ifndef FULL_ASSERT...
<код RELEASE>
#else
<DEBUG>// где и используется assert_param()
#endif

и аффтар просто так не сделал?[/uquote]Нет. Как правило, где-то в заголовочных файлах должно быть определение assert_param() подобное:

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

#ifdef FULL_ASSERT... 
#define assert_param(условное_выражение) (какое-то действие если (условное_выражение) == истинно)
#else
#define assert_param(условное_выражение)
#endif
Или типа того.
Поэтому в коде программы достаточно писать просто: assert_param(условное_выражение)

[uquote="Michael_Sch",url="/forum/viewtopic.php?p=4199182#p4199182"]PS С промежуточной переменной тоже не прокатило, появился warning про эту переменную.[/uquote]Это странно... Какой-то странный у Вас компилятор. Например IAR (ARM) вполне корректно обрабатывает:
1) на простое объявление переменной с инициализацией без последующего использования (uint8_t TxBuffer = ADS1256_COMMAND_RESET;) - выдаёт варнинг;
2) на int r = HAL_SPI_Transmit(...); без последующего использования r - проглатывает молча.
Что и правильно.

PS: Попробуйте после int r = HAL_SPI_Transmit(...); добавить фиктивное чтение: r;
Хотя IAR как раз на такое вполне логично выдаёт варнинг: "Warning[Pe174]: expression has no effect"

PPS: Ну или ещё как-то нужно сказать компилятору, что r - используется. Сказать нужно в той ветке определения assert_param(), которая сейчас пустая. Может у него какая-нить pragma для этого есть? Не знаю - не пользуюсь GCC.
Поищите в хидерах вашего компилятора определение какого-нить assert-подобного макроса, посмотрите как он реализован.
Последний раз редактировалось jcxz Вт мар 15, 2022 19:57:47, всего редактировалось 1 раз.
Открыл глаза
Аватара пользователя
Сообщения: 74
Зарегистрирован: Пт июл 12, 2013 13:53:52
Откуда: Санкт-Петербург

Сообщение Michael_Sch »

В HAL_conf.h:

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

#ifdef  USE_FULL_ASSERT
/**
  * @brief  The assert_param macro is used for function's parameters check.
  * @param  expr If expr is false, it calls assert_failed function
  *         which reports the name of the source file and the source
  *         line number of the call that failed.
  *         If expr is true, it returns no value.
  * @retval None
  */
#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
void assert_failed(uint8_t* file, uint32_t line);
#else
#define assert_param(expr) ((void)0U)
#endif /* USE_FULL_ASSERT */
Ну, ессно, есть и определение USE_FULL_ASSERT, закомментированное.
Т.е. если не определен USE_FULL_ASSERT, то выражение выполняется, и всё?

Вести с полей:
Попробовал разные варианты:
1.

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

HAL_OK==HAL_SPI_Transmit(...)
На это получил логичный warning "Результат выражения не используется"
2.

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

zzz=(HAL_OK==HAL_SPI_Transmit(...))
На это получил не менее логичный warning "variable 'zzz' set but not used"
Меня то напрягло в первоначальной ситуации то, что неиспользуемой обзывалась переменная, используемая в передаче по SPI. Вот эту логику я и не понял. До сих пор.
Зачем, зубодер распроклятый, мучительный тянешь момент?
Тебе, стоматолог, сто матов измученный шлет пациент! (с) Вадим Шефнер
Мудрый кот
Сообщения: 1779
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Michael_Sch",url="/forum/viewtopic.php?p=4199204#p4199204"]Меня то напрягло в первоначальной ситуации то, что неиспользуемой обзывалась переменная, используемая в передаче по SPI. Вот эту логику я и не понял. До сих пор.[/uquote]Т.е. - Вы так ничего и не поняли из моих объяснений? :dont_know:
В "первоначальной ситуации" у Вас переменная не использовалась. Так как и самой передачи по SPI не было.

PS: Перечитайте внимательнее моё предыдущее сообщение. А особенно - предполагаемое определение макроса assert_param(). Там всё видно - что и почему.

Добавлено after 1 minute 22 seconds:
[uquote="jcxz",url="/forum/viewtopic.php?p=4199175#p4199175"]Очевидно, что при компиляции в режиме DEBUG, этот макрос должен порождать какой-то проверочный код; при компиляции в RELEASE - не должен порождать кода.[/uquote]
Это не хвост, это антенна
Сообщения: 1339
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Сообщение tonyk »

Напиши

r = HAL_SPI_Transmit(...);
void r ;

если не будешь использовать значение, но под отладчиком хочешь его видеть и НЕ видеть предупреждений компилятора.
Открыл глаза
Аватара пользователя
Сообщения: 74
Зарегистрирован: Пт июл 12, 2013 13:53:52
Откуда: Санкт-Петербург

Сообщение Michael_Sch »

tonyk, jcxz, Спасибо!
Чет ступил, действительно, в ветке описания макро для не определенного USE_FULL_ASSERT в расширении (expr) даже не упоминается, а значит, код не генерится.
Всем добра и здоровья!
Зачем, зубодер распроклятый, мучительный тянешь момент?
Тебе, стоматолог, сто матов измученный шлет пациент! (с) Вадим Шефнер
Открыл глаза
Аватара пользователя
Сообщения: 74
Зарегистрирован: Пт июл 12, 2013 13:53:52
Откуда: Санкт-Петербург

Сообщение Michael_Sch »

Добрый всем день!
Новая бредятина.
Со вправленными Вами (спасибо) мозгами нарисовал таки программу. Но вот что происходит:
- При прошивке из CubeIDE через ST-Link работает как надо.
- При прошивке сгенеренного кубом образа, пробовал .elf,.bin,.hex через CubeProgrammer (пробовал также FlashLoaderDemonstrator) - НЕТ! Пробовал и через UART и через ST-Link!

Что это могут быть за грабли?
Да, да, знаю, что куб - это отстой, но все-же! Как так-то?
Зачем, зубодер распроклятый, мучительный тянешь момент?
Тебе, стоматолог, сто матов измученный шлет пациент! (с) Вадим Шефнер
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Michael_Sch, ну выкинь ты уже калокуб и напиши простейшую мигалку светодиодом по-человечески!
Потому что то, как ты сейчас это делаешь, напоминает попытку методом тыка кисточки вслепую нарисовать "Джоконду"!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 74
Зарегистрирован: Пт июл 12, 2013 13:53:52
Откуда: Санкт-Петербург

Сообщение Michael_Sch »

Eddy_Em писал(а):Michael_Sch, ну выкинь ты уже калокуб и напиши простейшую мигалку светодиодом по-человечески!
Да нет, диодом то я мигал давно уже, здесь связка 24-битный АЦП+103камень.
https://radiokot.ru/forum/viewtopic.php?f=2&t=178350
Когда начинал знакомство, очень нравился CooCox, но он приказал нам всем долго жить.
А вот как по-вашему мнению, если пользовать CubeIDE но без HAL?
Зачем, зубодер распроклятый, мучительный тянешь момент?
Тебе, стоматолог, сто матов измученный шлет пациент! (с) Вадим Шефнер
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Michael_Sch, любым инструментом надо уметь пользоваться. Умеете делать на HAL и результат вас устраивает? Делайте и не слушайте мнение всяких пикселей в интернете.
Открыл глаза
Аватара пользователя
Сообщения: 74
Зарегистрирован: Пт июл 12, 2013 13:53:52
Откуда: Санкт-Петербург

Сообщение Michael_Sch »

Так это то понятно.
Просто вопрос то в другом: почему образ, залитый разными методами даёт разные результаты?
Куда копать, что смотреть?
Зачем, зубодер распроклятый, мучительный тянешь момент?
Тебе, стоматолог, сто матов измученный шлет пациент! (с) Вадим Шефнер
Родился
Сообщения: 2
Зарегистрирован: Чт янв 12, 2023 22:21:29

Сообщение syntime »

Удалось пробиться с этой библиотекой? Заимел такую же плату и нашёл эту же библиотеку, пока ещё не начал углубляться, новичок в этом деле.
Открыл глаза
Аватара пользователя
Сообщения: 74
Зарегистрирован: Пт июл 12, 2013 13:53:52
Откуда: Санкт-Петербург

Сообщение Michael_Sch »

[uquote="syntime",url="/forum/viewtopic.php?p=4353777#p4353777"]Удалось пробиться с этой библиотекой?[/uquote]
Да, все работает, сделал клон АЦП для хроматографии, пользуемся. :))
Мои доделки видели? https://radiokot.ru/forum/viewtopic.php?f=2&t=178350
Если есть вопросы, пишите, помогу.
Зачем, зубодер распроклятый, мучительный тянешь момент?
Тебе, стоматолог, сто матов измученный шлет пациент! (с) Вадим Шефнер
Родился
Сообщения: 2
Зарегистрирован: Чт янв 12, 2023 22:21:29

Сообщение syntime »

Michael_Sch, Да, ваши доделки видел изначально, может быть позже дойду до них ). У меня пока не получается - идут нули. Может я что-то не так по пинам настроил? Только вот отладку настроил, не работала никак в Cube IDE.
Ещё попробовал один из источников вдохновения этой библиотеки https://www.cyberforum.ru/arm/thread2226883.html - тоже не получилось сначала, потом вроде пошло дело, но значения как-будто случайные идут. Может конечно шум, но не должен, я нулевой канал замеряю с потенциметром которорый, джампер подключен.
Ответить

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