Микроконтроллерные устройства
Главная | Каталог статей | Регистрация | Вход
Суббота
18.05.2024
21:33
Приветствую Вас Гость | RSS
Главная » Статьи » TI TMS320F28xx » TMS320x28xx. Программирование и программное обеспечение

Карта памяти процессоров семейства TMS320F28xx. Командный файл компоновщика
КАРТА ПАМЯТИ ПРОЦЕССОРОВ СЕМЕЙСТВА TMS320F28xx и КОМАНДНЫЙ ФАЙЛ КОМПОНОВЩИКА

Карта памяти

     Пространство памяти процессоров F28xx разделено на две области – программ и данных [1]. Процессор обладает несколькими типами памяти, которые могут быть использованы как память программ, так и данных (назначается программистом). Они включают в себя Flash-память; однопортовое ОЗУ (SARAM); расширенное ОЗУ; однократно программируемое ПЗУ (OTP ROM) и загрузочное ПЗУ (Boot ROM), которое содержит программу-загрузчик и стандартные таблицы чисел, используемых в математических алгоритмах. ЦПУ F28xx может обращаться и к памяти на кристалле, и к внешней памяти. В процессорах F28xx используется 32-разрядная адресация для данных и 22-разрядная адресация для программ, что теоретически позволяет достигать объема в 4 ГСлов (1 слово = 16 бит) данных и 4 МСлов команд. Блоки памяти всех вариантов F28x доступны для использования как под данные, так и под команды программ. Карта памяти процессоров F28xx приведена на рис. 1. Семейство процессоров F28xx содержит модуль защиты памяти, позволяющий защитить паролем блоки L0, L1 SARAM, Flash, OTP ROM. Каждый пароль состоит из 128 бит и храниться во Flash-памяти (рис. 1). Вся защищаемая область разделена на 16 блоков, каждый из которых защищен своим паролем.
 
 
Рис. 1 - Карта памяти TMS320F28xx
 

Концепция COFF и назначение компоновщика

     Для стандартизации процесса разработки программного обеспечения для своих процессоров Texas Instruments использует «Общий Формат Объектных Файлов» (Common Object File Format (COFF)). COFF наиболее эффективен в задачах, когда разработка программного обеспечения разделена между несколькими программистами.
     Каждый файл, содержащий программный код, может быть написан независимо и называется модулем, включая спецификацию всех ресурсов, необходимых для правильного выполнения модуля. Модули могут быть написаны в CCS или текстовом редакторе, который может сохранять файлы в ASCII-формате. Предполагаемые расширения исходных файлов на языке ассемблера – .asm, и .c для языка C/C++.
     Концепция COFF обеспечивает модульную разработку программного обеспечения, независимую от аппаратной базы. Отдельный исходный файл, предназначенный для выполнения определенной задачи, может быть скомпонован с несколькими другими файлами для реализации более сложного алгоритма. Такой подход позволяет разрабатывать код несколькими программистами параллельно, что сокращает срок разработки приложений: ускоряется процесс отладки и обновления кода, появляется возможность использования в разрабатываемых приложениях модулей из предыдущих проектов.
     Множество модулей объединяются в завершенную программу с помощью компоновщика (Linker). Компоновщик эффективно распределяет ресурсы, доступные в устройстве для каждого модуля проекта. Для определения ресурсов памяти и правил расположения в них различных секций, входящих в состав модуля, компоновщик использует командным файлом .cmd. Результатом процесса компоновки становится скомпонованный объектный файл .out, который может быть выполнен на DSP. Также может быть получен .map-файл, который содержит информацию о том, куда были размещены все секции проекта.
     При использовании COFF код разрабатывается аппаратно-независимым, что позволяет разработчику модуля не думать о распределении памяти, так как эта работа будет сделана на этапе компоновки проекта. При изменении любого из модулей производится новая сборка проекта и задача распределения памяти решается заново, исключая вероятность появления конфликтов.

Командный файл компоновщика (.cmd)

     Понятие секций программного кода

     Если проанализировать код программы, написанной на языке C/C++, можно отметить, что она состоит из различных частей: непосредственно исполняемого кода и данных различных типов (глобальные и локальные переменные, константы и пр.). В терминологии TI эти части называются секциями (Sections). Каждая секция имеет свое название и служит для размещения определенной части кода (функций или данных различных типов); в свою очередь, сами секции размещаются в различных областях памяти. Существует стандартный набор секций, который должен быть определен всегда. Однако можно назначить дополнительные секции и разместить в них код функций и данные разработанного алгоритма. В табл. 1 приводится описание некоторых стандартных секций.
                                                                                                                                       Таблица 1
      Основные типы секций
 
 
     Разделение кода программ и данных обеспечивает гибкость при распределении ресурсов памяти, а также отвечает Гарвардской архитектуре процессоров. Разработчик может разместить, например, часть кода в масочной памяти, часть кода во Flash, а данные во внешнем или внутреннем ОЗУ. Ниже приводится пример простейшей программы на языке C и рассмотрено расположение ее отдельных элементов по секциям.
// Пример 1
int a = 10; int b = 8;
void main() { long y; y = a + b; }
// Конец Примера 1
     Каждый элемент кода будет автоматически размещен компилятором в соответствующей ему области памяти:
-int a; int b; - объявление глобальных переменных, выделение памяти в неинициализирующейся секции .ebss;
 
Примечание 1: Неинициализирующиеся секции содержат данные, которые могут изменяться в процессе выполнения программного кода. Эти данные, в отличие от программного кода и констант, должны находиться в ОЗУ. Эти области памяти могут модифицироваться и обновляться, как это происходит при вычислении математических формул. Каждая переменная объявляется директивой, чтобы зарезервировать память, содержащую ее значение. В соответствии с их определением, им не присваивается какое-либо значение, а изменить их может только работающая программа.

- значения 10, 8 – будут размещены в инициализирующейся секции .cinit;

Примечание 2: Инициализированными секциями называются те области памяти данных, которые должны быть определены непосредственно после сброса процессора (Reset) или включения питания. Константы содержат начальные значения переменных или значения по умолчанию. Константы подобно программному коду определяют в энергонезависимой памяти.

- long y; - объявление локальной переменной с выделением памяти в секции .stack;

- y = a + b; - исполняемый код программы, размещается в секции .text.

Примечание 3: Программный код состоит из последовательности инструкций для обработки данных, инициализации системных настроек и т. д. Программный код должен быть определен непосредственно после сброса (Reset) или включения питания. Поэтому его, как правило, размещают в энергонезависимую память такую как Flash или EEPROM.

     Таким образом, программа будет разделена на следующие части, каждая из которых будет размещена в своей секции памяти:
  • глобальные переменные;
  • начальные значения глобальных переменных;
  • локальные переменные;
  • исполняемый код программы.
     Необходимость разделения программы на секции обусловлена еще и тем, что процессоры TI содержат различные типы памяти: энергонезависимая (Flash), однократно программируемое ПЗУ, масочное ПЗУ, энергозависимая (ОЗУ), которая также различается (младшие 64 K имеют большую гибкость в адресации, стек располагается только в них; существуют процессоры, часть оперативной памяти является двухпортовой). Программист может вручную расположить отдельные части кода в памяти, исходя из соображений производительности или принципов функционирования алгоритмов.

     Процесс компоновки

     Компоновщик «собирает» секции из всех файлов и распределяет между ними память. При этом процесс компоновки осуществляется в три этапа:
  1. определение различных областей памяти;
  2. описание распределения секций по областям памяти;
  3. запуск компоновщика в процессе «сборки» (Build или Rebuild). 
     Как уже отмечалось, объявление и расположение секций в памяти осуществляется с помощью команд управляющего .cmd-файла. Длина секций и расположение их в памяти определяются посредством команд SECTIONS и MEMORY.

     Описание карты памяти

     Область MEMORY .cmd-файла описывает конфигурацию памяти создаваемой системы. Команда MEMORY имеет следующий синтаксис:
MEMORY
 {
<Имя>: origin = 0x, length = 0x
}
     Например, имеется 64K Flash-памяти, начинающейся с адреса 3E8000h (см. рис. 1), ее объявление будет следующим:
MEMORY
{
 FLASH: origin = 0x3E8000h, length = 0x10000
 }
      Если есть необходимость добавить другие области памяти, используется та же команда. Например, для использования блоков памяти M0SARAM и M1SARAM (см. рис. 1), необходимо объявить их как:
MEMORY
{
M0SARAM: origin = 0x000000, length = 0x0400 M1SARAM: origin = 0x000400, length = 0x0400
}
     Процессоры TI (в частности, семейство F28xx) имеют Гарвардскую архитектуру, т.е. в них разделены память программ и память данных. В .cmd-файле необходимо указывать, к какому типу памяти относится данная область. Для этого предусмотрена команда PAGE 0, определяющая память программ, и PAGE 1, определяющая память данных. С учетом этого множественное объявление областей памяти для приведенных выше примеров выглядит следующим образом:
// Пример 2
MEMORY
{
PAGE 0: /* Память программ */
FLASH: origin = 0x3E8000h, length = 0x10000
PAGE 1: /* Память данных */
M0SARAM: origin = 0x000000, length = 0x0400 M1SARAM: origin = 0x000400, length = 0x0400
}
// Конец Примера 2
 

      Размещение секций

     Для объявления соответствия секций областям памяти используется команда SECTIONS.. Следующий код представляет собой пример .cmd-файла, в котором реализуется связь секций кода примера 1 с памятью, определенной в примере 2:
// Пример 3 – Простой .cmd-файл
MEMORY
{
PAGE 0: /* Память программ */
FLASH: origin = 0x3E8000h, length = 0x10000
PAGE 1: /* Память данных */
M0SARAM: origin = 0x000000, length = 0x0400 M1SARAM: origin = 0x000400, length = 0x0400
}
SECTIONS
{
.text:> FLASH PAGE 0
.ebss:> M0SARAM PAGE 1
.cinit:> FLASH PAGE 0
.stack:> M1SARAM PAGE 1
}
// Конец Примера 3
     Таким образом, пользуясь приведенным материалом и образцами из библиотеки готовых примеров, .cmd-файл можно создать самостоятельно или подключить готовый типовой .cmd-файл из библиотеки. При создании .cmd-файла в главном меню CCS выбирается раздел File, затем пункт New и подпункт Source File. В появившейся области редактора пишется код. Набранный файл необходимо сохранить, указав тип «.cmd» и имя, например, «standard». Затем файл необходимо подключить к проекту, так как автоматически этого не происходит. Дальнейшая настройка проекта заключается в подключении внешних библиотек, необходимых для работы с функциями языка С. Подключение происходит так же, как и в предыдущих случаях. Необходимо только правильно указать тип файла и путь к нему.
 
ЛИТЕРАТУРА
  1. Чернов В. Создание приложений на базе процессоров Texas Instruments TMS320F28xx // Компоненты и технологии. – 2006. – № 8.
Категория: TMS320x28xx. Программирование и программное обеспечение | Добавил: Dante (05.12.2011) | Автор: Ванцев Д.В. E
Просмотров: 4701 | Рейтинг: 1.0/1
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа
Категории раздела
TMS320x28xx. Программирование и программное обеспечение [2]
Поиск
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Copyright MyCorp © 2024
Создать бесплатный сайт с uCoz