Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/56: Рейтинг темы: голосов - 56, средняя оценка - 4.70
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876

Косяк в HAL библиотеке при работе с FLASH

05.03.2018, 17:03. Показов 13003. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
полдня убил на выявления этого косяка
стираю страницу и тут же записываю значение ничего не пишется если через сброс то все нормально
оказалось функция FLASH_PageErase реализована не до конца
вот функция(комментарии мои)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void FLASH_PageErase(uint32_t PageAddress)
{
  /* Clean the error context */
  pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
 
#if defined(FLASH_BANK2_END) // если два банка то нас не интересует, камень STM32F103
  if(PageAddress > FLASH_BANK1_END)
  { 
    /* Proceed to erase the page */
    SET_BIT(FLASH->CR2, FLASH_CR2_PER);
    WRITE_REG(FLASH->AR2, PageAddress);
    SET_BIT(FLASH->CR2, FLASH_CR2_STRT);
  }
  else
  {
#endif /* FLASH_BANK2_END */
    /* Proceed to erase the page */
    SET_BIT(FLASH->CR, FLASH_CR_PER);// устанавливает бит стирания страницы
    WRITE_REG(FLASH->AR, PageAddress);// адрес по которому расположена эта страница
    SET_BIT(FLASH->CR, FLASH_CR_STRT); //устанавливаем бит старт, пошло стирание
 
#if defined(FLASH_BANK2_END)
  }
#endif /* FLASH_BANK2_END */
}
и все, бит FLASH_CR_PER остается взведен, при любой записи заново стирает страницу
поправил вот так
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void FLASH_PageErase(uint32_t PageAddress)
{
  /* Clean the error context */
  pFlash.ErrorCode = HAL_FLASH_ERROR_NONE;
 
#if defined(FLASH_BANK2_END) // если два банка то нас не интересует, камень STM32F103
  if(PageAddress > FLASH_BANK1_END)
  { 
    /* Proceed to erase the page */
    SET_BIT(FLASH->CR2, FLASH_CR2_PER);
    WRITE_REG(FLASH->AR2, PageAddress);
    SET_BIT(FLASH->CR2, FLASH_CR2_STRT);
  }
  else
  {
#endif /* FLASH_BANK2_END */
    /* Proceed to erase the page */
    SET_BIT(FLASH->CR, FLASH_CR_PER);// устанавливает бит стирания страницы
    WRITE_REG(FLASH->AR, PageAddress);// адрес по которому расположена эта страница
    SET_BIT(FLASH->CR, FLASH_CR_STRT); //устанавливаем бит старт, пошло стирание
    CLEAR_BIT(FLASH->CR, FLASH_CR_PER);// сбрасываем бит стирания страницы
#if defined(FLASH_BANK2_END)
  }
#endif /* FLASH_BANK2_END */
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.03.2018, 17:03
Ответы с готовыми решениями:

Ошибка в библиотеке при работе со структурой
Ошибки обозначены: /*****/ Это все библиотека Если надо еще что-то то могу скинуть #include "STRUCT_1.h" ...

косяк в библиотеке stm8s
сегодня набросал проектик на stm8s003. Впервые использовал UART, как видно из заголовка, пользуюсь стандартными библиотеками. И вдруг...

Зависает МК при работе с flash
Добрый вечер! Пытаюсь делать сохранение настроек в памяти stm32f405. Начал работать с памятью, разбираться. Вобщем при нажатии нужной...

47
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
01.02.2022, 23:24  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Eddy_Em Посмотреть сообщение
А вот нечего вызывать "эдак"!!!
почему это не надо?
Цитата Сообщение от Eddy_Em Посмотреть сообщение
А как же правильно-то? Чтобы без оверхеда.
где это "без оверхеда", я вижу только макрос установку пина, а сброс где? еще один макрос писать? и еще проверять и сколько кода будет? а другой камень макросы заново писать?
0
Нарушитель
445 / 886 / 106
Регистрация: 23.11.2021
Сообщений: 5,204
Записей в блоге: 19
01.02.2022, 23:53
Цитата Сообщение от ValeryS Посмотреть сообщение
а сброс где? еще один макрос писать?
Естественно!
Цитата Сообщение от ValeryS Посмотреть сообщение
и еще проверять и сколько кода будет?
А проверять не надо. Это - на совести пишущего код. В С, в отличие от С++, невозможно проверять!
Цитата Сообщение от ValeryS Посмотреть сообщение
а другой камень макросы заново писать?
Макросы с пинами общие для всех - поэтому они у меня в common и вынесены.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
02.02.2022, 00:13  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
А проверять не надо. Это - на совести пишущего код.
это как? вот мне нужно изменить состояния пина как без проверки?
вот так делает HAL
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
  * @brief  Toggles the specified GPIO pin
  * @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral
  * @param  GPIO_Pin: Specifies the pins to be toggled.
  * @retval None
  */
void HAL_GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
{
  uint32_t odr;
 
  /* Check the parameters */
  assert_param(IS_GPIO_PIN(GPIO_Pin));
 
  /* get current Ouput Data Register value */
  odr = GPIOx->ODR;
 
  /* Set selected pins that were at low level, and reset ones that were high */
  GPIOx->BSRR = ((odr & GPIO_Pin) << GPIO_NUMBER) | (~odr & GPIO_Pin);
}
0
Нарушитель
445 / 886 / 106
Регистрация: 23.11.2021
Сообщений: 5,204
Записей в блоге: 19
02.02.2022, 00:15
Цитата Сообщение от ValeryS Посмотреть сообщение
вот мне нужно изменить состояния пина как без проверки?
У меня в макросе это элементарно реализуется через IDR/ODR и BSRR. Всего-то пара операций, в отличие от кала!

И еще раз напомню: в отличие от функции, макрос не потребляет ресурсы на сохранение стека, заполнение нового и т.п. Да и тупой вызов void() функции тоже — трата ресурсов.
P.S. ЕМНИП, в кале все ассерты отключаются при компиляции в режиме release, но вот осадочек — вызов функции вместо макроса — остается!
Ну и, опять же, попрошу сравнить нормальный вызов методов работы с всякими SPI/I2C/CAN (и, особенно, USB! Ведь калокубовцы не дают возможности достичь 12Мбит/с на USB!) и каловский способ.
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
02.02.2022, 00:16  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Всего-то пара операций, в отличие от кала!
а здесь их сколько?
0
Нарушитель
445 / 886 / 106
Регистрация: 23.11.2021
Сообщений: 5,204
Записей в блоге: 19
02.02.2022, 00:22
P.P.S. И таки хотелось бы реально увидеть скорость обмена по USB в 12Мбит/с, реализованную исключительно средствами кала!

Добавлено через 37 секунд
Цитата Сообщение от ValeryS Посмотреть сообщение
а здесь их сколько?
А что, вызов функции — уже не считается? На него тратится больше тактов, чем на эти две операции!
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
02.02.2022, 00:31
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Чтобы без оверхеда
ну...а вы точно уточняете, чтобы потом не спорить? )) Вот, к примеру, хороший пример библиотеки. Заметьте, такая библиотека, как opencm3, не использует inline-имплементацию. И, честно сказать, я просто не попробовал этот вариант - возможно, короткая функция вставится без вызова.

