Руководство по программированию AM335x Печать
Добавил(а) microsin   

Назначение этого руководства (перевод [1]) - провести разработчиков через различные шаги разработки для семейства устройств AM335x ARM Cortex-A8 (AM335x относится к так называемому семейству Sitara). Каждая стадия разработки содержит ссылки на наборы полезной документации, апноуты и рекомендации по разработке. С помощью этого руководства разработчики ПО могут быстро найти нужный ресурс (или наборы ресурсов), которые нужны на каждой стадии процесса разработки (Software Design Timeline).

Стадии разработки Software Design Timeline:

Определение иерархии ПО ->
Загрузка, покупка или установка подходящего IDE/тулчейна ->
Загрузка, покупка или установка дополнительных пакетов зависимостей ->
Приобретение плат разработчика и инструментария эмуляции/отладки ->
Разработка кода ->
Отладка ->
Интеграция продукта ->
Тестирование на системном уровне.

[Определение иерархии ПО]

General Purpose Operating System (OS). Операционные системы общего назначения (General Purpose Operating Systems, GPOS) обычно используются для запуска на процессорах общего назначения (General Purpose Processors, GPP), таких как ядра ARM. Эти процессоры и соответствующие операционные системы хорошо подходят для выполнения многих задач. Популярные GPOS включают Android, Linux и WinCE, хотя в них включено намного больше специфических особенностей для определенных индустриальных целей.

Ядро Linux поддерживается на ядрах 66AK2H ARM. Готовые собранные образы ядра можно найти в пакете mcsdk_linux релиза Keystone-II MCSDK [3].

Real Time Operating System (RTOS). Операционные системы реального времени (ОСРВ, RTOS) часто используются с процессорами определенной специализации. TI SYS/BIOS поддерживается ядрами 66AK2H DSP. Пакет Keystone-II MCSDK [3] доступен для загрузки для ядер DSP платформы 66AK2H.

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

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

[Иерархия ПО для AM335x]

TI предоставляет следующие пакеты разработки, специфичные для AM335x.

Поддержка HLOS для AM335x:

• Linux Software Development Kit для Sitara EVM [4].
• AM389x Android Gingerbread Development Kit for Sitara EVMs [5].

Можно найти больше ссылок по теме Linux EZSDK в Category:EZSDK и темах, касающихся просто Линукс в Category:Linux и Category:Sitara Linux.

Примеры для AM335x без использования OS:

• StarterWare [6].

[Загрузка, покупка или установка подходящего IDE/тулчейна]

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

Тулчейн обычно состоит из компилятора C, ассемблера и линкера. Тучейн привязан к архитектуре CPU, так что его следует выбирать на основе выбранной платформы/процессора. Также могут быть дополнительные требования к операционной системе хоста PC.

Устройства Sitara, C6-Integra и DaVinci предполагают использование богатого набора инструментария из-за того, что в них интегрированы как ядро ARM CPU, так и ядро DSP, при этом каждое из ядер имеет свой набор исполняемых инструкций (instruction set architecture, ISA).

IDE, поддерживаемые TI

• Code Composer Studio (CCS) Integrated Development Environment (IDE) [7]

   - Включает оптимизирующие компиляторы TMS320, C6000, ассемблер C6000 и линкер C6000.
   - Включает оптимизирующий компилятор TMS470 ARM, ассемблер ARM и линкер ARM.
   - Включает симуляторы с точным учетом циклов для ядер ARM и C674x DSP.
   - Встроена поддержка DSP/BIOS Real Time Operating System.
   - Встроена поддержка отладчиков/эмуляторов серии XDS.

Тучейны, поставляемые TI отдельно от CCS

• C674x DSP CPU Tool Chain

   - TMS320 Optimizing C6000 C/C++ Compiler
   - TMS320 Optimizing C6000 Assembler
   - TMS320 Optimizing C6000 Linker

• ARM9, Cortex-A8 CPU Tool Chain

   - TMS470 Optimizing ARM C/C++ Compiler
   - TMS470 Optimizing Assembler
   - TMS470 Optimizing Linker

Сторонний инструментарий (не поддерживается TI):

