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

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

Пт май 13, 2022 22:28:00

Функция GPIO_Set_Bits выполняется не за один машинный цикл....
Если да, то она должна прерываться в этом случае раз в 1 миллисекунду.

Эта функция длится порядка 4...5 машинных циклов. И может быть прервана. Ну и что?
Если вам критично время исполнения дергания ногой, то либо используйте инлайн функций, либо пишите прямо в регистр порта. Получится пара инструкций. Какие проблемы может вызвать прерывание один раз в миллисекунду для ногодрыга?
Вы какие задачи решаете софтовым ногодрыгом?

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

Пт май 13, 2022 22:34:13

Вы какие задачи решаете софтовым ногодрыгом??

Пока что никаких. Изучаю возможности ногодрыга)
Пока что всё понятно.
И может быть прервана.

Это я называл побочным эффектом использования прерывания.

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

Пт май 13, 2022 22:41:44

Это я называл побочным эффектом использования прерывания.

Это чушь.
Даже без РТОС, исполнение суперлупа (бесконечного цикла) программы ПО ОПРЕДЕЛЕНИЮ прерывается диаграммой реального времени. В зависимости от допустимой латентности процесса ему присваивается приоритет (он может быть изменяемый) и это позволяет одному ядру выполнять несколько процессов псевдоодновременно.
И ничего интересного в ногодрыге нет. Ногами из программы управляют только для некритичных ко времени процессов. Особенно это справедливо для АРМов. Джиттер такого управления может составлять десятки, а то и сотни машинных циклов. Зависит от того, где в коде управляют таким выводом.

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

Пт май 13, 2022 22:50:50

Вы уходите уже в тонкости работы МК.
Главное же что прерывание функции GPIO_Set_Bits есть.
Вы наверное хотели сказать что эта функция GPIO_Set_Bits не страдает от прерываний, потому что идёт псевдоодновременное выполнение процессов.

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

Пт май 13, 2022 22:56:42

функция GPIO_Set_Bits не страдает от прерываний,

Да, именно это я и хотел сказать. И уж не прерывание от систика занимает ресурс. В реальной программе работают кучи источников прерываний, от коммуникационной периферии, до аналогового фронтэнда. Поэтому основной цикл ВСЕГДА мелко нашинкован обработчиками прерываний.

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

Сб май 14, 2022 01:44:33

Функция SysTick_Handler определена у меня в файле stm32f4xx_it.c
Это из файла stm32f4xx_it.c
Код:
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

И в main.c файле эта функция определяется повторно.
У меня выдаёт ошибку.
Это из файла main.c
Код:
  void SysTick_Handler(void)
  {
    if(delay_count>0)
    {
      delay_count--;
    }
  }


Я закомментировал определение функции в файле stm32f4xx_it.c
В этом случае всё работает.
Зачем это сделано в файле stm32f4xx_it.c

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

Сб май 14, 2022 05:54:42

Затем что вы используете HAL, которому это прерывание нужно. Правильно писать ваш код там где это указано, либо не использовать HAL.

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

Сб май 14, 2022 13:06:41

Я закомментировал определение функции в файле stm32f4xx_it.c
В этом случае всё работает.
Прямо-таки уверены, что именно ВСЁ? Или просто не заметили что поломали? А завтра эти грабли прилетят вам в лоб. :shock: :)))

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

Сб май 14, 2022 13:42:53

Логично. Дважды написанная одинаковая функция в разных местах, даже если ее содержимое совпадает до буквы, и будет вызывать ошибку при компиляции, потому как компилятор не понимает, какую из двух брать.
Файл stm32f4xx_it.c подразумевает, что в него собраны все функции, реализующие обработку прерываний. Вполне логичное решение. Можно даже еще логичнее углубиться, разделив на исключения ядра (cm4_exept) и непосредственно прерывания периферии (stm32f4_it).

Более правильно будет не закомменчивать первоначальный вариант, а дописать в него после строчки HAL_IncTick(); строчку UserTick_Count();, написав в main функцию UserTick_Count с её содержимым. Или вместо вызова ф-ции добавить содержимое прямо туда.

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

Сб май 14, 2022 13:54:00

А завтра эти грабли прилетят вам в лоб. :shock: :)))
К бабушке не ходи, в HAL должна быть функция задержки, которая была благополучно выпилена (заодно и всё что внутри таймауты считает) и вместо неё свой велосипед пилится.

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

