Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Вт мар 15, 2022 13:35:38

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

В строке
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

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

Вт мар 15, 2022 13:39:38

assert_param - это не макрос случаем, который при "чистовой сборке" выбрасывается?
Как обычно, советую выкинуть калокуб куда подальше!

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

Вт мар 15, 2022 13:44:40

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

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

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

P.P.S. У меня бывало, отлично работающий код изобиловал Warning-ми, поскольку не желая явно переходить на ассемблер я писал на Си в стиле ассемблера (неявное приведение типов). Я знал эти места, поэтому на Warning ноль внимания (зато не было ошибок времени выполнения, даже удавалось их, таким образом, обойти), кроме Вашего случая, когда "прозрачный намек", что код неполный забыли дописать.

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

Вт мар 15, 2022 14:49:20

assert_param - это не макрос случаем, который при "чистовой сборке" выбрасывается?
Как обычно, советую выкинуть калокуб куда подальше!
Не ратую за калокуб, но в данном случае он не при чём.
А накосячил быдлокодер, написавший:
Код:
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);

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

Вт мар 15, 2022 16:23:51

Большое спасибо всем за ответы!
Последний вариант с промежуточной переменной - к нему и склонялся, попробую.
А вообще, если не включен FULL_ASSERT, то корректно ли писать assert_param()?
Нужен ли он?

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

Вт мар 15, 2022 16:36:54

А вообще, если не включен FULL_ASSERT, то корректно ли писать assert_param()?
Что значит "корректно"?
Очевидно, что при компиляции в режиме DEBUG, этот макрос должен порождать какой-то проверочный код; при компиляции в RELEASE - не должен порождать кода. Так как эти проверки нужны только для отладки и в уже отлаженном коде содают только лишний вес.

Нужен ли он?
Нужна или нет проверка чего-либо assert-ом в коде - определяет программист, пишущий этот код. А ему это диктует его профессионализм и требования следования какому-то стилю построения кода.

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

Вт мар 15, 2022 16:59:07

Нужен ли он?
Нужна или нет проверка чего-либо assert-ом в коде - определяет программист, пишущий этот код. А ему это диктует его профессионализм и требования следования какому-то стилю построения кода.

Совершенно согласен.
Правильно ли я понимаю, что в функции должны были быть директивы предпроцессору вида:

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

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

PS С промежуточной переменной тоже не прокатило, появился warning про эту переменную.
Вообще убрал присвоения, просто вызвал функцию HAL_SPI_Transmit() и компилятор успокоился.
Но для чего то был же написан вызов assert_param?

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

Вт мар 15, 2022 17:21:27

Правильно ли я понимаю, что в функции должны были быть директивы предпроцессору вида:
#ifndef FULL_ASSERT...
<код RELEASE>
#else
<DEBUG>// где и используется assert_param()
#endif

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

PS С промежуточной переменной тоже не прокатило, появился warning про эту переменную.
Это странно... Какой-то странный у Вас компилятор. Например 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 раз.

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

Вт мар 15, 2022 18:02:53

В 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. Вот эту логику я и не понял. До сих пор.

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

Вт мар 15, 2022 19:50:45

Меня то напрягло в первоначальной ситуации то, что неиспользуемой обзывалась переменная, используемая в передаче по SPI. Вот эту логику я и не понял. До сих пор.
Т.е. - Вы так ничего и не поняли из моих объяснений? :dont_know:
В "первоначальной ситуации" у Вас переменная не использовалась. Так как и самой передачи по SPI не было.

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

Добавлено after 1 minute 22 seconds:
Очевидно, что при компиляции в режиме DEBUG, этот макрос должен порождать какой-то проверочный код; при компиляции в RELEASE - не должен порождать кода.

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

Ср мар 16, 2022 06:55:09

Напиши

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

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

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

Ср мар 16, 2022 10:11:47

tonyk, jcxz, Спасибо!
Чет ступил, действительно, в ветке описания макро для не определенного USE_FULL_ASSERT в расширении (expr) даже не упоминается, а значит, код не генерится.
Всем добра и здоровья!

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

Чт мар 24, 2022 13:36:14

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

Что это могут быть за грабли?
Да, да, знаю, что куб - это отстой, но все-же! Как так-то?

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

Чт мар 24, 2022 14:10:08

Michael_Sch, ну выкинь ты уже калокуб и напиши простейшую мигалку светодиодом по-человечески!
Потому что то, как ты сейчас это делаешь, напоминает попытку методом тыка кисточки вслепую нарисовать "Джоконду"!

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

Чт мар 24, 2022 14:32:03

Eddy_Em писал(а):Michael_Sch, ну выкинь ты уже калокуб и напиши простейшую мигалку светодиодом по-человечески!

Да нет, диодом то я мигал давно уже, здесь связка 24-битный АЦП+103камень.
viewtopic.php?f=2&t=178350
Когда начинал знакомство, очень нравился CooCox, но он приказал нам всем долго жить.
А вот как по-вашему мнению, если пользовать CubeIDE но без HAL?

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

Чт мар 24, 2022 14:35:07

Michael_Sch, любым инструментом надо уметь пользоваться. Умеете делать на HAL и результат вас устраивает? Делайте и не слушайте мнение всяких пикселей в интернете.

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

Чт мар 24, 2022 14:58:30

Так это то понятно.
Просто вопрос то в другом: почему образ, залитый разными методами даёт разные результаты?
Куда копать, что смотреть?

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

Пт янв 13, 2023 22:09:00

Удалось пробиться с этой библиотекой? Заимел такую же плату и нашёл эту же библиотеку, пока ещё не начал углубляться, новичок в этом деле.

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

Ср янв 18, 2023 11:14:17

Удалось пробиться с этой библиотекой?

Да, все работает, сделал клон АЦП для хроматографии, пользуемся. :))
Мои доделки видели? viewtopic.php?f=2&t=178350
Если есть вопросы, пишите, помогу.

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

Вт янв 24, 2023 15:33:23

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