• GNU ARM Cross Compiler
• Code Sourcery Lite ARM Cross Compiler
• Keil ARM Compiler

[Загрузка, покупка или установка дополнительных пакетов / зависимостей]

TI предоставляет богатый набор дополнительных интерфейсов программирования (Application Programming Interfaces, API) и инструментов, которые поддерживают абстрактное программирование каждого регистра как на уровне отдельных бит, так и на уровне программирования периферийных устройств процессора. Это различные пакеты ПО, доступные для загрузки, которые помогут перейти к разработке программного обеспечения на основе Ваших предпочтений.

Список предоставляемых API для AM335x см. по ссылке [9].

[Аппаратная платформа, эмуляторы/отладчики]

Инструменты IDE обычно предоставляют опции непосредственной разработке на аппаратной платформе или косвенно в программном симуляторе, если железо пока недоступно. Когда разработка идет напрямую на аппаратуре (процессор + печатная плата системы), IDE должна неким способом подключаться и обмениваться данными с этим железом. Этот обмен часто предоставляется следующими способами:

• Эмуляторы JTAG: часто это единственный способ отладки кода загрузки (boot code) до того, как станет доступным код уровня ядра (kernel level code).

• USB, UART, Ethernet: эти опции часто доступны для отладки GPP-процессоров, таких как ARM, и это обычно менее дорогой метод отладки. Он применяется многими разработчиками для разработки кода пространства приложения, однако также используется для разработки и отладки кода пространства ядра.

Ниже показаны некоторые примеры JTAG-эмуляторов, совместимых с устройствами TI.

XDS100 эмуляторы от TI. Дополнительные ресурсы см. на XDS100 Wiki [13].

Дополнительные ресурсы см. на XDS510 Wiki [13].

XDS560 эмуляторы от TI. Дополнительные ресурсы см. на XDS560 Wiki [13].

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

Spectrum Digital Support site:support.spectrumdigital.com.
Blackhawk Emulator Comparisons site:blackhawk-dsp.com.

Дополнительную информацию по эмуляторам/анализаторам ищите на сайте TI, также см. на страничке [13] ссылки на статьи wiki.

Для разработки на AM335x рекомендуется использовать AM335x Evaluation Module [10].

AM335x Evaluation Module TMDXEVM3358

Также очень хороши недорогие платы наподобие плат от BeagleBoard [14]. Они доступны в интернет-магазинах AliExpress и Ebay.

[Разработка кода]

Поскольку разработка кода специфична для определенного приложения, и для платформ Sitara, C6-Integra и DaVinci существует множество инструментария для разработки, в этой секции просто дана ссылка на ресурс, где можно найти дополнительную информацию и примеры кода. Кроме того, есть множество примеров в составе SDK на определенный процессор.

См. также Sitara ARM MPU Software & Tools Overview site:ti.com.

[Отладка]

Эта секция дает общее понятие о шагах, которые Вы можете выполнить со своим кодом, чтобы определить основную причину своей проблемы. Это особенно полезно, если используется пакет зависимостей (такой как драйверы), который не был разработан Вами. Секция организована как креш-курс с обзором базовой философии отладки приложений на основе устройств TI.

Часто разработка ПО разбита на различные программные компоненты. Это код, созданный для каждого индивидуального программного компонента (CPU ISR, передачи DMA, драйверы периферии вода/вывода от сторонних разработчиков) различными командами разработчиков, и затем этот код интегрируется в конечное приложение.

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

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

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

Базовые проверки. Это может выглядеть глупым, однако может быть очень полезен откат назад с возвратом кода до того момента, когда ошибка еще не проявлялась.

Тактирование. Проверьте, правильно ли сконфигурировано дерево тактирования. Устройства Sitara, C6-Integra и DaVinci снабжены далеко не такой заурядной структурой синхронизации, которая присутствует у простых 8-битных микроконтроллеров. Аппаратные тактовые домены внутри этих устройств не работают от одной тактовой частоты, это скорее дерево связанных тактовых доменов, частоты которых вырабатываются от тактовых входов системы. Дополнительно некоторые периферийные устройства (USB, EMAC, McASP, RTC) часто тактируются как от основной частоты системы, так и от второго источника, синхронизируемого внешним кварцевым резонатором.

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

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