Сб май 14, 2022 14:52:25

Более правильно будет не закомменчивать первоначальный вариант, а дописать в него после строчки HAL_IncTick(); строчку UserTick_Count();, написав в main функцию UserTick_Count с её содержимым. Или вместо вызова ф-ции добавить содержимое прямо туда.

Оба варианта приведут к срабатыванию HAL_IncTick(); + UserTick_Count();
Зачем мне выполнять HAL_IncTick(); я не знаю что эта функция выполняет, может то что мне не нужно.

А вариант написать только в stm32f4xx_it.c не хочу, так как потом надо искать по всем файлам свою программу.

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

Сб май 14, 2022 15:07:52

Либо вы пользуетесь кодогенератором и подчиняетесь его правилам, либо всё пишете сами как хотите.

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

Сб май 14, 2022 15:25:10

koeltrad писал(а):Зачем мне выполнять HAL_IncTick(); я не знаю что эта функция выполняет, может то что мне не нужно.

А что сложного открыть исходники ХАЛа и посмотреть на то, что и как делает эта функция?
VladislavS писал(а):К бабушке не ходи, в HAL должна быть функция задержки, которая была благополучно выпилена (заодно и всё что внутри таймауты считает) и вместо неё свой велосипед пилится.

Вот именно. Я когда "откручиваю" от ХАЛ драйвер USB именно так и делаю: пока ХАЛ выполняет свои настройки, работает его обработчик прерываний, после чего отключаю таймер, на котором висел обработчик ХАЛа, и вызываю его обработчик уже прямо из ядра FreeRTOS, куда его несложно самому прописать.
Ещё нюанс. Поскольку векторы прерываний у меня перемещены в ОЗУ, то таймер, который использовался в ХАЛ на этапе инициализации, я забираю под свои нужды, просто налету сменив адрес обработчика.
VladislavS писал(а):Либо вы пользуетесь кодогенератором и подчиняетесь его правилам, либо всё пишете сами как хотите.

Тут я не соглашусь с уважаемым VladislavS. Если знать правила игры ХАЛа, то можно, иногда, и его звать поиграть за тебя. Но правила ХАЛа кое-где не прописаны внятно, поэтому вместо помощи можно получить от него подножку.

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

Вс май 15, 2022 02:32:45

А что сложного открыть исходники ХАЛа и посмотреть на то, что и как делает эта функция?

Ничего особенного в функции HAL_IncTick не происходит, просто лишние расчёты, но тоже неприятно, зачем оно мне.
Код:
extern __IO uint32_t uwTick;
__weak void HAL_IncTick(void)
{
  uwTick += uwTickFreq;
}

Переменная uwTick в функции HAL_IncTick повышается с каждым прерыванием на 1.
Одно прерывание, переменная uwTick==1
Второе прерывание, переменная uwTick==2
Третье прерывание, переменная uwTick ==3
и.т.д.
Может это надо библиотеке HAL для установки частоты.
Но мне это будет мешать, зачем мне лишние 4 294 967 295 хранящиеся в переменной uwTick.
(При одном килогерце эта переменная переполнится через 49 дней.)
И HAL портить не хочется и использовать стандартную функцию SysTick_Handler хочется.
HAL мне кажется не очень хорошо поступил, занял чужую функцию.
Обнуление преременной uwTick нет, так что именно инкрементирование с каждым прерыванием идёт.
Моей функции это вредить не будет, но и зачем оно надо.

Зачем инкрементировать эту переменную uwTick? Какое гениальное решение за этим кроется?
Отсчитывать сколько времени прошло? Это можно было бы сделать и без переполнения, например при достижении определённого значения uwTick обнулять эту переменную, считая секунды, а не миллисекунды.
Считая секунды переполнение беззнаковой int переменной наступит через 138 лет.

Нашёл единственное применение этой переменной в функции HAL_GetTick
Просто возвращает сколько натикало
Код:
__weak uint32_t HAL_GetTick(void)
{
  return uwTick;
}

С гарантией 49 дней получается.

А, хотя эта функция HAL_GetTick(); применяется в функции HAL_Delay

Здесь переполнение думаю расчётам не повредит и 49 дней ограничения не будет.
Но функция SysTick_Handler занята
Функция HAL_GetTick() очень много где используется, так что да, лучше не ломать инкрементирование uwTick.
Минус 4 Байт в МК для переменной uwTick

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

Вс май 15, 2022 07:09:13