По стандарту, GCC не хочет инлайнить просто так "составные" функции. По крайней мере, мне так и не удалось скомпилить какой-нить просто прожект для STM32 чтобы все-таки добиться инлайна HAL_GPIO_WritePin() (режим с флагом -flto не в счет). Вот, немного об этом.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
А как же правильно-то?
Правильнee использовать inline-функции...
0
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
02.02.2022, 01:24  [ТС]
Цитата Сообщение от Eddy_Em Посмотреть сообщение
На него тратится больше тактов, чем на эти две операции!
а размер кода не считается? и сколько эти такты тратят времени? или просто "щоб было"
конкретно сколько функции тратят процентов?
0
 Аватар для COKPOWEHEU
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
02.02.2022, 07:23
Почему бы просто не провести сравнение? Запускаем таймер и смотрим сколько тактов займет 100 операций с выводами по разным подходам. Ну и какой код проще читать и модифицировать, естественно.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
02.02.2022, 08:37
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
просто не провести сравнение?
ну, тут Eddy_Em "победит", у него запись в регистр займет 1 такт, в том время как WritePin разложена аж в 4 (не учитывая вызова и подготовки аргументов):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
08004ef4 <HAL_GPIO_WritePin>:
  */
extern inline void HAL_GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
{
  /* Check the parameters */
 
  if (PinState != GPIO_PIN_RESET)
 8004ef4:   b902        cbnz    r2, 8004ef8
  {
    GPIOx->BSRR = GPIO_Pin;
  }
  else
  {
    GPIOx->BSRR = (uint32_t)GPIO_Pin << 16u;
 8004ef6:   0409        lsls    r1, r1, #16
 8004ef8:   6101        str r1, [r0, #16]
  }
}
 8004efa:   4770        bx  lr
Опять же, насколько это важно с т.з. программы - решать программеру. Например, два макроса, которые предлагает Eddy_Em, поставленных вместе (например, для получения очень короткого импульса) рядом могут работать, а могут и не работать - виной всему будет цифровая часть - разница в тактовании шин процессора и GPIO. Тут сильно влияет и Wait-States памяти, из которой выполняется программа.
И аналоговая: максимальный slope - из-за этого GPIO не выдаст импульс просто из-за ограничения выходных драйверов push-pull.
0
Нарушитель
445 / 886 / 106
Регистрация: 23.11.2021
Сообщений: 5,204
Записей в блоге: 19
02.02.2022, 08:46
Для получения коротких импульсов используют таймер, а не ногодрыг!
0
 Аватар для northcitizen
38 / 31 / 9
Регистрация: 29.03.2019
Сообщений: 345
02.02.2022, 09:10
Цитата Сообщение от ValeryS Посмотреть сообщение
новый вопрос новая тема
Я так понимаю что считывания данных не имеет никакого отношения к стиранию
Спасибо за ответ! Да, уже понял, что не с флешем проблема, а с юсби
0
Нарушитель
445 / 886 / 106
Регистрация: 23.11.2021
Сообщений: 5,204
Записей в блоге: 19
02.02.2022, 09:41
Цитата Сообщение от Voland_ Посмотреть сообщение
По стандарту, GCC не хочет инлайнить просто так "составные" функции
Цитата Сообщение от Voland_ Посмотреть сообщение
использовать inline-функции
Вы, батенька, сам себе противоречите!
А gcc и на самом деле не только при -Os, но и даже при -O2 или -O3 может и не заинлайнить функции. И никакие static inline не являются гарантией, что функция таки будет реально встроена в код каждый раз, как встречается ее вызов.
Цитата Сообщение от Voland_ Посмотреть сообщение
Заметьте, такая библиотека, как opencm3, не использует inline-имплементацию
Поэтому я этой дрянью и перестал пользоваться: в критические моменты, когда нужно за пару тактов что-то сделать, оно вызывает функции и тратит вместо пары тактов пару десятков! Вот здесь у меня то, что без суффикса nolib — на opencm3. Я и хронометр свой поначалу на нем делал, но потом все переделал по-человечески (в т.ч. и со своей реализацией USB).
0
 Аватар для COKPOWEHEU
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
02.02.2022, 09:46
Цитата Сообщение от Voland_ Посмотреть сообщение
ну, тут Eddy_Em "победит", у него запись в регистр займет 1 такт, в том время как WritePin разложена аж в 4
То есть по скорости макросы выигрывают, по наглядности выигрывают. А зачем тогда ST-HAL?
Цитата Сообщение от Voland_ Посмотреть сообщение
Например, два макроса, которые предлагает Eddy_Em, поставленных вместе (например, для получения очень короткого импульса) рядом могут работать, а могут и не работать - виной всему будет цифровая часть - разница в тактовании шин процессора и GPIO.
А вы ожидали что макросы волшебным образом обойдут ограничения железа?
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
02.02.2022, 12:26
Цитата Сообщение от Eddy_Em Посмотреть сообщение
И никакие static inline не являются гарантией, что функция таки будет реально встроена в код каждый раз, как встречается ее вызов.
да, ну так чтобы это все же происходило - тут компилятор (GCC) надо, батенька, знать
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Поэтому я этой дрянью и перестал пользоваться
все проблемы Ваши от не знания.

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
То есть по скорости макросы выигрывают, по наглядности выигрывают. А зачем тогда ST-HAL?
1) по наглядности макросы уходят от C-like стиля. Си-код, с использованием оных уже не совсем так выглядит, как обычный Си-код.
2) по скорости макросы, даже предназначенные для ускорения выполнения кода, иногда и ПРОИГРЫВАЮТ коду Си. Виной всему сложности, связанные с "пониманием" компилятора предоставленного кода. Вы не задумывались, например, что даже такая с виду невинная инструкция, как
Code
1
do { .. } while (0)
, которую часто используют для мелких действий, может быть воспринята компилятором, как обособленный кусок кода? И, в случае с inline - вы этот код видите, как функцию, а в случае с макросом - как "кучу плохо отформатированного кода". Компилятор может группировать действия в Си-коде, но это часто невозможно с применением макросов. (это не теория - встречал такие случаи).
3) Макросы НЕ могут включать ключи прекомпиляции.
4) Макросы упрощают работу с множеством аргументов на входе, но это часто не разрешается многими static-checker'ами и стандартами программирования.
5) И главное: Макросы НИКАК НЕ ПРОВЕРЯЮТ входные/выходные параметры, как это делается на compile-time в Си. То есть да, если мы любим проверять каждую строчку проекта при его портации от камня к камню, либо проект состоит из сотни строчек - это, безусловно, приемлемо. Но в большом количестве проектов, особенно если речь идет о 32битных процессорах - проекты не маленькие. И, соответственно, проверок будет катастрофически больше, т.к. проблемы не отловятся при компиляции.
6) Ну, и куча подводных камней, связанных с ненатуральностью природы макроса в Си-программе. Часто бывает, что синтаксическая ошибка макроса вылазит уже много после его написания, и как правило - в совершенно неожиданном месте, совсем не там, где этот макрос применился.

