Скачать 1.7 Mb.
|
Примечание. Необходимо всегда соблюдать порядок запуска программы: компиляция и загрузка кода, включение режима отладки в реальном времени, запуск программы. Также необходимо всегда соблюдать порядок останова программы: останов программы (Debug – Halt), выключение режима отладки в реальном времени. Неправильный порядок включения режима отладки может привести к зависанию среды программирования. В последних версиях CodeComposerStudio (например 3.1.23) возможность неправильного запуска/останова исключена. Технология создания собственных функций для приложений При программировании на языке С следует создавать новые функции по единой технологии. Ниже будет рассмотрен пример создания процедуры генерации пилообразного сигнала с заданным шагом до заданного значения. Данный пример строится на базе предыдущего проекта, в котором имеется сконфигурированная ранее операционная система. Так как предполагается, что функции и данные будут объединены в структуру с одним именем, то такая структура будет носить название «объект». Для начала определим данные, которые будут использоваться объектом. Определение необходимых ресурсов происходит посредством введения заголовочного файла (название имени кроме расширения совпадает с именем файла исходного текста используемых функций, предполагается что текст функции будет содержаться в отдельном файле). Заголовочный файл состоит из 4-х частей:
Подобный подход позволяет запускать несколько копий объектов, каждый использует свой набор данных, равный структуре, при этом не происходит тиражирования кода в памяти программ, так как используется для всех копий объектов один код. Сохраните следующий файл как заголовочный (с расширением *.h) в директорию «include»: #ifndef __RAMP_H__ #define __RAMP_H__ typedef struct { int step; int ramp_out; int max_out; int (*init)(); int (*update)(); } RAMP; typedef RAMP *RAMP_handle; void RAMP_init(RAMP_handle); void RAMP_update(RAMP_handle); #define RAMP_DEFAULTS { 1,\ 0,\ 100,\ (int (*)(int))RAMP_init,\ (int (*)(int))RAMP_update} #endif Примечание. При задании параметров по умолчанию следует четко соблюдать чередование символов «переброс каретки» и «\», в противном случае возможны ошибки компиляции. См.пример. Для самих процедур функции необходимо создать отдельный файл, например следующего содержания: #include "..\include\ramp.h" /* процедура инициализации */ void RAMP_init(RAMP *v) { v->step=3; } /* процедура расчета */ void RAMP_update(RAMP *v) { v->ramp_out=v->ramp_out+v->step; if (v->ramp_out>v->max_out) v->ramp_out=0; } В основном файле программы следует объявить экземпляры объекта. RAMP ramp1=RAMP_DEFAULTS; RAMP ramp2=RAMP_DEFAULTS; В основной файл исходного текста проекта необходимо добавить вызовы функций объектов, например: void main() { RAMP_init(&ramp1); RAMP_init(&ramp2); } int a=0; void prd_ISR1() { a++; RAMP_update(&ramp1); RAMP_update(&ramp2); SWI_post(&SWI0); if (a%2) GpioDataRegs.GPFDAT.all =0xAAAA; else GpioDataRegs.GPFDAT.all =0x5555; } В результате будут генерироваться 2 пилообразных сигнала, шаг и максимальное значение которых можно задавать индивидуально. В ходе разработки функций полезно пользоваться директивами компилятора, которые позволяют настроить ход компиляции. Рассмотрим на примере технологию применения директив. Для того чтобы избежать предупреждения о переопределении константы, необходимо в начале каждого заголовочного файла вводить следующее: #ifndef __LES1_H__ #define __LES1_H__ Для определения константы используем директиву #define. Допустим, необходимо, чтобы при компиляции происходило генерирование кода на сложение или вычитание. Для этого вводим #define ADD 0 #define SUB 1 В дальнейшем ход компиляции будет определяться в зависимости от значений констант ADD или SUB. #if ADD my1.c = my1.a + my1.b; #endif #if SUB my1.c = my1.a - my1.b; #endif Определять можно не только константы, но и макросы. Например, макрос возведения в квадрат будет выглядеть как #define quad(x) ((x)*(x)) Вызов макроса возможен следующим образом: float temp=0; temp = quad(3.5); При компиляции все строки, определенные через #define, будут подменены на заданные в директиве значения. Директива #pragma позволяет определить область памяти, куда будут размещены данные или код (например, в командном файле должна быть задана секция sect): #pragma CODE_SECTION(www, "sect"); void www(void); В данном случае при объявлении прототипа функции указывается ее размещение в памяти. Полный пример заголовочного файла les1.h: #ifndef __LES1_H__ #define __LES1_H__ #define ADD 0 #define SUB 1 #define Uint16 unsigned int #define quad(x) ((x)*(x)) typedef struct { float a; float b; float c; } MY_STRUCT; #define MY_STRUCT_DEFAULTS {2,\ 3,\ 0} struct ABCD_bits{ Uint16 a:4; Uint16 b:4; Uint16 c:4; Uint16 d:4; }; typedef union ABCD_union { Uint16 all; struct ABCD_bits bit; } ABCD_union; #endif Полный пример файла программы les1.c: #include "les1.h" #include MY_STRUCT my1=MY_STRUCT_DEFAULTS; #pragma CODE_SECTION(www, "sect"); void www(void); ABCD_union ax; float temp=0; void main() { while(1) { temp = quad(3.5); #if ADD my1.c = my1.a + my1.b; #endif #if SUB my1.c = my1.a - my1.b; #endif www(); } } void www() { ax.bit.c=1; } В данном примере также показан механизм использования объединений (union), который позволяет использовать одну и ту же область памяти для различных типов данных, в данном случае – это одновременно и беззнаковое целое, и группы битов по 4 бита в каждой. Такой механизм удобно использовать, например, для конфигурирования регистров либо побитно, либо целиком загрузкой целого известного значения. Собственно разработанные процедуры полезно объединять в библиотеки, объединяющие процедуры пользователя по функциональному принципу (библиотека регуляторов, драйверов, сигналов и т.д.). Библиотека будет содержать объектный код, который будет подключен в основной проект при выполнении компоновки (выполняется при подаче команды project-build). Для этого необходимо создать проект библиотеки Project-New, в появившемся окне указать имя библиотеки (автоматически будет создан каталог библиотеки, куда необходимо сохранять все ее исходные файлы), в поле типа проекта (Project type) выбрать Library (.lib). В окне настройки опции компиляции изменятся названия закладок (появится Archiver), см.рис.24 Рис.24 В проект необходимо добавить файл процедуры. При компиляции появится файл с расширением lib, имя которого будет одинаково с именем проекта. Использование псевдоплавающей запятой Процессоры серии С2000 могут выполнять целочисленную арифметику. Арифметика с плавающей запятой, дающая большую точность, в принципе возможна, но требует больших затрат времени на проведение вычислений. Поэтому вычисления для вещественных чисел принято проводить с фиксированной запятой, когда запятая устанавливается фиксировано, деля набор битов на 2 части – на целую (знак числа входит сюда же) и дробную. Математические дейтсвия (преобразования форматов, умножение и деление, вычисление тригонометрических функций) запускаются через специальные процедуры, вызвать их можно из библиотеки IQmath.lib, которую необходимо добавить в проект. Также необходимо определиться с форматом 32-разрядных чисел, которые будут использоваться в проекте, желательно чтобы формат был единым, однако, в принципе, возможно применение разных форматов. Задание единого формата осуществляется через #define GLOBAL_Q 24 в основном файле исходных текстов. Также в том же файле необходимо подключить заголовочный файл библиотеки через #include "..\include\IQmathLib.h". Добавить в проект файл библиотеки IQmath.lib. Объявление переменных, используемых для расчетов с псевдоплавающей запятой, происходит через тип _iq (см.пример ниже) В командном файле “распределение памяти проекта” (расширение *.cmd) следует добавить описание следующих секций (в конце файла, перед последней скобкой) IQmathTables : > BOOTROM, PAGE = 0, TYPE = NOLOAD IQmath : > L0SARAM, PAGE = 1 Примечание: данные изменения командного файла подходят только при загрузке в RAM. Для загрузки во FLASH необходимы изменения (в данном случае не применять): IQmathTables : > BOOTROM, PAGE = 0, TYPE = NOLOAD IQmath : > FLASH_BC, PAGE = 0 Пример использования IQ-функций показан далее (добавляются в прежний проект): float TimeF=0,Time_stepF=0.1; _iq Time,Time_step,sin_out; void main() { Time_step=_IQ(Time_stepF); //преобразование // числа 0,1 в формат //псевдоплавающей запятой RAMP_init(&ramp1); RAMP_init(&ramp2); } int b=0; void prd_ISR2() { b++; Time=Time+Time_step; sin_out=_IQsin(Time); TimeF=_IQtoF(Time);// преобразование числа с псевдоплавающей //запятой в формат с плавающей запятой } В результате выполнения проекта должен генерироваться сигнал синусоидальной формы. Для того чтобы убедиться в этом, необходимо открыть окно графиков (View-Graph-Time|Frequency), в свойствах окна графиков выставить Acquisition Buffer Size «1», DSP data type «32 signed integer», Q-value «24». Далее необходимо запустить программу в режиме отладки в реальном времени и, щелкнув правой клавишей по окну графиков, выбрать «Continuous refresh». Использование стандартной библиотеки DMC_lib К процессору TMS320C28xx производитель предлагает библиотеку наиболее часто используемых программных функций, необходимых для создания приложений по управлению двигателями. Получить библиотеку можно на сайте www.ti.com, файл sprc080.zip. Фактически эта библиотека состоит из двух частей: 1. Библиотека функций управления и восстановления координат с расчетом на псевдоплавающей запятой iqDMC_ml.L28 (к ней же прилагается аналогичная библиотека на плавающей запятой). 2. Библиотека драйверов периферийных устройств и отладочных функций F281xDRV_ml.L28 . В качестве примера использования данной библиотеки решим проблему осциллографирования быстро меняющейся переменной. Для организации такого сигнала перенесем расчет времени и вызов расчета синуса в более частое прерывание, которое в проекте выполнено на базе аппаратного таймера: int b=0; void prd_ISR2() { b++; // убраны расчет времени и генерирования синуса } int d=0; void timer_ISR() { EvaRegs.EVAIMRA.bit.T1PINT = 1; EvaRegs.EVAIFRA.all = BIT7; PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; d++; // вставлены расчет времени и генерирования синуса Time=Time+Time_step; sin_out=_IQsin(Time); TimeF=_IQtoF(Time); } При таком изменении данные не успевают поступать с DSP на компьютер пользователя, отсутствует синхронизация быстроменяющегося сигнала, в результате форма сигнала теряется, в чем можно убедиться при запуске программы. Подключаем указанные выше библиотеки в проект, перемещаем в директорию “..\include” заголовочный файл “dlog4ch.h”, который описывает данные объекта dlog4ch. Данный объект позволяет при каждом вызове его процедуры update накапливать в последовательный буфер данные и затем передавать этот буфер в среду отладки CodeComposer. После передачи происходит новое накопление. Начало накопления происходит по переходу сигнала через нулевое значение, что позволяет синхронизировать показания сигнала. Возможно масштабирование сигнала по амплитуде и по времени. Объект поддерживает 4 буфера, то есть может накапливать 4 разных сигнала. В файле appDSP.c подключаем заголовочный файл, объявляем наличие экземпляра объекта DLOG, позволяющего проводить осциллографирование. Также появляются 2 переменные (каждая отвечает за свой канал осциллографирования), в которые необходимо помещать осциллографированный сигнал: #include "..\include\dlog4ch.h" DLOG_4CH dlog = DLOG_4CH_DEFAULTS; int16 DlogCh1 = 0; int16 DlogCh2 = 0; В командном файле необходимо для данного объекта объявить специальную секцию: DLOG : > L0SARAM, PAGE = 1 В процедуре main файла appDSP.c необходимо вставить конфигурацию экземпляра объекта DLOG. dlog.iptr1 = &DlogCh1;// устанавливаем указатель // на первую переменную вывода dlog.iptr2 = &DlogCh2;//устанавливаем указатель // на вторую переменную вывода dlog.trig_value = 1;// включаем синхронизацию dlog.size = 0x400;// задаем размер буфера // для каждого сигнала dlog.prescalar = 1;//задаем коэффициент масштабирования 1 dlog.init(&dlog); // вставлен вызов функции конфигурации объекта Для осциллографирования необходимо периодически вызывать процедуру update объекта DLOG. Если нужно (как в этом примере), проводятся преобразования типов к 16-разрядному значению. int d=0; void timer_ISR() { EvaRegs.EVAIMRA.bit.T1PINT = 1; EvaRegs.EVAIFRA.all = BIT7; PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; d++; // вставлены расчет времени и генерирования синуса Time=Time+Time_step; sin_out=_IQsin(Time); TimeF=_IQtoF(Time); DlogCh1 = (int16)_IQtoIQ15(sin_out); DlogCh2 = (int16)_IQtoIQ15(Time); dlog.update(&dlog); } Для вывода осциллограммы необходимо сконфигурировать его свойства таким образом (обратить внимание на поля Start Address, Size, DSP data type ), как показано на рис.25. Для вывода графиков в реальном времени необходимо установить с помощью контекстного меню (правый щелчок мыши по окну графиков) Continuous Refresh. В результате после запуска программы на выполнение в режиме реального времени получается вид окна интегрированной среды CodeComposer , показанный на рис.26. Рис.25 Рис.26 |
Учебно-методическое пособие Рекомендовано методической комиссией... Методы молекулярной диагностики: Учебно-методическое пособие. Авторы: А. Д. Перенков, Д. В. Новиков, С. Г. Фомина, Л. Б. Луковникова,... |
Учебно-методическое пособие Елабуга 2016 ббк 74. 58 Учебно-методическое... Методическое пособие предназначено для студентов 1 курса высших учебных заведений неязыковых специальностей |
||
Учебно-методическое пособие по клинической фармакологии Оренбург, 2007 Учебно-методическое пособие предназначено для самостоятельной работы студентов медицинских вузов, обучающихся по специальности «Лечебное... |
Методическое пособие Саратов 2008 г. Организация комплексной системы... Методическое пособие предназначено для руководителей и преподавателей- организаторов обж образовательных учреждений |
||
Учебно-методическое пособие ... |
Организация и технология документационного обеспечения управления учебно-методическое пособие ... |
||
Учебно-методическое пособие «Учебные игры и ситуационные задачи в... Учебные игры и ситуационные задачи в гинекологии: Учебно-методическое пособие / Под ред. А. А. Радионченко. – Томск: Сибгму,... |
Учебно-методическое пособие Казань 2010 Печатается по рекомендации... Учебно-методическое пособие по курсу «Организационное поведение» /Д. М. Сафина. – Казань: Казанский (Приволжский) федеральный университет;... |
||
Учебно-методическое пособие. Новосибирск, 2006 Учебно-методическое пособие предназначено инструкторам детско-юношеского и спортивного туризма с целью повышения уровня знаний и... |
Учебно-методическое пособие к лабораторным занятиям по курсу «Основы кристаллооптики» Практическое руководство по работе с поляризационным микроскопом для исследования петрографических объектов: Учебно-методическое... |
||
Учебно-методическое пособие организация инженерной защиты населения Учебно-методическое пособие разработано применительно к Программе обучения слушателей на курсах гражданской защиты Копейского городского... |
Учебно-методическое пособие Санкт-Петербург 2007 Автор: Черемисов... Учебно-методическое пособие предназначено для подготовки руководящего состава, специалистов гочс и пб, руководителей служб, аварийно-спасательных... |
||
Учебно-методическое пособие для студентов пм. 04.(07.) «Выполнение... Учебно-методическое пособие составлено в соответствии с требованиями Федерального Государственного образовательного стандарта по... |
Учебно-методическое пособие санкт-Петербург 2009г. Автор: Г. П. Подвигин... Учебно-методическое пособие предназначено для должностных лиц, специалистов го и рсчс организаций |
||
Учебно-методическое пособие Кемерово 2015 г. Согласовано: кроо «памск» Учебно-методическое пособие предназначено для студентов стоматологического факультета, гигиенистов стоматологических со средним медицинским... |
Федеральное государственное образовательное учреждение Высшего профессионального... Вакуумный практикум: Учебно-методическое пособие. Ростов-на-Дону, 2008. 55с |
Поиск |