Поток сознания... Вы всегда пишите в форум всё о чем думаете? Может есть целесообразность СНАЧАЛА ПОДУМАТЬ, а лишь потом написать? Если будет смысл вообще о чем то писать, канешна...
Систик, милейший, это системный таймер. Его используют либо в РТОС, либо для задержек неблокирующего типа. Вам для своих целей мало обычных таймеров?
Впрочем, в том самом халовском обработчике систика для таких как вы английским по белому так и написали - СВОЮ УБОГУЮ НЕТЛЕНКУ ПИШИ СЮДА. Вот и пишите ее туда. Какие еще вопросы будут?
А если вам впадлу писать в библиотеку хала и паче так жалко 4 байт оперативной памяти, то никто не запрещает отказаться от HAL в пользу CMSIS. И пишите во ВСЕ обработчики все, что вам заблагорассудится...

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

Вс май 15, 2022 08:25:18

КРАМ, я вот тут примерно это и хотел сказать :)

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

Вс май 15, 2022 08:33:32

HAL мне кажется не очень хорошо поступил, занял чужую функцию.

У HAL-а, (вернее, у кодогенератора Cube) есть в настройках выбор таймера для системы отсчета времени. Выбрав другой таймер, отличный от SysTick, кодогенератор перестроит функции и освободит это прерывание.
С другой стороны, вы можете в одном прерывании друг за другом выполнить HAL-овский и свой самописный код, это не возбраняется. В это прерывание можно даже вставить переключение выходного пина, чтобы на выходе получить синхронизированный с тиками времени сигнал.

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

Вс май 15, 2022 09:06:55

HAL мне кажется не очень хорошо поступил, занял чужую функцию.

У HAL-а, (вернее, у кодогенератора Cube) есть в настройках выбор таймера для системы отсчета времени. Выбрав другой таймер, отличный от SysTick, кодогенератор перестроит функции и освободит это прерывание.
С другой стороны, вы можете в одном прерывании друг за другом выполнить HAL-овский и свой самописный код, это не возбраняется. В это прерывание можно даже вставить переключение выходного пина, чтобы на выходе получить синхронизированный с тиками времени сигнал.

НовыйДень, одного не понимаю: зачем гадать, как работает отсчёт времени в ХАЛ, при этом не прочитав ни документацию на ХАЛ, не посмотрев его исходники?
В Кубе можно выбрать любой таймер для ХАЛ, который используется для отсчёта интервалов времени внутри ХАЛ. Как с ним можно поступить, я описал несколькими постами выше. Заметь, НовыйДень, что я описал как поступаю с ним на практике, а не гадаю на кофейной гуще как это делаю некоторые.

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

Вс май 15, 2022 11:50:05

Зачем инкрементировать эту переменную uwTick? Какое гениальное решение за этим кроется?
Отсчитывать сколько времени прошло? Это можно было бы сделать и без переполнения, например при достижении определённого значения uwTick обнулять эту переменную, считая секунды, а не миллисекунды.
Видимо чайники так и делают.
А если немного подумать, то легко догадаться, что для измерения небольших временных интервалов, достаточно запомнить текущее значение uwTick, а потом (для измерения времени, прошедшего с момента запоминания) вычислять: (unsigned)(uwTick_текущее - uwTick_запомненное). И никакие переполнения тогда не страшны.
И обнуления или дополнительные переменные не нужны, а только добавят кучу проблем и разрастание быдлокода.

Добавлено after 6 minutes 40 seconds:
Вы же даже простейшую функцию из 3-х строк нормально (оптимально) написать не можете:
Код:
  void SysTick_Handler(void)
  {
    if(delay_count>0)
    {
      delay_count--;
    }
  }
А уже лезете "править" код, написанный более грамотными людьми....

PS: Попробуйте всё-таки хоть на минутку включить голову и подумать. А не бездумно тыкать в клавиши.... :dont_know:
Последний раз редактировалось jcxz Вс май 15, 2022 14:40:21, всего редактировалось 3 раз(а).

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

Вс май 15, 2022 13:26:35

С такими "познаниями" в программировании вам действительно лучше не лезть в тот код.

koeltrad писал(а):Здесь переполнение думаю расчётам не повредит и 49 дней ограничения не будет.

Вы уверены что я достоин ваших постов. Избавьте меня от них, прошу.
С таким уровнем быдлятины лучше не писать под чужими постами, а воспитывать лучше своих щенят.
Ответить