PS: Достаточно распинаюсь?))

Добавлено через 3 минуты
... для баланса критики и поддержания холивара, предложу очень интересную имплементацию подобия schtduler'а - qpc. Интерес его в том, что он весь собран на макросах. А боль в том, что вообще нихрена, простите, непонятно, как он работает, и что делать, если что-то не работает. Как дебажить?

Добавлено через 6 минут
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А вы ожидали что макросы волшебным образом обойдут ограничения железа?
Нет, но так получается, за нас это сделал ST. Косвенное решение подобных проблем редко когда объясняется разработчиком, и тем не менее, наличие кода, в данном случае, решает данную проблему.
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Для получения коротких импульсов используют таймер, а не ногодрыг!
конечно. Так поэтому и нет тогда разницы - занимает ли код WritePin() 2 такта или 8 - ведь все равно с такой точностью и скоростью установка пина не требуется. А дебажить такой код куда понятнее.
0
Нарушитель
445 / 886 / 106
Регистрация: 23.11.2021
Сообщений: 5,204
Записей в блоге: 19
02.02.2022, 12:43
Цитата Сообщение от Voland_ Посмотреть сообщение
do { .. } while (0)
Никогда не видел, чтобы gcc это оставлял! Специально листинги асмовые просматриваю периодически.
Что до внешнего вида макросов, то можно ведь их и не только заглавными буквами писать! А можно и функцию назвать заглавными. Так что, в коде вызов функции set_pin() никак от макроса set_pin() отличаться не будет. А фактически же сэкономит такты (особенно если gcc не заинлайнит эту функцию).
Цитата Сообщение от Voland_ Посмотреть сообщение
все проблемы Ваши от не знания
Ну-ну... А когда разрабы opencm3 поломали нафиг API — это тоже от моего незнания?
Я решил, что незачем от каких-то ненормальных зависеть, и стал писать на "голых регистрах". Чего и вам советую. Крайне удобно. И код понятный, в отличие от этих простыней каловских.
Цитата Сообщение от Voland_ Посмотреть сообщение
НИКАК НЕ ПРОВЕРЯЮТ
Ну так в С вообще нет механизма, чтобы во время сборки что-то проверить. Разве что тип аргумента — но это вообще ни о чем. Вы ж не сможете, как в С++, проверить, переданный параметр является одним из набора определенных флагов, или вообще левый? Не сможете. Вот то-то!
Цитата Сообщение от Voland_ Посмотреть сообщение
бывает, что синтаксическая ошибка макроса вылазит уже много после его написания, и как правило - в совершенно неожиданном месте
Согласен, код с макросами сложней отлаживать. Зато они удобны. И я ими пользуюсь не только для МК, но и в софте под ПК. Вот, например, моя библиотечка. И сразу макросы:
C
1
2
3
4
#define ERR(...) do{globErr=errno; _WARN(__VA_ARGS__); signals(9);}while(0)
#define ERRX(...) do{globErr=0; _WARN(__VA_ARGS__); signals(9);}while(0)
#define WARN(...) do{globErr=errno; _WARN(__VA_ARGS__);}while(0)
#define WARNX(...) do{globErr=0; _WARN(__VA_ARGS__);}while(0)
Цитата Сообщение от Voland_ Посмотреть сообщение
А дебажить такой код куда понятнее.
Я ему про Ивана, а он упорно про барана!
Чем каловские портянки спагетти-кода удобней нормального кода с макросами?
И да, я еще раз предлагаю попробовать выжать из каловского USB 12мбит/с ☺
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
02.02.2022, 13:06
Цитата Сообщение от Eddy_Em Посмотреть сообщение
Чем каловские портянки спагетти-кода удобней нормального кода с макросами?
тем, что о них, как и об opencm3, например, если не знают, но слышали практически все разработчики. И имеют с ним опыт работы. Это стандарт "от разработчика". Нравится он вам лично или нет - для остальных это не интересно, и говорит лишь об ограниченности вас, но не остальных. Не нравится API от ST - переходите на TI, а может, и на nordic'и, nxp, esp... Какие проблемы?