Домены питания. Проверьте активные домены питания (Power Domains) устройств Sitara, C6-Integra и DaVinci. Они состоят из нескольких ядер и нескольких аппаратных блоков (CPU, DMA, периферийные устройства), тактовые частоты которых включаются/выключаются по отдельности. Важно отметить, что эти блоки можно индивидуально отключить, чтобы экономить на потребляемой энергии и снизить нагрев корпуса чипа. Код ROM этих устройств обычно разрешает несколько блоков, которые необходимы для загрузки устройства. Разработчику приложения следует также включить те периферийные устройства, которые нужны для работы его приложения. Информация по управлению питанием процессоров Sitara, C6-Integra и DaVinci находится в даташите на соответствующий процессор.

Тестирование того же самого кода на второй аппаратной платформе (если она имеется) - быстрый способ проверки, что Ваша программа не зависит от аппаратных особенностей платы.

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

Удаление сегментов кода проще всего делать с помощью #ifdef / #endif вокруг существующего кода. Основная идея состоит в том, что удаление кода для поиска проблемы намного проще, чем заново переписать имеющийся код.

Постарайтесь (хотя бы временно) исключить нежелательные операции ввода/вывода, остановить нежелательные передачи DMA, и/или замаскировать нежелательные ISR в CPU.

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

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

Пример 1: если у Вас CPU с несколькими прерываниями, то Вы можете можно замаскировать (запретить) все прерывания кроме одного - чтобы определить, выполняется ли этот ISR так, как ожидалось. Этот процесс можно повторить со всеми ISR до тех пор, пока не найдете тот, который работает как-то не так.

Пример 2: если в программе присутствует DMA, который не выполняет необходимые передачи, то Вы можете разбить всю передачу на отдельные части. Шаги проверок:

Шаг 1: событие, которое запускает передачу DMA с помощью подсистемы DMA.
Шаг 2: правильно ли сконфигурирваны адреса источника / назначения передачи DMA?
Шаг 3: доступны ли области источника / назначения RAM для контроллера DMA? Некоторые регистры, отображаемые на память (Memory Mapped Registers, MMR) могут быть адресованы только определенными мастерами устройства. Важно проверить и убедиться, что записываемые MMR доступны для контроллера DMA.

Пример 3: если у Вас есть периферийное устройство I/O, которое не передает и/или не принимает соответствующим образом, то следует проверить:

Шаг 1: правильно ли настроено тактирование периферийного устройства?
Шаг 2: правильно ли буферы обрабатываются во времени. У некоторых периферийных устройств (таких как McASP) ограничено окно времени, в котором необходимо реализовать обработку буферов, чтобы не произошла недогрузка передачи (transmit underrun) или переполнение приема (receive overrun). В таких ситуациях машина состояния периферии сгенерирует ошибку. Тогда Вы можете использовать эту информацию для трассировки и определения причины, почему буферы не обрабатываются своевременно ядром CPU или периферией DMA.

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

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

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

Осциллограммы позволяют одновременно отлаживать код в поиске проблемы, причем:

• Есть гарантия собственной защиты кода (нет риска, что кто-то другой увидит Ваш исходный код).
• Отображается временная зависимость между событием и ошибкой (или зависимость от цепочки событий).
• Хорошо видно, как определенные события ошибки устраняются (изменяются) или наоборот, усиливаются после корректировки кода.

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

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

При предоставлении описания проблемы следует дать как минимум следующую информацию:

• Аппаратная платформа

   - Silicon Part Number (полное наименование чипа, включая версию кристалла, корпус и дополнительную маркировку).
   - Работаете ли Вы с платой разработчика от TI, или это какая-то плата собственной разработки?

• Версия ПО

   - Полные имена и версии всех программных библиотек, которые используются для создания программного приложения.
   - Полные имена IDE, тулчейнов, утилит и оборудования отладки (эмулятор JTAG).

• Скриншоты осциллограмм, отражающих ситуацию до, во время и после наблюдения события ошибки.

