Рассматривается пример работы кода Micrium RTOS µC/OS-II для ARM7, запущенный на макетной плате AT91SAM7X [3] (микроконтроллер AT91SAM7X512). Если встретите непонятные термины, то обращайтесь в раздел [Словарик] и в руководство по практическому использованию FreeRTOS [2].
Пример проекта с использованием Micrium RTOS µC/OS-II для ARM7 можно бесплатно скачать с сайта Micrium (нужна регистрация), или см. ссылку [1]. Проект IAR 5.4 находится в файле Micrium \ Software \ EvalBoards \ Atmel \ AT91SAM7X256 \ IAR \ OS-Probe \ AT91SAM7X256-OS-Probe.eww. Основной код (тело main) находится в Micrium \ Software \ EvalBoards \ Atmel \ AT91SAM7X256 \IAR \ OS-Probe \ app.c. Пример рассчитан на работу кода во FLASH микроконтроллера AT91SAM7X256, но его без проблем и изменений можно запустить на микроконтроллере AT91SAM7X512.
[Обзор проекта Micrium RTOS µC/OS-II для ARM7]
Когда загрузите проект [1] в IAR, то в браузере Workspace увидите дерево составных частей проекта.
APP. Эта ветка предназначена для модулей и заголовков, относящихся в основном к коду пользователя. Код пользователя должен иметь особую организацию, чтобы RTOS µC/OS-II могла работать, что и демонстрируется в app.c. В частности, в этом разделе должен быть определен обязательный набор функций, и они должны быть вызваны специальным образом.
app.c Модуль, который содержит определение функции main, и определение обязательных функций App_TaskStart, App_EventCreate, App_TaskCreate, и необязательных функций, которые выполняют задачи пользователя - App_TaskUserIF, App_TaskJoy, App_DispScr_SignOn, App_DispScr_VerTickRate, App_DispScr_CPU, App_DispScr_CtxSw.
app_cfg.h Обязательный заголовок, в котором задаются все опции конфигурации Micrium RTOS µC/OS-II - подключение отдельных модулей RTOS, приоритеты задач, размеры стеков для задач, конфигурация плагинов, разрешение работы DCC, конфигурация библиотек uC/LIB, конфигурация BSP, конфигурация отладочного вывода (для ARM7 обычно это DBGU).
app_hooks.c Модуль, где задаются хуки (обработчики) на различные системные события RTOS µC/OS-II. Например, это могут быть события создания, удаления задачи, переключения контекста, события тика и другие. Можно добавить пользовательский код в эти хуки, и нужные действия будут выполняться при возникновении определенных системных событий RTOS.
app_probe.c Модуль для проб, который необходим для работы системы µC/Probe.
app_probe.h Хедер для модуля app_probe.c. В настоящее время он не используется. Нужен для задания объявлений для функций и глобальных переменных.
cpu_cfg.h Хедер, где задается конфигурация используемого CPU. Тут настраивается измерение загрузки CPU, имя CPU и другие параметры.
includes.h Хедер для подключения других заголовков (stdio.h, string.h, .., ioat91sam7x256.h и т. п.).
os_cfg.h Опции конфигурирования uC/OS-II Real-Time Kernel. Все опции хорошо задокументированы в файле os_cfg.h.
probe_com_cfg.h Опции конфигурирования обмена через различные доступные интерфейсы (RS-232, TCP/IP, USB).
BSP. Модули, которые относятся к поддержке макетной платы, на которой запускается код (Board Support Package). В нашем случае пример предназначен для фирменной платы Atmel AT91SAM7X-EK Evaluation Board, но он будет отлично без всяких переделок работать и на плате AT91SAM7X [3].
at91sam7x128-flash.board Файл для настройки загрузки кода через отладчик.
AT91SAM7X256_Flash.icf Файл настройки линкера.
AT91SAM7X256_Flash.mac Макросы низкоуровневой инициализации.
bsp.c Код, обеспечивающий поддержку аппаратуры платы (светодиоды, джойстик, SD/MMC/DataFlash, CAN и т. п.).
bsp.h Заголовочный файл для bsp.c. Здесь определены объявления функций и основные константы для выбора тактовой частоты, настройки делителя, идентификаторы периферии и т. п.
cstartup.s Традиционный модуль на ассемблере, в котором находится низкоуровневый код запуска подсистемы ядра микроконтроллера - таблица векторов прерываний, точка входа в программу, инициализация стека.
ioat91sam7x256.h Типы, структуры и константы, относящиеся к ядру микроконтроллера и его аппаратуре.
uc/CPU. Модули, относящиеся к CPU микроконтроллера.
cpu_core.c Функции инициализации ядра, получения имени микроконтроллера, отслеживание реального времени работы CPU и т. п. Доступность большинства функций зависит от опций конфигурирования, заданных в cpu_cfg.h.
cpu_core.h Прототипы и описание функций cpu_core.c.
cpu_def.h Константы, описывающие поведение микроконтроллера - размер слова CPU, порядок байт в слове, направление роста стека, метод обработки критической секции кода,
uc/CPU -> ARM. Модуль порта процессора - низкоуровневый код на ассемблере для разрешения / запрета прерываний, обработки критических секций.
cpu.h Описание прототипов функций.
cpu_a.s Модуль на языке ассемблера, содержащий реализацию функций CPU.
uC/LIB. Модули библиотечных функций.
lib_ascii.c Обработка отдельных текстовых символов - является ли символ буквой и/или цифрой, определение регистра символа (верхний или нижний), определение принадлежности символа к системе счисления (восьмеричная, шестнадцатеричная), сравнение символов и т. п.
lib_ascii.h Описание прототипов функций lib_ascii.c.
lib_def.h Определение пользовательских макросов - значения для BOOLEAN, определения бит, баз систем счислений, минимальных и максимальных значений для чисел заданной разрядности и т. п.
lib_math.c Математическая библиотека - генерация псевдослучайных чисел.
lib_math.h Описание прототипов функций lib_math.c.
lib_mem.c Функции управления памятью - инициализация памяти, очистка, заполнение значением, копирование, сравнение, управление блоками кучи, пула.
lib_mem.h Описание прототипов функций lib_mem.c.
lib_str.c Функции управления строками - подсчет длины, копирование, слияние, сравнение, поиск, форматирование, парсинг.
lib_str.h Описание прототипов функций lib_str.c.
uC/LIB -> Ports -> ARM -> IAR. Модуль порта библиотечных функций на архитектуру ARM/IAR, написанный на ассемблере.
lib_mem_a.asm низкоуровневая функция копирования данных памяти на ассемблере, используемая в библиотеке uC/LIB.
uC/OS-II -> Port. Привязка RTOS µC/OS-II к микроконтроллеру ARM (порт).
os_cpu.h Определение идентификаторов и адресов векторов исключений, выбор метода обработки критических секций, макросы (вход и выход) критических секций, объявления прототипов функций.
os_cpu_a.asm Функции для различных методов обработки критических секций, написанных на ассемблере, запуска среды многозадачности, переключение контекста, обработка исключений, разрешение и запрет прерываний.
os_cpu_c.c Инициализация поддержки вычислений с плавающей запятой, хуки событий OS (инициализация, создание и удаление задачи, обработка ожидания, статистики, переключение задач, тик и т. п), инициализация стека задачи, векторов исключений и проч.
os_dbg.c Модули подсистемы отладки.
os_dcc.c Поддержка DCC.
uC/OS-II -> Source. Модули кода ядра RTOS µC/OS-II, поддержка флагов, майлбоксов, памяти, мьютексов, очередей, семафоров, задач, отсчет времени.
os_core.c Инициализация µC/OS-II, получение и назначение имен (семафоров, мьютексов, майлбоксов, очередей), поддержка ожидания на событиях, вход в обработчики прерываний и выход из них, запуск шедулера и многозадачности (управление задачами), управление статистикой, обработка тика системы, очистка и копирование секции памяти, код шедулера, код задачи ожидания (IDLE TASK), код задачи статистики, проверка стеков задач, управление TCB,
os_flag.c Обработка флагов µC/OS-II, событий флагов, поддержка ожидания на флаге, опрос флага.
os_mbox.c Поддержка обмена данными между задачами с помощью почтовых ящиков (mailbox, MBOX).
os_mem.c Управление областями памяти (memory partition). Это система работы с памятью наподобие кучи, находящаяся под управлением кода µC/OS-II.
os_mutex.c Поддержка мьютексов (создание, удаление, ожидание на мьютексе).
os_q.c Работа с очередями. Очереди используются для синхронизации между задачами.
os_sem.c Поддержка семафоров (создание, удаление, ожидание на семафоре).
os_task.c Поддержка задач - изменение приоритета задачи, создание, удаление, возобновление, приостановка задачи, проверка стека задачи и другие сервисные функции.
os_time.c Управление временем - задержка задачи на заданное количество тиков, возобновление задержанной задачи, получение и установка системного времени.
os_tmr.c Управление таймерами - создание, удаление, запуск, остановка, проверка таймера и другие сервисные функции.
ucos_ii.h Константы, типы, определения, опции, коды ошибок, макросы µC/OS-II.
uC/Probe -> Target -> Communication. Модули для поддержки обмена µC/Probe. uC/Probe -> Target -> Communication -> OS -> uCOS-II -> probe_com_os.c Модуль поддержки терминала µC/OS-II.
uC/Probe -> Target -> Communication -> RS-232 -> Port. Порт обмена для µC/OS-II.
probe_rs232c.c Поддержка порта через канал RS-232. Инициализация UART, обработчик прерывания UART, управление прерыванием UART, передача байта.
probe_rs232c.h Описание прототипов функций probe_rs232c.c.
uC/Probe -> Target -> Communication -> RS-232 -> Source. Надстройка над RS-232 для поддержки протокола обмена снизу.
probe_rs232.c Переменные состояния, буферы, подпрограммы обмена.
probe_rs232c.h Описание прототипов функций probe_rs232c.c.
uC/Probe -> Target -> Communication -> Source. Реализация протокола обмена uC/Probe.
probe_com.c код инициализации, чтения входных данных, запись выходных данных, вывод через терминал, обработка команд терминала и другие подпрограммы.
probe_com.h Описание прототипов функций probe_com.c.
uC/Probe -> Target -> Demo. Демонстрационный код использования µC/Probe.
uC/Probe -> Target -> Plugin -> uCOS-II. Плагин µC/Probe для MICRIUM uC/OS-II.
os_probe.c Код плагина µC/Probe - инициализация, установка функции обратного вызова (callback function), поддержка хуков и другие сервисные подпрограммы.
os_probe.h Описание прототипов функций os_probe.c.
[Создание задачи µC/OS-II]
INT8U OSTaskCreateExt (void (*task)(void *p_arg),
void *p_arg,
OS_STK *ptos,
INT8U prio,
INT16U id,
OS_STK *pbos,
INT32U stk_size,
void *pext,
INT16U opt)
Параметры:
task указатель на код задачи.
p_arg указатель на необязательную область данных, которая может использоваться для передачи параметров задаче, когда задача запускается на выполнение впервые. Подразумевается, что аргументы задаче передаются через указатель p_arg следующим образом:
void Task (void *p_arg)
{
for (;;)
{
//Код задачи
...
}
}
ptos указатель на вершину стека задачи. Если константа конфигурации OS_STK_GROWTH установлена в 1, то подразумевается рост стека вниз (от старших адресов памяти к младшим - именно так задано для ARM7). При этом ptos будет указывать на самый старший адрес допустимого месторасположения в памяти для стека. Если OS_STK_GROWTH установлен в 0, то ptos будет указывать на самый младший адрес памяти стека, и стек растет вверх, т. е. в сторону увеличения адресов. Указатель ptos должен указывать на реальное допустимое "свободное" место для данных.
prio приоритет задачи. Каждой задаче должен быть назначен уникальный приоритет. При этом чем меньше число приоритета, тем выше приоритет.
id идентификатор задачи, ID (0..65535)
pbos указатель на конец стека. Если константа конфигурации OS_STK_GROWTH установлена в 1, то подразумевается рост стека вниз (от старших адресов памяти к младшим - именно так задано для ARM7). При этом 'pbos' будет указывать на самый младший адрес допустимого месторасположения в памяти для стека. Если OS_STK_GROWTH установлен в 0, то pbos будет указывать на самый старший адрес памяти стека, и стек растет вверх, т. е. в сторону увеличения адресов. Указатель pbos должен указывать на реальное допустимое "свободное" место для данных.
stk_size размер стека в количествах элементов. Если OS_STK установлен в INT8U, то stk_size соответствует количеству доступных байт для стека. Если OS_STK установлен в INT16U то stk_size содержит количество доступных 16-битных значений. И наконец, если OS_STK установлен в INT32U (так сделано для ARM7), то stk_size содержит количество 32-битных величин, доступных для стека.
pext указатель на предоставляемую пользователем память, используемую как расширение TCB. Например, эта память пользователя может хранить содержимое регистров плавающей точки при переключении контекста, время полученной задачей для выполнения, количество получения управления задачей и т. д.
opt содержит дополнительную информацию (или опции), связанную с поведением задачи. Младшие 8 бит зарезервированы uC/OS-II, а старшие 8 бит могут использоваться приложением пользователя. См. OS_TASK_OPT_??? в файле uCOS-II.H. Текущие варианты выбора:
OS_TASK_OPT_STK_CHK для задачи разрешена проверка стека OS_TASK_OPT_STK_CLR очистка стека при создании задачи OS_TASK_OPT_SAVE_FP если CPU имеет регистры с плавающей точкой, то они будут сохранены при переключении контекста.
Возвращает:
OS_ERR_NONE функция выполнилась успешно. OS_PRIO_EXIT заданный приоритет уже где-то используется (каждая задача должна обязательно иметь уникальное значение приоритета). OS_ERR_PRIO_INVALID если указанное число приоритета выше, чем максимально допустимое (например, > OS_LOWEST_PRIO). OS_ERR_TASK_CREATE_ISR если Вы попытались создать задачу из ISR.
[Что делает код примера app.c]
Функция main. Код main совсем короткий, и состоит из инициализации CPU (CPU_Init) и ядра системы (OSInit). После этого создается задача App_TaskStart, которая в свою очередь запускает код остальных задач (App_TaskUserIF, App_TaskJoy). Такая иерархия сделана потому, что первая задача (App_TaskStart) должна также произвести дополнительные шаги инициализации:
- Инициализация функций поддержки платы (BSP_Init). - Инициализация векторов исключений (OS_CPU_InitExceptVect). - Инициализация модуля поддержки памяти (Mem_Init). - Инициализация модуля математики (Math_Init). - Инициализация последовательного порта (для отладки через DBGU, BSP_Ser_Init) - Создание событий приложения (App_EventCreate). - Создание задач приложения (App_TaskCreate). - вход в бесконечный цикл мигания всеми светодиодами на плате.
Только на предпоследнем шаге App_TaskCreate запускает две остальные задачи приложения:
App_TaskUserIF Вывод различной информации через последовательный порт в зависимости от полученного через mailbox сообщения (частота тиков, загрузка процессора, текущее количество тиков и переключений контекста, вывод названия операционной системы и типа процессора).
App_TaskJoy Отслеживание состояния джойстика и передача сообщений (через mailbox) в AppTaskUserIF.
В результате программа примера Micrium RTOS µC/OS-II для ARM7 выводит в консоль следующий экран:
"Initializing uC/Probe ..." - это сообщение выводит App_ProbeInit.
"Creating Application Events..." и "Creating Application Tasks..." - выводит задача App_TaskStart.
"#Ticks = NNNNN; #CtxSw = MMMMM" - это выводит счетчики тиков и переключений контекста задача App_TaskUserIF. Она получает команды через mailbox от задачи App_TaskJoy.
"CPU Usage = 3% at CPU Speed = 48 MHz" - это сообщение также выводит App_TaskUserIF по пришедшей команде APP_SCR_CPU.
"uC/OS-II V2.89 running at 1000 ticks/sec" - это сообщение также выводит App_TaskUserIF по пришедшей команде APP_SCR_VER_TICK_RATE.
"Micrium uC/OS-II on the Atmel AT91SAM7X256." - это сообщение также выводит App_TaskUserIF по пришедшей команде APP_SCR_SIGN_ON и на все неопознанные команды.
[Словарик]
BSP Board Support Package - набор макросов и подпрограмм, работающий с аппаратурой макетной платы.
DCC Debug Communications Channel.
MBOX, mailbox Средство обмена данными между задачами.
ISR Interrupt Service Routine, обработчик прерывания.
TCB Task Control Block, блок управления задачей.
µC/Probe Программа для Microsoft Windows, которая отображает содержимое системных переменных на различных задаваемых пользователем графических элементах, эмулирующих механические счетчики, графы, светодиодные индикаторы и т. д. Что-то похожее есть в LabView. Для обмена информацией с µC/Probe микроконтроллер в настоящее время может использовать JTAG, RS-232, UDP и USB. За подробностями обращайтесь к руководству [1] "µC/Probe User Manual" (Micrium \ Software \ uC-Probe \ Doc \ uC-Probe-User-Manual.pdf).
переключение контекста переход от выполнения одной задачи к выполнению другой.
[Ссылки]
1. Micrium_AT91SAM7X-EK_uCOS-II.zip - исходный код, документация. 2. FreeRTOS: практическое применение, часть 1. 3. Макетная плата AT91SAM7X. |
Комментарии
RSS лента комментариев этой записи