Говорю же - low-level функции можно и на ассмблере лабать, и на макросах. Но дебажить этот код, строить на нем что-то более-менее стабильное, читаемое, документированное и портируемое, а еще и ТРАТИТЬ НА ЭТО РЕСУРСЫ - это личное дело каждой конторы. Если у вас есть на это время, и время на то, чтобы поддерживать этот код в дальнейшем, то в большинстве случаев такого времени не дается. И это огромная ошибка вашего работодателя (если он есть вообще), что не требует от вас стандартизованных решений.
0
 Аватар для COKPOWEHEU
4149 / 2727 / 433
Регистрация: 09.09.2017
Сообщений: 12,084
02.02.2022, 13:10
Цитата Сообщение от Voland_ Посмотреть сообщение
1) по наглядности макросы уходят от C-like стиля.
Если макрос предназначен для выполнения того, что в "C-like стиле" невозможно, как он может выглядеть в C-like стиле? В моей реализации USB есть макросы для заполнения дескрипторов. Они принимают кучу переменных, подставляют вычисленные значения вместо некоторых из них и т.п. Они не выглядят как функции или что-то еще. Не для этого они предназначены.
Бывают и специализированные макросы вроде тех же GPIO_config(), которые принимают целую кучу параметров, свернутую в одну макроконстанту. Если начать разбираться, они тоже не выглядят как функции, но в коде от них почти не отличаются.
Цитата Сообщение от Voland_ Посмотреть сообщение
которую часто используют для мелких действий, может быть воспринята компилятором, как обособленный кусок кода?
Но шанс на это значительно меньше, чем сохранение inline-функции как функции, а не как inline.
Цитата Сообщение от Voland_ Посмотреть сообщение
в случае с inline - вы этот код видите, как функцию, а в случае с макросом - как "кучу плохо отформатированного кода"
А зачем вам регулярно в подобный код лазить? Мы же сейчас говорим про простые вещи, в которых накладные расходы на вызов составляют существенную часть общего времени. То есть что-то строк из десяти максимум.
Цитата Сообщение от Voland_ Посмотреть сообщение
3) Макросы НЕ могут включать ключи прекомпиляции.
Что имеется в виду? #define?
Цитата Сообщение от Voland_ Посмотреть сообщение
5) И главное: Макросы НИКАК НЕ ПРОВЕРЯЮТ входные/выходные параметры, как это делается на compile-time в Си.
В "C-like" макросах это можно обойти, например, так:
C
1
2
3
4
5
void func(int x, int *y){*y = x+1;}
#define macro(x, y) do{if(0)func(x, y); *(y)=((x)+1);}while(0)
...
  func(x, &y1);
  macro(x, &y2);