• Дополнительные наблюдения, которые могут помочь в понимании сути проблемы.

[Интеграция продукта]

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

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

Понимание процесса загрузки AM335x. Краткий обзор последовательности действий ROM Boot Loader для AM335x можно найти в описании на конкретный процессор. За дополнительной информацией также обратитесь к главе "ROM Code Memory and Peripheral Booting" документа AM335x Technical Reference Manual.

Генерация загружаемого образа (Boot Image). Документ "AM335x PSP User's Guide" [11] дает хороший обзор шагов, необходимых для пересборки ПО.

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

Утилиты записи flash (flash-writers) являются частью пакета PSP. Инструкции, как использовать flash-writers в среде CCSv4/v5 можно найти в документе [12].

Достоинства:

• Быстрота процесса прошивки
• Не требуется связь с CCS или использование JTAG Emulator.

Ограничения:

• Serial Flash Utility поддерживает только прошивку EVM (Evaluation Module) без модификаций кода для для определенных плат пользователя.
• Рабочее окружение сборки (build environment) должно быть загружено на пользовательский PC.

Различные проекты CCS были разработаны в расчете на использование энергонезависимой памяти (flash non-volatile memory), которая записывается через JTAG-адаптер с использованием Code Composer Studio (CCS). Эти проекты можно найти в Software Development Kit (SDK) для NAND, NOR или SPI Flash.

Достоинства:

• Проще модифицировать исходный код.
• Не нужно устанавливать в рабочее окружение дополнительные инструменты.

Недостатки:

• Медленный процесс прошивки.
• Требуется адаптер JTAG.

При отладке часто полезно выполнить загрузку через последовательный порт вместо перепрошивки образа каждый раз, когда он модифицируется. UART Boot Host дает эту возможность с помощью утилиты flash-writers, которая входит как часть в пакет PSP.

[PRU-ICSS]

Программируемая подсистема реального времени и промышленной коммуникации (Programmable Real-Time Unit Subsystem and Industrial Communication SubSystem, PRU-ICSS) состоит из двух 32-битных ядер RISC (Programmable Real-Time Units, или PRU), памяти данных и инструкций, модулей внутренних периферийных устройств и контроллера прерываний (INTC). Программируемая природа PRU-ICSS вместе с её доступом к выводам чипа, событиям и всем ресурсам SoC, дает гибкость в реализации быстрых откликов в реальном времени, специализированных операций по обработке данных, пользовательских периферийных интерфейсов и разгрузки задач из других процессорных ядер системы на кристалле (system-on-chip, SoC).

PRU ICSS block diag

Аппаратура PRU-ICSS может использоваться для двух категорий приложений:

• Приложения общего назначения (использующие подсистему PRU).
• Индустриальные приложения (использующие ICSS) - поддерживается платами AM335x ICE board, AM437x IDK board, AM571x IDK board, AM572x IDK board и Industrial Software Kit.

Wiki-страничка [2] работает как хаб подсистемы PRU и содержит сопутствующие и связанные ссылки на ресурсы, включая руководства по программному обеспечению, апноуты, модули для тренировки и FAQ.

[Ссылки]

1. AM335x Software Design Guide site:processors.wiki.ti.com.
2. PRU-ICSS site:processors.wiki.ti.
3. MCSDK 3_01_04_07 site:software-dl.ti.com.
4. Linux EZ Software Development Kit (EZSDK) for Sitara™ Processors site:ti.com.
5. Android Development Kit for Sitara Microprocessors site:ti.com.
6. StarterWare for ARM® based TI Sitara Processors site:ti.com.
7. Code Composer Studio (CCS) Integrated Development Environment (IDE) site:ti.com.
8. Code Composer Studio Downloads site:ti.com.
9. AM335x Software and Development Tools site:ti.com.
10. AM335x Evaluation Module site:ti.com.
11. AM335x PSP User's Guide site:processors.wiki.ti.com.
12. CCS-утилиты программирования FLASH AM335x.
13. XDS Target Connection Guide site:dev.ti.com.
14. Сравнение самых популярных плат BeagleBoard.