24300

Создаем проект в среде CM-LYNX

Дата последнего изменения: 25.11.2020 09:44:17

Интегрированная среда разработки CodeMaster-Lynx (CM-LYNX) предназначена для отладки и работы с процессорами серии 1967ВНхх. CM-LYNX базируется на функциональности, предоставляемой Eclipse CDT, с собственным программным комплексом для компиляции и генерации исполняемого машинного кода (tool chain). CM-LYNX также имеет набор программных библиотек для процессоров 1967ВНхх - HAL, DSPlib, Clib. На данный момент среда находится в стадии постоянной доработки. Информацию о доступной актуальной версии можно получить на официальном сайте компании.

Эта статья посвящена тому, как начать работать с процессорами ЦОС Миландр в среде CM-LYNX. В статье показано создание проекта, его настройка, а также запуск программы "HelloWorld", мигающей светодиодами.

Установка среды CM-LYNX

Среда CM-LYNX поставляется на диске в составе комплекса разработки и отладки для процессоров серии 1967ВНхх. В состав этого комплекса также входят программатор JEM LYNX и электронный ключ SafeNet, поэтому помимо установки самой среды, необходимо выполнить установку драйверов, находящихся на диске.  

По умолчанию установщик среды устанавливает IDE в папку C:\Milandr\CM-LYNX.2.xx.xx в зависимости от номера версии.

Создание и настройка проекта на примере 1967ВН028

В проекте будет использован отладочный комплект для процессора цифровой обработки сигналов 1967ВН028. Для процессора 1967ВН044(034) создание и настройка проекта будут такими же. Отдельно пример HelloWorld для 1967ВН044(034) приведён в статье подключаем библиотеки HAL в среде CM-LYNX.

Первым делом необходимо вставить ключ в USB-порт и подключить программатор!

Разъём программатора подключается к отладочной плате красным проводом строго к «1», как показано на рисунке 1.

Рисунок 1 - Правильное подключение программатора к отладочной плате

При запуске среды предлагается выбрать путь для рабочего пространства. По умолчанию конечная папка пути так и называется "workspace", но для удобства добавим в неё еще одну папку с названием "leds". Окно будет выглядеть также, как на рисунке 2.

Рисунок 2 - Создание рабочего пространства в среде CM-LYNX

Нажимаем OK и попадаем в среду CM-LYNX. Для создания проекта необходимо перейти по пути: вкладка File→New→C Project. Наглядно на рисунке 3.

Рисунок 3 - Кнопка создания проекта на языке С/C++

Далее необходимо присвоить проекту имя. Галочку "Use default location" оставляем активной, таким образом, проект сохранится в ранее созданном "workspace".

Выставим параметр в левом окне Project type - DSP1967 DXE executable, а в правом окне Milandr DSP1967 LLVM Cross C/C++. Нажимаем кнопку Next. Настройка всех этих параметров приведена на рисунке 4.

Рисунок 4 - Настройки среды в окне C Project при создании проекта

В окне Select Configurations оставляем выбранными поля Debug и Release. По умолчанию проект настроен для работы с процессором 1967ВН044. Чтобы изменить проект для работы с другим процессором необходимо выбрать пункт "Advanced settings…". В открывшемся окне, в пункте "Processor", выбираем процессор 1967ВН028.

Рисунок 5 - Настройки среды в окне Select Configurations

Далее в окне создания проекта нужно нажать кнопку "Finish".

Теперь проект доступен в поле Project Explorer. Следующим шагом необходимо добавить Source-файл, где будет написан основной код. Это можно сделать, нажав правой кнопкой мыши на проект, New→ Source File. Процесс создания изображен на рисунке 6.

Рисунок 6 - Путь в среде для создания исходного файла

В поле Source file нужно указать имя. Для удобства назовём файл main.c (*необходимо обязательно указать расширение файла). В поле Source folder указана папка исходного проекта, а в пункте Template необходимо оставить опцию Default C source template по умолчанию. Настройки этого окна представлены на рисунке 7.

Рисунок 7 - Настройки окна создания исходного файла

Таким образом, создан пустой проект, а также проведено первичное ознакомление с интегрированной средой разработки CM-LYNX для процессоров цифровой обработки сигналов Миландр. Теперь можно перейти к программе "Hello World".

Программа "Hello World"

Фрагмент кода 1 - Полный код программы Hello World
//Содержимое файла main.c

#include <sysreg.h>

// Прототип функции задержки, реализованной ниже
void Delay(int waitTicks);

int main(void)
{
   // Основной цикл
   while(1)
   {
      __builtin_sysreg_write(__FLAGREGST, 0x01); // зажигаем светодиод FLAG0
      Delay (5000000);
      __builtin_sysreg_write(__FLAGREGCL, 0x00); // гасим светодиод FLAG0

      __builtin_sysreg_write(__FLAGREGST, 0x02); // зажигаем светодиод FLAG1
      Delay (5000000);
      __builtin_sysreg_write(__FLAGREGCL, 0x00);

      __builtin_sysreg_write(__FLAGREGST, 0x04); // зажигаем светодиод FLAG2
      Delay (5000000);
      __builtin_sysreg_write(__FLAGREGCL, 0x00);

      __builtin_sysreg_write(__FLAGREGST, 0x08); // зажигаем светодиод FLAG3
      Delay (5000000);
      __builtin_sysreg_write(__FLAGREGCL, 0x00);
   }
}
//Функция задержки
void Delay(int waitTicks)
{
   int i;
   for (i = 0; i < waitTicks; i++);
}

Разбор кода программы

Фрагмент кода 2 - Подключение заголовочного файла sysreg.h
#include <sysreg.h>

В начале необходимо подключить заголовочный файл sysreg.h, в котором определены все системные регистры процессоров 1967ВНхх. Этот файл идёт в составе стандартной библиотеки для 1967ВНхх, и поэтому путь к нему уже прописан в настройках проекта.

Фрагмент кода 3 - Код функции задержки Delay()

// Прототип функции задержки, реализованной ниже
void Delay(int waitTicks);

// Функция задержки
void Delay(int waitTicks)
{
   int i;
   for (i = 0; i < waitTicks; i++);
}
 

Delay() - простейшая реализация функции задержки на цикле. Значение задержки в этом случае необходимо подбирать экспериментально.

Чтобы мигнуть светодиодом FLAG0 в основном цикле используется код, представленный на 4 фрагменте кода:

Фрагмент кода 4 - Код переключения состояния на выводе FLAG0

__builtin_sysreg_write(__FLAGREGST, 0x01); // зажигаем светодиод FLAG0 
Delay (5000000); 
__builtin_sysreg_write(__FLAGREGCL, 0x00); // гасим светодиод FLAG0 

В CM-LYNX доступ к системным регистрам осуществляется с помощью специальных функций:

Фрагмент кода 5 - Функции для доступа к системным регистрам

__builtin_sysreg_read(int reg); // чтение значений из регистра reg __builtin_sysreg_write(int reg, unsigned int value); // запись значения value в регистр reg 

В этом коде значение int reg берётся из библиотеки sysreg.h. Unsigned int value, как следует из названия, - беззнаковое целое число, записываемое в выбранный регистр.

Регистр FLAGREG – 32-битный регистр, который контролирует направление выводов FLAG0-FLAG3 (вход - логический "0", выход - логическая "1") и обеспечивает логический уровень, когда выводы сконфигурированы как выход. Направление выводов FLAG0-FLAG3 задаётся в первых 4 битах регистра [3:0], за значение флагов при выдаче отвечают биты [7:4]. Таким образом, чтобы настроить FLAG0 на выход, при этом чтобы он выдавал логическую "1", в регистр FLAGREG необходимо прописать значение 0x11 (8'b0001_0001). Однако, непосредственно в регистр FLAGREG записывать значения нельзя! Для этого существуют два отдельных регистра FLAGREGST и FLAGREGCL. FLAGREGST позволяет записывать логическую "1" (установка бит) в регистр FLAGREG. FLAGREGCL позволяет записывать логический "0" (сброс бит) в регистр FLAGREG.

Обратите внимание, чтобы зажечь светодиод, необходимо установить вывод FLAG0 на выход (FLAGREG[3:0] = 4'b0001) и при этом вывести на вывод значение логического "0" (FLAGREG[7:4] = 4'b0000)!

Фрагмент кода 6 - Код зажигания светодиода на выводе FLAG0

__builtin_sysreg_write(__FLAGREGST, 0x01); // зажигаем светодиод FLAG0

Подав логический "0" на вывод FLAG0, светодиод действительно загорит, но как это происходит? Всё дело в схемотехнике отладочной платы и вывода порта GPIO. На отладочной плате соединение светодиода, процессора и кнопки выглядит следующим образом, как показано на рисунке 8.

Рисунок 8 - Схемотехника отладочной платы. Включение светодиода при нажатии на кнопку

Светодиод подключен к питанию 2.5 В. Чтобы его зажечь, необходимо замкнуть цепь, нажав на кнопку и соединив светодиод с землёй. То же самое происходит, когда FLAG0 настраивается на выход, и подаётся логический "0", то есть соединяется выход вывода с землёй. Схематично такое подключение представлено на рисунке 9.

Рисунок 9 - Схемотехника отладочной платы. Включение светодиода по FLAG0 внутри процессора

Чтобы погасить светодиод, нужно переключить вывод FLAG0 на вход.

 Фрагмент кода 7 - Код выключения светодиода на выводе FLAG0

__builtin_sysreg_write(__FLAGREGCL, 0x00); // гасим светодиод FLAG0

Режим Debug

Перед первым запуском проекта на отладочной плате для 1967ВН028 следует настроить тактирование процессора! Подробнее о настройке тактирования приведено в статье "Настройка тактовой частоты процессора 1967ВН028 на отладочной плате".

Чтобы посмотреть, как исполняется приведенная выше программа, нужно запустить проект в режиме отладки (debug). Но для начала необходимо выполнить компиляцию проекта. Перед рассмотрением режима отладки нужно убедиться, что выбран именно этот режим. Это можно сделать, перейдя во вкладку Project→Build Configurations→Set Active→Debug. Также это можно проверить, нажав на стрелку у значка часов (выделен красным на рисунке 10) или, нажав на сам значок, и проверить, что режим Debug активен (выбран Active). Значок молотка (выделен зеленым на всё том же рисунке) выполняет компиляцию. Нажав на стрелку рядом, можно выбрать, что будет выполняться именно компиляция. Значок документа (выделен синим) скомпилирует все конфигурации (Сtrl+B). Рисунок 10 представлен ниже.

Рисунок 10 - Вкладка для проверки активности режима Debug

Перед тем, как собирать проект, необходимо его сохранить File→Save All, (или воспользоваться сочетанием Ctrl+Shift+S) иначе компилятор будет думать, что проект пустой.

Итак, нажав на значок "молотка", проект начнет собираться. После компиляции в окне Project Explorer можно наблюдать, что в проект добавилась папка Debug с выходными файлами.

Теперь приступим к созданию конфигурации режима отладки. Для этого нажимаем на стрелку у значка "жука" и переходим в Debug configurations, как это показано на рисунке 11.

Рисунок 11 - Расположение кнопки Debug Configurations

В открывшемся окне слева необходимо выбрать параметр "Milandr DSP 1967 LLDB" и нажать на кнопку "New". Показано на рисунке 12.

Отладочную конфигурацию необходимо создавать только после сборки проекта, иначе исполняемый файл *.dxe придётся добавлять в отладочную конфигурацию вручную.

Рисунок 12 - Настройки окна Debug Configurations

Произойдет создании конфигурации с именем Project1 Debug. В поле "DSP cores" указывается количество процессоров, объединённых в JTAG цепочку. На отладочной плате два процессора 1967ВН028, поэтому выбираем "DSP cores = 2". Настройка параметров приведена на рисунке 13.  

Можно также воспользоваться автоматическим определением процессоров в JTAG цепочке с помощью кнопки "Autodetect", однако, перед её нажатием к плате необходимо подключить отладчик, после чего подать на плату питание.

Рисунок 13 - Конфигурация отладки в окне Create, manage, and run configurations

Теперь можно выбрать, с какими процессорами выполнять отладку: с первым, со вторым или сразу с двумя. В статье приведена отладка только одного процессора, описание многопроцессорной отладки описано в статье "Запускаем отладку многопроцессорной системы". Чтобы выбрать необходимый процессор, нужно оставить напротив него в столбце "Core" галочку, все остальные галочки убрать. Конфигурация наглядно выполнена на рисунке 14.

Рисунок 14 - Конфигурация для отладки одного процессора

Следующим шагом нужно перейти во вкладку "Debugger". Здесь в поле "Debugger" мы можем выбрать как будет осуществляться отладка: с помощью отладчика на процессоре, либо с помощью симулятора. При работе с отладочной платой необходимо выбрать "JEM", а остальные параметры оставить по умолчанию. Настройка вкладки "Debugger" приведена на рисунке 15. Сообщение "Found cores: 2" появится после нажатия на кнопку "Test".

Рисунок 15 - Настройка вкладки Debugger

Далее перейдем во вкладку "Control". Здесь можно настроить действия, выполняемые при запуске и завершении режима отладки. Вид вкладки представлен на рисунке 16.

Подробное описание всех режимов отладочной конфигурации приводится в документе "ML_ЦППО_GUI_Руководство_пользователя_R_Vx.x.x", пункт "Настройка конфигурации и запуск отладки" (x.x.x - номер версии документа).

Рисунок 16 - Конфигурация вкладки Control

На этом настройка конфигурации и запуска отладки завершена. Производим подключение к плате отладчика, подаём питание на плату и нажимаем кнопку "Debug".

Среда предложит открыть перспективу Debug режима, как это показано на рисунке 17. Необходимо согласиться. В режиме отладки можно выставлять точки останова (Breakpoints), открывать окно Dissassemblery, смотреть значения различных регистров.

Рисунок 17 - Окно с соглашением об открытии перспективы Debug режима

Запустить исполнение программы можно, если нажать на кнопку "Play". На рисунке 18 кнопка выделена синим цветом.

Рисунок 18 - Кнопка Play для запуска программы в режиме отладки

Приостановить выполнение программы можно с помощью кнопки "Suspend". Она показана на рисунке 19, выделена фиолетовым цветом.

Рисунок 19 - Кнопка Suspend для остановки выполнения программы в режиме отладки

Завершение процесса отладки осуществляется нажатием на кнопку "Stop". Кнопка показана на рисунке 20 и выделена зеленым цветом.

Рисунок 20 - Кнопка Stop для прекращения процесса отладки программы в режиме отладки


Сохранить статью в PDF

Теги

Была ли статья полезной?