В не-C-like, очевидно, сложнее.
Другое дело что эти проверки в подавляющем большинстве случаев и не нужны.
Цитата Сообщение от Voland_ Посмотреть сообщение
То есть да, если мы любим проверять каждую строчку проекта при его портации от камня к камню
Если реализация какого-то действия в разных камнях различается, вам так или иначе придется писать разные реализации.
Цитата Сообщение от Voland_ Посмотреть сообщение
А вы ожидали что макросы волшебным образом обойдут ограничения железа?
Нет, но так получается, за нас это сделал ST.
"трактор защищает вас от превышения скорости, потому что физически не способен настолько разогнаться"
Цитата Сообщение от Voland_ Посмотреть сообщение
1) по наглядности макросы уходят от C-like стиля.
А покажите пример inline функции, настраивающий режим работы порта - для контроллера с CRH/CRL и с MODER/OSPEEDR. Очень мне интересно, сумеете обойтись без проверки номера порта на сравнение с 8, или переход в 64-битные числа, или нет.
0
 Аватар для Voland_
1983 / 1276 / 131
Регистрация: 04.01.2010
Сообщений: 4,607
02.02.2022, 13:32
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Они принимают кучу переменных, подставляют вычисленные значения вместо некоторых из них и т.п. Они не выглядят как функции или что-то еще
я не сомневаюсь, что вы можете пользоваться макросами и не сомневаюсь в их возможностях ). Но... так, для расширения кругозора, структурами/union'ами в Си пользоваться не пробовали? ). Допустим, это решает с десяток таких проблем, которые вы могли упустить...
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
GPIO_config(), которые принимают целую кучу параметров, свернутую в одну макроконстанту. Если начать разбираться, они тоже не выглядят как функции, но в коде от них почти не отличаются.
ну так если они не отличаются по виду от функций, то почему бы и не использовать функции вместо них? Мы же на Си пишем, а не на макро-языке каком-нибудь?
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А зачем вам регулярно в подобный код лазить? Мы же сейчас говорим про простые вещи, в которых накладные расходы на вызов составляют существенную часть общего времени. То есть что-то строк из десяти максимум.
ну, не знаю - так можно вообще про весь код говорить - "зачем в него лазить, если он изначально написан правильно?" Зачем тогда дебаг, зачем вам знать содержание map-файлов? или дизасм? Впендюхивайте готовый hex в память, и ожидайте от выполнения задачи прям сразу того, что было запланировано )).
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Но шанс на это значительно меньше, чем сохранение inline-функции как функции, а не как inline.
я бы так не сказал. Почитайте, например, о ключе оптимизации "общих кусков кода" (компилер просто джампает в кусок кода, который выполнялся в другой функции, в ее конце) в gcc (ссылку выше давал). А ведь он включен по умолчанию в ненулевых опциях оптимизации.
Это значит, что jmp может появиться и в вашем макросе, и в функциях "невидимо" для вас. И, вы будете удивлены, но компилятор еще и некоторые данные в RAM из FLASH может переносить, например, куски массива или структуры, для опимизации доступа. Для вас все это происходит "прозрачно", исходя из выбранной стратегии размещения и формирования кода.

