2. Концепция

Одно приложение определенно запустит несколько стручков. Несколько стручков определенно сохранят данные. Когда стручок умрет, данные исчезнут. Следовательно, у K8S есть концепция PV., PVC — это способность распределения PV на Pod Pod
ПВХ — это оператор, хранящийся пользователями. ПВХ и POD аналогичны. POD потребляет узлы. Для пользователей, которые действительно используют хранилище, им не нужно заботиться о деталях хранения дна, им нужно только использовать ПВХ напрямую.
3. Используйте процесс
1. Настройте пространство для хранения:
Администраторы хранения настроены с помощью устройств хранения (например, NFS, ISCSI, CEPH RBD, GLUSTFS), и вырезают много места для хранения, которые можно использовать независимо;
2. Определите PV:
Администратор кластера K8S представил пространства для хранения, настроенные в кластер K8S, определяемый как PV (постоянный объем, постоянный объем);
3. Определите ПВХ:
Пользователи K8S должны сначала создать ПВХ при создании ПВХ при создании POD (найдите PV тома хранения, которые могут соответствовать условиям в кластере K8S). Примечание: PV и PVC являются одному -одному соответствию. Как только PV занят ПВХ, этот PV больше не может быть занят другими ПВХ. Bound ** После создания ПВХ он эквивалентен объему хранения, который может использоваться несколькими стручками.
4. Используйте ПВХ
Используйте ПВХ в POD. Если PV, который соответствует условиям ПВХ, не существует, а затем используйте этот ПВХ в настоящее время, то стручка будет отображать ожидающее состояние.
4. Настройте NFS
1. Построить NFS
Используйте только сервер, чтобы создать NFS общего хранилища
Адрес сервера NFS — 192.168.100.111
2. Создать каталог NFS хранения
3. Подготовьте файлы конфигурации
4. Начать обслуживание
5. Просмотреть информацию NFS
6. Установите клиент NFS на узле узла
5. Создайте PV
Он был успешно создан в настоящее время, и государство доступно
6. Создайте ПВХ
При создании PV и PVC только один и тот же тип StorageClass может быть сопоставлена вместе, поэтому установить одну и ту же тег StorageClassName
Приложение из ПВХ не должно запрашивать определенный класс. Если значение атрибута PVC STORageClassName установлено на «», считается, что его просят запросить, чтобы объем PV класса хранения не был установлен.
Когда ПВХ установлен в дополнение к запросу StorageClass selector Затем эти две потребности будут выполняться по логике и отношениям: только PV, которые принадлежат классам запросов и имеют метку запроса, могут быть связаны с ПВХ.
StorageClassName of PVC здесь настроено как «», и все PVS, которые будут автоматически и не настраиваются.
Уведомление:
Здесь вы также можете настроить StorageClassName PV и PVC в качестве того же имени, чтобы вы могли сопоставить этот атрибут
Урок 17. Разработка программ, состоящих из нескольких исходных файлов. Определение и объявление переменных, область видимости, директива extern. Режимы компиляции Debug и Release.

Создадим программу обработки сигнала кнопки в фоновом режиме. Научимся связывать между собой переменные, размещенные в разных исходных файлах программы. Попутно затронем несколько важных тем, связанных с выполнением кода в обработчике прерывания. Научимся компилировать программу в конфигурациях Debug и Release.
Давайте, совместим теорию и практику. Повторим проект Lesson14_2, только обработку сигнала кнопки выполним параллельным процессом. Пока все это будем делать, узнаем много нового.
Создаем в в конфигураторе STM32CubeMX новый проект Lesson17_1. В нем все настройки, кроме таймера, задаем, как в предыдущем уроке:
- тактирование – на максимальную частоту 72 мГц;
- PC13 – активный выход;
- PB13 – активный выход;
- PB12 – вход с подтягивающим резистором;
- таймер TIM1 — циклические прерывания с периодом 1 мс.
По сравнению с проектом предыдущего урока внесем одно изменение. Параметр Counter Period установим равным 100.

Открываем проект в 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.

Нажимаем кнопку Manage Configurations.
Выбираем Release. Затем Set Active и Ok.

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

Теперь необходимо для конфигурации 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.
о Codes.pw

Индекс качества сайта Codes.pw
на сегодня 19 июля 2023 года, среда:
(чем индекс больше — тем лучше).Оцените рейтинг сайта codes.pw по 5-бальной шкале от 1 до 5, кликнув на соответствующую звёздочку выше.
1 звезда — хуже некуда
2 звезды — плохо
3 звезды — удовлетворительно
4 звезды — хорошо
5 звёзд — отличноНаш сайт wdomain.ru не имеет отношения к сайту и домену codes.pw и все данные о сайте и домене на этой странице принадлежат и относятся к сайту и домену codes.pw
Наши юристы помогут, если ваши права были нарушены — опишите как можно подробнее проблему и вам предложат пути её решения.
Отзывы, жалобы и информация о сайте codes.pw.
Оставьте ниже на этой странице о сайте codes.pw свой отзыв, жалобу или задайте вопрос. Пишите текст без переноса строк, все переносы строк автоматически удаляются.
За оставленные отзывы ответственность несут пользователи, нецензурные комментарии будут удалены.
Добавьте эту страницу в закладки для отслеживания ответов, уведомления на этом сайте нет.Что за сайт codes.pw?
Вы можете посетить этот сайт, только если он существует и доступен в настоящее время.
Отзывы о сайте codes.pw можно найти или на этой странице (если они есть), или на других сайтах, которые вы найдёте.
Вы можете узнать, что на сайте codes.pw было раньше — из истории сайта codes.pw на этой странице ниже. Иногда это бывает важной информацией, если сейчас сайт не доступен.Не работает сайт codes.pw?
Если у вас не работает и не открывается сайт codes.pw — проверьте его на доступность в сети Интернет прямо сейчас.
Анализ сайта
По данным запроса к сайту:Код статуса HTTP: 200
Адрес сайта: http://codes.pw/
Время запроса к странице: 0.424456 сек.
Поле заголовка Content-Type: text/html
Число перенаправлений: не определено.
Время перенаправления: 0 сек.
Основной порт: 80
Данные обновлены: 17-07-2023 01:53Данные о сайте
Тема сайта: не определена.
Заголовок сайта: не определён.
IP-адрес сайта: 192.64.117.134
Расположение сервера: США Калифорния Лос-Анджелес
Координаты сервера: Широта: 34.05223 Долгота: -118.24368
Данные обновлены: 17-07-2023 01:53Посещаемость сайта
Рейтинг сайта codes.pw по SimilarWeb (требуется регистрация).
Номер рейтинга покажет место сайта codes.pw в общем списке всех сайтов по посещаемости, чем меньше число рейтинга и сайт выше в списке — тем больше посещаемость.
Метаданные сайта
Описание главной страницы:
не определено.
Ключевые слова главной страницы:
не определены.
Данные обновлены: 17-07-2023 01:53Оценка домена
Исправьте ошибки и оптимизируйте страницы сайта с помощью PR-CY. Улучшите видимость в поисковых системах.
- Анализ от 1000 страниц сайта и поиск ошибок на каждой странице;
- Ежедневный мониторинг основных метрик сайта;
- Проверка позиций вашего сайта, задачи и рекомендации для продвижения сайта;
Важные события
Чек-лист
Список из 80 задач подскажет, что можно сделать на сайте для его продвижения.
Метрики
Описание
Индекс качества сайта — это показатель того, насколько полезен ваш сайт для пользователей с точки зрения Яндекса.
При расчете индекса качества учитываются размер аудитории сайта, поведенческие факторы и данные сервисов Яндекса. Значение индекса регулярно обновляется.
Если у сайта есть зеркало, то показатель неглавного зеркала сайта будет равен показателю главного.
Показатель ИКС поддомена сайта, как правило, равен показателю основного домена.
Дополнительная информация
Статьи по теме
Описание
Рядом с адресом сайта в результатах поиска Яндекса могут появляться знаки, основанные на данных о поведении пользователей. Такие знаки могут свидетельствовать об удовлетворенности пользователей и их доверии к сайту.
Популярный сайт — сайт получает этот знак, если имеет высокую посещаемость и постоянную аудиторию.
Выбор пользователей — знак получают сайты с высокой степенью вовлеченности и лояльности пользователей по данным Яндекса.
Статьи по теме
Описание
Примерное количество проиндексированных страниц в выдаче Яндекса можно посмотреть через оператор site:, что мы и делаем. Он покажет результат поиска по URL сайта, но точную цифру страниц в индексе выдавать не обязан.
Точные данные Яндекс отображает в Яндекс.Вебмастере. График изменений количества находится в разделе «Индексирование сайта» — «Страницы в поиске».
Описание
Сколько страниц сайта Google точно проиндексировал, узнать невозможно. Поисковик не ведет базу данных по URL-адресам.
Примерное количество страниц в выдаче покажет оператор site:, на который мы ориентируемся. Число может быть искажено страницами, которые запрещены к индексу в robots.txt, но попали в выдачу из-за внешних ссылок на них.
Чуть более точное количество покажет раздел «Статус индексирования» в Google Search Console, но и эти данные могут быть искажены из-за применения фильтров.
Описание
Примерное количество проиндексированных страниц в выдаче Яндекса можно посмотреть через оператор site:, что мы и делаем. Он покажет результат поиска по URL сайта, но точную цифру страниц в индексе выдавать не обязан.
Точные данные Яндекс отображает в Яндекс.Вебмастере. График изменений количества находится в разделе «Индексирование сайта» — «Страницы в поиске».
Рейтинг домена — 1 / 100
Разместите кнопку с PR-CY Rank на сайт. Кнопка показывает уровень доверия и качество площадки.
Описание
PR-CY Rank — рейтинг для оценки перспективности сайтов в качестве доноров для линкбилдинга. При формировании рейтинга мы анализируем трафиковые и трастовые параметры, а также ссылочный профиль сайта.
Влияние — потенциал влияния сайта на продвижение. Если влияние слабое, то слабым будет как отрицательный эффект (если рейтинг низкий), так и положительный (если рейтинг высокий) и наоборот. Потенциал влияния основан на размере постоянной аудитории сайта.
Ссылочный фактор — вычисляется на основе соотношения входящих и исходящих ссылок на сайт, значений Trust Rank, Domain Rank и др.
Трафиковый фактор — вычисляется на основании объёма и динамики трафика (отрицательная динамика портит рейтинг, положительная динамика — повышает).
Трастовый фактор — анализирует множество параметров, таких как “ИКС”, доля поискового трафика в общем трафике, адаптацию под мобильные устройства и множество других факторов, признанных поисковыми системами, как значимые для ранжирования.