Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 2160.pdf
Скачиваний:
28
Добавлен:
30.04.2022
Размер:
9.07 Mб
Скачать

Несколько сложнее обстоит дело со считыванием данных из подчиненного устройства (рис. 2.29). В данном случае мастер аналогично сначала формирует сигнал «Старт» и передает адрес подчиненного устройства. Однако после этого мастер освобождает линию данных и генерирует только тактовые сигналы. Подчиненное устройство передает один байт данных и теперь уже мастер уведомляет подчиненное устройство подтверждением приема. После передачи последнего байта мастер формирует на линии неподтверждение приема (NACK), освобождая линию данных. Подчиненное устройство воспринимает это как сигнал окончания передачи и также освобождает линию данных. В конце передачи мастер формирует состояние «Стоп».

Рис. 2.29. Диаграмма передачи данных в режиме чтения по интерфейсу

I2C [5]

Таким образом, рассмотрено внутренне устройство и принцип работы последовательного интерфейса I2C микроконтроллера STM32ZGT6. Описана последовательность действий для записи и чтения одного байта данных в/из подчиненного устройства. Более подробно конкретные реализации обмена данными описаны в последующих разделах.

3. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ РОБОТИЗИРОВАННОГО УСТРОЙСТВА

3.1. Многозадачность

Mногозадачность – это свойство системы обеспечивать параллельную (либо псевдопараллельную) обработку каких-либо процессов. Многозадачность подразделяется на три вида: невытесняющая, кооперативная (совместная), а также вытесняющая. В настоящее время реализовано большое количество операционных систем реального времени (ОСРВ) уже содержащих в себе реализацию того или иного вида многозадачности. Однако все они имеют довольно большой недостаток – они нагружают микроконтроллер и тем самым уменьшают его вычислительные возможности. Каждый процесс в ОСРВ имеет свой стек и область памяти для выполнения.

В случае, если несколько процессов должны иметь доступ к какомулибо одному ресурсу, необходимо корректно синхронизировать их

45

действия. Кроме того, при использовании ОСРВ также затруднена обработка прерываний. Рассмотрим виды многозадачности более подробно.

При невытесняющей многозадачности все процессорное время предоставлено одной задаче. Остальные задачи ожидают своей очереди. Переключение между задачами происходит через равные промежутки времени – кванты времени (в терминологии операционных систем). К преимуществам данного метода можно отнести простоту реализации переключения задач, а также необходимость контролирования в текущий момент времени лишь одной задачи. Существенным недостатком при этом является структура реализации самих задач, так как они должны иметь возможность приостановки своей деятельности. Реализация переключения распределена между самими задачами и программой.

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

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

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

46

3.2.Комбинированная многозадачность средствами ОСРВ

Вкачестве ОСРВ для использования в роботизированном устройстве выбрана операционная система FreeRTOS (далее просто ОСРВ). Это многозадачная операционная система реального времени, предназначенная для использования во встраиваемых системах. Данная операционная система имеет поддержку большого количества архитектур процессоров (ARM, RISK и другие), благодаря чему ее можно использовать для применения в широком диапазоне задач. Операционная система написана на языке программирования C со вставками кода на ассемблере в критических местах с точки зрения скорости выполнения местах.

Программа во FreeRTOS разделяется на задачи. Каждая задача представляет собой мини подпрограмму, имеющую свою собственную точку схода и стек. Внутри данной подпрограммы в бесконечном цикле исполняется необходимый программный код. При этом подпрограмма не должна сама завершать свое исполнение, иначе это может привести к непредсказуемым последствиям. Каждая подпрограмма может быть использована для работы сразу в нескольких задачах. На рис. 3.1 изображен пример исходного кода задачи ОСРВ.

Рис. 3.1. Пример исходного кода задачи ОСРВ

Для создания новой задачи в ОСРВ предусмотрена специализированная функция – xTaskCreate (). Данная функция принимает в качестве параметров указатель на подпрограмму задачи, строковую переменную, содержащую название задачи, а также размер стека и параметры задачи.

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

Переключение задач происходит через равные интервалы времени (кванты ОСРВ) в соответствии с уровнем приоритета задачи. Квант времени настраивается программно при запуске роботизированного устройства равным 1

47

мс. Таким образом, минимальное время реакции роботизированного устройства также равно 1 мс. При возникновении прерывания зачастую ждать столько времени не представляется возможным, поэтому необходимо принять меры для решения этой проблемы. Для этого в конце каждой функции обработки прерывания используется макрос TaskYIELD (). Данный макрос производит проверку ожидания исполнения другой задачи с более высоким приоритетом. Если такая задача имеется, то макрос осуществляет переключение контекста. Таким образом, в роботизированном устройстве реализована комбинация из вытесняющей и кооперативной многозадачности.

Таким образом, в данном разделе приведены общие сведения об ОСРВ FreeRTOS, описаны основные функции операционной системы, а также взаимодействие между задачами. Приведено решение проблемы минимального кванта времени.

3.3. Управление тактовой частотой микроконтроллера

При запуске микроконтроллер роботизированного устройства тактируется от встроенного RC-генератора частотой 16 МГц. Данный генератор является нестабильным, поэтому на отладочной плате микроконтроллера присутствует кварцевый резонатор, настроенный на частоту 8 МГц.

На рис. 3.2 показана структура подсистемы тактирования микроконтроллера. Для ядра и периферийных устройств можно настроить тактовую частоту раздельно. Кроме того, относительно малую частоту кварцевого резонатора можно дополнительно увеличить до 168 МГц путем ее преобразования в блоке фазовой автоподстройки (PLL). Периферийные устройства микроконтроллера тактируются от двух шин – APB1 и APB2. Частоту каждой из них также можно настроить индивидуально.

Рассмотрим процедуру инициализации микроконтроллера. При входе в функцию main () происходит вызов подпрограммы SysClockInit (). Первым этапом в данной функции происходит настройка латентности памяти. Для этого используется функция LL_FLASH_SetLatency () из библиотеки LL. Латентность памяти используется для того, чтобы быстрое ядро микроконтроллера оптимизировало свою работу с более медленной памятью ПЗУ. Так, одно обращение к памяти может занимать несколько тактов процессорного времени, которое можно использовать для других целей.

Затем происходит включение внешнего генератора – кварцевого резонатора 8 МГц при помощи функции LL_RCC_HSE_Enable (). При включении возможно наблюдение переходных процессов, поэтому после выполнения функции происходит ожидание установления режима работы генератора при помощи функции LL_RCC_HSE_IsReady ().

Следующим этапом происходит настройка коэффициентов деления и умножения PLL, а также шин APB1 и APB2. Для этого используются функции

48