PS: на мой взгляд, дискуссия себя исчерпала ). Буду просто считать, что есть "любители макросов", которых трудно переубедить, и которые не особо суетятся поизучать, как же их макросы было бы правильнее поддержать штатными средствами языка Си ). С этим плоховато, но жить можно

Добавлено через 56 секунд
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Что имеется в виду? #define?
нет, имелось ввиду "#if.. #endif" структуры. Кстати, использование "#define" внутри C-like макроса это вообще будет вселенское зло ))
0
Нарушитель
445 / 886 / 106
Регистрация: 23.11.2021
Сообщений: 5,204
Записей в блоге: 19
02.02.2022, 14:22
Цитата Сообщение от Voland_ Посмотреть сообщение
И это огромная ошибка вашего работодателя (если он есть вообще), что не требует от вас стандартизованных решений.
Я просто в шоке от всей этой портянки бреда!
Нормальный работодатель ни в коем случае не позволит работнику всякие калокубы использовать: а кто потом эту жесть будет поддерживать?
И да, еще раз требую предъявить мне 12Мбит/с по USB CDC, пользуясь каловской реализацией!

Voland_, батенька, сдается мне, что вы - вендузятник! Вот и ведете себя по-вендовозному!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.02.2022, 14:22

F4 виснет при работе с FLASH
понадобилось мне хранить данные внутри флэша, попробовал для начала штатный драйвер #define ADDR 0x080E0000//начало последнего сектора ...

STTM32F103, запись во Flash на HAL
Всем привет! Перехожу на HAL, нужно писать данные во FLASH. МК STM32F103C8T6, пишу данные в конец флэша - на 63 страницу, в качестве...

Ошибки при работе серверных часов (PHP+FLASH)
Из файла PHP с помощью функции time() генерирую текущее серверное время и передаю во флеш. Часы работают но с ошибками которые не могу...

О работе с мануалом HAL
Здравствуйте! Изучаю STM32F4Dyscovery c HAL, но иногда имею сложности с документацией на функции. Пользуюсь мануалом по HAL: UM1725...

Косяк после обновления Flash Player
Добрый день! После обновления Adobe Flash Player ролик на сайте перестал проигрываться. Ролик(swf) начинает воспроизводится, сразу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru