Перейти к содержимому

Kods pv что это

  • автор:

Урок 17. Разработка программ, состоящих из нескольких исходных файлов. Определение и объявление переменных, область видимости, директива extern. Режимы компиляции Debug и Release.

Уроки STM32

Создадим программу обработки сигнала кнопки в фоновом режиме. Научимся связывать между собой переменные, размещенные в разных исходных файлах программы. Попутно затронем несколько важных тем, связанных с выполнением кода в обработчике прерывания. Научимся компилировать программу в конфигурациях Debug и Release.

Давайте, совместим теорию и практику. Повторим проект Lesson14_2, только обработку сигнала кнопки выполним параллельным процессом. Пока все это будем делать, узнаем много нового.

Создаем в в конфигураторе STM32CubeMX новый проект Lesson17_1. В нем все настройки, кроме таймера, задаем, как в предыдущем уроке:

  • тактирование – на максимальную частоту 72 мГц;
  • PC13 – активный выход;
  • PB13 – активный выход;
  • PB12 – вход с подтягивающим резистором;
  • таймер TIM1 — циклические прерывания с периодом 1 мс.

По сравнению с проектом предыдущего урока внесем одно изменение. Параметр Counter Period установим равным 100.

STM32CubeMX

Открываем проект в Atollic TrueStudio.

Мы собираемся использовать библиотеку Debounce, значит, проект надо преобразовать в C++. Необходимо выполнить 3 пункта (урок 11).

Мы будем использовать библиотеку. Необходимо ее подключить (урок 14). Для этого:

  • Копируем в проект папку Libraries с нашими библиотеками (пока там только одна).
  • Указываем в IDE путь к исходным файлам библиотеки (урок 14).

Уже в предыдущем уроке мы начали работать со вторым файлом исходного кода. Это был файл stm32f1xx_it.cpp. Он предназначен для размещения функций обработки прерываний.

Но в предыдущем проекте мы в обработчике прерывания вызывали стандартную HAL-функцию. На это раз нам надо использовать класс Debounce и сразу в двух файлах main.cpp и stm32f1xx_it.cpp. Этого мы еще делали.

Подключаем библиотеку в main.cpp

#include«../Libraries/Debounce/Debounce.h»

Но мы собираемся использовать ее и в файле stm32f1xx_it.cpp. Надо подключить библиотеку и там.

#include«../Libraries/Debounce/Debounce.h»

Если этого не сделаем, то компилятор напомнит об ошибке при трансляции.

Создаем объект для кнопки в файле main.cpp.

Debounce button(GPIOB, 1 << 12, 10); // экземпляр класса Debounce

Но объект button не описан в stm32f1xx_it.cpp.

Если мы повторим предыдущее определение объекта, то это будет уже другой объект. А нам надо работать с одним и тем же.

Определение и объявление.

Это не всегда одно и то же.

  • Определение переменной, функции, объекта означает предоставление компилятору полной информации, необходимой для его создания. Определение функции – это код с ее телом, определение класса означает предоставление всех методов и свойств и т.п. Как только что-то определено, оно также считается объявленным. Поэтому мы раньше не разделяли эти понятия.
  • При объявлении мы только сообщаем компилятору, что есть что-то определенного типа с определенным именем. Это позволяет разрабатывать код, понятный компилятору, опуская не нужные детали.

Часто объявления в чистом виде используются для работы с одними и теми же переменными в разных файлах. Еще одним примером могут служить прототипы функций. Мы размещаем полный код функции в конце исходного текста. Компилятор должен выдать ошибку, т.к. встретил в исходном тексте вызов функции, о которой он ничего не знает. Но в начале программы мы объявляем функцию. Размещаем ее прототип без тела, и компилятору этого достаточно.

Определение должно быть всегда одно, а объявлений может быть несколько.

Область видимости переменных. Ключевые слова static и extern.

Об этом мы говорили в уроках Ардуино. Давайте немного расширим знание этого вопроса.

  • Переменные, объявленные внутри блока, считаются локальными. Имеют локальную область видимости, т.е. в пределах блока. Они создаются в месте определения и уничтожаются при выходе из блока.
  • Переменные, объявленные вне блока, обычно в верхней части кода, называются глобальными. Они создаются при компиляции программы и имеют статическую продолжительность. Т.е. всегда существуют, никогда не уничтожаются.

В уроках Ардуино мы говорили, что глобальные переменные можно использовать в любом месте программы, что их область видимости неограниченна. Но программы Ардуино, как правило, состоят из одного файла с исходным текстом. Директива #include не в счет. Она просто позволяет разделить файл с кодом на части.

Глобальные переменные имеют файловую область видимости. Их можно использовать в любом месте файла, в котором они объявлены. Но не в других файлах.

Кроме области видимости и продолжительности, у переменных есть еще одно свойство – связь. Оно определяет, относятся ли несколько упоминаний одного идентификатора (имени) к одной и той же перемененной или нет.

  • Локальная переменная – переменная без связей. Например, две переменные с одинаковыми именами, объявленные в разных функциях, не имеют никакой связи. Это разные переменные. Просто их назвали одинаковыми именами.
  • Внутренняя или статическая переменная может использоваться в любом месте файла, в котором она определена. Но переменная с тем же именем, определенная в другом файле – это уже другая переменная.
  • Внешняя переменная доступна, как в файле, в котором она определена, так и в других файлах проекта.

Т.е. понятие того, что мы раньше называли глобальной переменной, разделилось на внешнюю и внутреннюю (статическую) переменные.

  • Для определения внутренней (статической) переменной используется ключевое слово static .
  • Для определения внешней переменной используется ключевое слово extern .
  • По умолчанию:
    • неконстантные переменные, объявленные вне блока, считаются внешними.
    • константные переменные считаются внутренними.

    Добавлю для полноты картины, что функции имеют такие же свойства связи. По умолчанию они внешние, но с помощью ключевого слова static можно изменить их на внутренние. Отличие заключается в том, что объявления функций не нуждаются в слове extern . Компилятор определяет, что это функция или ее прототип по наличию тела.

    Вернемся к нашей программе.

    В файле main.cpp мы сделали определение объекта. Предоставили компилятору все данные о нем, и компилятор создал объект, выделил для него необходимую память.

    Debounce button(GPIOB, 1 << 12, 10); // экземпляр класса Debounce

    Объект получился внешним, с глобальной областью видимости.

    В файле stm32f1xx_it.cpp мы делаем объявление (не определение) того же объекта button . С помощью директивы extern сообщаем компилятору, что объект был создан где-то в другом месте.

    extern Debounce button;

    В прерывании по таймеру вызываем метод обработки сигнала кнопки.

    void TIM1_UP_IRQHandler(void) <
    /* USER CODE BEGIN TIM1_UP_IRQn 0 */

    button.scanAverage(); // обработка сигнала кнопки

    /* USER CODE END TIM1_UP_IRQn 0 */

    /* USER CODE BEGIN TIM1_UP_IRQn 1 */

    Остается в главном цикле проверять флаг нажатия кнопки и инвертировать по нему состояние светодиода.

    while (1) <
    /* USER CODE END WHILE */

    if(button.readFlagFalling() != 0)
    HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);

    Еще надо не забыть разрешить работу таймера.

    /* USER CODE BEGIN 2 */

    HAL_TIM_Base_Start_IT(&htim1); // запуск таймера

    Обработка сигнала кнопки происходит в фоновом режиме. В главном цикле мы работаем с признаками состояния сигнала, очищенными от помех, дребезга и т.п.

    Загрузить проект можно по ссылке:

    Библиотеку Debounce мы подключали в двух файлах. У нас есть заголовочный файл main.h, который включается во все файлы исходного кода. Давайте подключим библиотеку один раз в нем.

    Я убрал подключение библиотеки в файлах main.cpp и stm32f1xx_it.cpp и добавил строчку в main.h.

    #include«../Libraries/Debounce/Debounce.h»

    Вот проект с такими изменениями:

    Библиотеки, которые используются только в одном файле исходного текста лучше в нем и подключать. Общие для нескольких файлов библиотеки удобно подключать в заголовочном файле main.h.

    Режимы Debug или Release.

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

    Компилятор может захотеть оптимизировать код программы. И что ему придет на ум не известно.

    Признаки состояния кнопки изменяются в моменты прерывания таймера. Это аппаратные события. Компилятор не способен их предсказать. Поэтому он вполне может решить, что признаки остаются все время постоянными. Тогда зачем их проверять. В результате компилятор может выбросить код проверки признаков кнопки из основного цикла.

    Оптимизация происходит по-разному в зависимости от установок компилятора. В большей мере на это должен повлиять режим компиляции: Debug или Release.

    Главное отличие режимов – это назначение.

    • Режим Debug предназначен для использования на этапе разработки и отладки программ.
    • Release – применяется для окончательной сборки программы и последующего ее использования.

    В режиме Release из кода удаляется отладочная информация. Но при этом на этапе компиляции исключаются дополнительные проверки.

    В результате в режиме Release:

    • исполняемый код программы короче;
    • программа может работать быстрее;
    • происходит оптимизация кода.
    • Могут возникнуть новые ошибки, если код недостаточно корректно написан.
    • Исключены некоторые проверки кода.
    • Оптимизация может привести к дополнительным ошибкам, связанным с параллельными процессами.

    Давайте соберем наш последний проект в режиме Release и проверим, как будет работать программа. Заодно научимся получать исполняемый код в такой конфигурации компилятора.

    Я копировал проект с именем Lesson17_3.

    В результате в папке Debug появился файл Lesson17_3.hex. Это была компиляция в режиме Debug.

    Настроим проект на режим Release.

    Открываем: Project -> Build Settings -> Tool Settings.

    Сверху строчка с выпадающим меню, которая говорит, что активен режим Debug.

    Atollic TrueStudio

    Нажимаем кнопку Manage Configurations.

    Выбираем Release. Затем Set Active и Ok.

    Установка Release

    В строке Configuration выбираем Release.

    Atollic TrueStudio

    Теперь необходимо для конфигурации Release копировать установки из закладок C Compilier в C++ Compilier. Так мы делали в уроке 11, когда конвертировали проект в C++.

    • C Compilier -> Symbols копировать в C++ Compilier -> Symbols;
    • C Compilier -> Directories копировать в C++ Compilier ->Directories.

    Копирование установок

    Остается указать компилятору путь к библиотеке Libraries.

    • Правой кнопкой мыши по Libraries.
    • Properties -> C/C++ General -> Paths and Symbols -> Source Location -> Add Folder
    • Libraries -> OK

    Путь к библиотеке

    Теперь компилируем проект. Выходной код должен оказаться в папке Release. Смотрим.

    Результаты компиляции

    Если вы не увидите в этом списке файла с расширением hex, то необходимо установить:

    • Project -> Build Settings -> Tool Settings -> Output format
    • Птичка Convert build output.
    • Выбрать Format Intel Hex.

    Выходной формат

    Загружаем в плату, проверяем. Напомню, что исполняемый код в папке Release, а не в Debug.

    Ссылка для загрузки проекта:

    Мы хотели проверить, как ведет себя компилятор с переменными, которые изменяют сое состояние в обработчике прерывания. У меня все работает. Т.е. оптимизация компилятора в режиме Release не испортила нашу программу.

    Но, если изменить настройки оптимизации, то могут быть проблемы.

    Поэтому я подправил библиотеку Debounce. Решил отметить признаки и функции чтения признаков квалификатором volatile.

    class Debounce <

    public:
    uint8_t readFlagLow(void) volatile; // чтение признака СИГНАЛ В НИЗКОМ УРОВНЕ
    uint8_t readFlagRising(void) volatile; // чтение признака БЫЛ ПОЛОЖИТЕЛЬНЫЙ ФРОНТ
    uint8_t readFlagFalling(void) volatile; // чтение признака БЫЛ ОТРИЦАТЕЛЬНЫЙ ФРОНТ

    volatile uint8_t flagLow; // признак СИГНАЛ В НИЗКОМ УРОВНЕ
    volatile uint8_t flagRising; // признак БЫЛ ПОЛОЖИТЕЛЬНЫЙ ФРОНТ
    volatile uint8_t flagFalling; // признак БЫЛ ОТРИЦАТЕЛЬНЫЙ ФРОНТ

    По задумке теперь компилятор никогда не будет оптимизировать отмеченные переменные.

    Вот откорректированная библиотека Debounce:

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

    Еще я проверил, размеры исполняемого кода для режимов Release и Debug. Они оказались абсолютно одинаковыми.

    Размер исполняемого кода

    Очевидно у нас такая простая программа, что оптимизировать там нечего.

    Но в любом случае на этапе разработки лучше работать с программой в конфигурации Debug, и только окончательный вариант компилировать в режиме Release.

    В следующем уроке будем задавать конфигурацию таймера и реализовывать обработку кнопки с помощью библиотек HAL и LL.

    Grand Piece Online GPO Private Server Codes (October 2023)

    Here are all the available Grand Piece Online Private Server Codes 2023.

    By Phil James Last updated Sep 29, 2023

    Grand Piece Online GPO Private Server Codes

    If you are playing GPO, you are probably looking for Roblox Grand Piece Online VIP Private Server Codes. These private servers cost 700 Robux to create and share with others. But thankfully, there are many codes you can use to join these VIP private servers already created by others. So if you are looking for such codes, don’t worry we have a list of them that you can use to play right away. So let’s get right into it.

    Last checked for new codes on September 29, 2023.

    GPO VIP Private Server Codes – Grand Piece Online

    Here are the Roblox GPO Private Server Codes you can use to access VIP Servers in Grand Piece Online.

    GPO Private Server Codes VIP

    GPO Private Server Codes List (October 2023)

    Here are all the working codes:

    • vYF7N93cqH (Thanks to Soggy)
    • 3ITxE7x6BI (thanks to LegoDeveloper)
    • InexXeoTxM (thanks to UntitledFormula)
    • j7Rwd2tMxi (thanks to Aleksosan 22)
    • OOCCGNUrSF (thanks to Tunz)
    • pwKzqDhexo (thanks to Luck)
    • qR2Q1cto41 (thanks to Akatcuchi5)

    Here are all the expired codes:

    • lTKvkgl
    • Y1ak8uz
    • 3qvfSoX
    • 94Syc8l
    • 9hfCyed
    • 9uBsplh
    • AiU4k83
    • DWFzWTm
    • IwIrdo2
    • LUDKxyA
    • Lo8sLdJ
    • PXAB69c
    • QfS72Sd
    • R4T9P8w
    • Xe9Nakz
    • Xom9bhj
    • b7EcdlX
    • iQ7DVeo
    • k9C2lvY
    • mnOFnpc
    • qCUuDoO
    • r2b9Wmp
    • um02dAc
    • v6aZ29W
    • zZ2LkB2

    These are created by kind YouTubers who shared these codes through their channels to the community. Do note that if you are not able to join, it’s because the server is full or the code is not working at that point. Make sure to check back here for more.

    And now, here are the videos of those YouTubers we collected these private server codes from:

    • https://www.youtube.com/watch?v=NZRXC6Lkj2M
    • https://www.youtube.com/watch?v=wtmRBstNHvk
    • Private Server code from Prime Animations Discord (Join their Discord to use this)
    • https://www.youtube.com/watch?v=-Or1z54J0gE
    • https://www.youtube.com/watch?v=49EuL7bCtJw
    • https://www.youtube.com/watch?v=PtLx35Aqyjk
    • https://www.youtube.com/watch?v=JyfT5ayq1p0
    • https://www.youtube.com/watch?v=t_BptmVGC7g
    • https://www.youtube.com/watch?v=Vh9BLakdaNU
    • https://www.youtube.com/watch?v=aAPuxl95IIo
    • https://www.youtube.com/watch?v=YsC_txNjQIs
    • https://www.youtube.com/watch?v=LbwcHpE_PCA
    • https://www.youtube.com/watch?v=Y8180W7sHu8
    • https://www.youtube.com/watch?v=BYmvdcsYgRs
    • https://www.youtube.com/watch?v=uE8GuZcitdQ
    • https://www.youtube.com/watch?v=Nt6bg–yhJM
    • https://www.youtube.com/watch?v=RySCZ8y0q6s

    Is any GPO private server not working? Try out one of the other VIP servers from our list and begin playing! There could be a chance that the server is full too.

    That’s everything you need to know about Roblox Grand Piece Online GPO Private Server VIP Codes. Also, make sure to check out other Private server codes for Shindo Life, AUT, Slayers Unleashed too. While you are here, don’t miss out on the Roblox Promo Codes and Roblox Game Codes you can use to get more legit freebies on the platform.

    Phil is a creative and imaginative person who loves to tell stories. He believes video games are a powerful medium that can transport players to new and exciting worlds. He is excited to continue writing and gaming and hopes one day to create a fun video game.

    Коды частных серверов Dunes Village (июль 2022 г.)

    Гайды

    Вот список кодов частных серверов Roblox для Деревни дюн в Shindo Life.

    Если вы пытаетесь получить серверы для доступа к новой Деревне дюн в Синдо Life, тогда вы находитесь в правильном месте. У каждого частного сервера есть код, который вы можете использовать для доступа к этому серверу в этом месте. Вы можете продолжать загружать свою игру в любом месте, которое вы выберете, пока у вас есть эти коды. Итак, давайте посмотрим на весь список кодов частных серверов Shindo Life Dunes Village.

    ТАКЖЕ ЧИТАЙТЕ: коды частных серверов Shindo Life для всех мест

    Коды частных серверов Sindo Life Dunes Village (июль 2022 г.) )

    Вот коды приватных серверов для Shindo Life Dunes Village:

    • _34jSv
    • _KTfgq
    • 0258 мВт
    • 0bH64Z
    • 0K4i81
    • 0LA1RZ
    • 0NcfC-
    • 0oR33t
    • 0q3NdM
    • 0Skr9C
    • 0st9RX
    • 0uP7b7
    • 0Wo-79
    • 0xKCX_
    • 14Ej3_
    • 1fErxH
    • 1Kc9Pn
    • 1QaPSq
    • 3CawAD
    • 3IshtW
    • 3qIYHD
    • 3zuqKX
    • 4Nr34A
    • 5Nxv-u
    • 5oFhPA
    • 5Qk8sk
    • 5UEgCH
    • 7EjS9t

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

    AvocadoBeard error code in Sea of Thieves explained

    The error codes in Sea of Thieves are oddly named as if they were old pirate captains, but they have entirely valid explanations of how to handle them. The AvocadoBeard error code is a relatively simple one that many players received when the game first launched. It means the account you are attempting to play on in Sea of Thieves does not have access to Xbox Live, and you can’t log into the game because you cannot play it offline. It means the same thing if you attempt to log into the game on Steam, which is confusing because you do not need Xbox Live to play the game through Steam.

    If you’re playing from an Xbox One or through the Xbox beta application from your PC, you need to have Xbox Live on your account if you do not have a subscription to the Xbox PC Game Pass. Ensure the credit card or payment information you’re using is valid and has not expired. After you settle the payment issues, you should be able to log back into the game with no further problems. The same goes to those who have an Xbox Game Pass or PC Game Pass subscription.

    For those experiencing this when playing through Steam, double-check the Microsoft account you are logging into Sea of Thieves. If you log into the game that is not connected to the Steam account that owns Sea of Thieves, you see the AvocadoBeard error message pop up. To make sure you’re using the correct Microsoft account, try logging into Sea of Thieves by directly clicking the application through your Steam library. If that doesn’t work, visit the Sea of Thieves website to double-check the Microsoft account you have there is linked to your Steam account, which could be causing the issues.

    To double-check you have the correct account you could uninstall it from Steam and give it a fresh install. This way, you’d be able to sync the proper accounts together, primarily if another Microsoft account owner uses the same computer.

    About the author

    Zack Palm

    Zack Palm is the Senior Writer of Gamepur and has spent over five years covering video games, and earned a Bachelor's degree in Economics from Oregon State University. He spends his free time biking, running tabletop campaigns, and listening to heavy metal. His primary game beats are Pokémon Go, Destiny 2, Final Fantasy XIV, and any newly released title, and he finds it difficult to pull away from any Star Wars game.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *