Скачать 1.7 Mb.
|
Примечание: запись “..\ ” означает, что обращение происходит не из текущего каталога, а из родительского (который на один уровень по иерархии выше).
«0 Errors, 0 Warnings, 0 Remarks».
int a=0; void prd_ISR1() { a++; } Данный исходный текст реализует простейшую задачу – увеличивает значение переменной «а» на единицу при каждом выполнении, которое запускается 1 раз в секунду.
Примечание. Необходимо всегда соблюдать порядок запуска программы: Компиляция и загрузка кода, включение режима отладки в реальном времени, запуск программы. Также необходимо всегда соблюдать порядок останова программы: останов программы (Debug – Halt), выключение режима отладки в реальном времени. Неправильный порядок включения режима отладки может привести к зависанию среды программирования. В последних версиях CodeComposerStudio (например 3.1.23) возможность неправильного запуска/останова исключена. Задание для самостоятельного выполнения Ввести в программу еще одну задачу пользователя, которая реализует функцию инкрементирования (увеличения на единицу) для переменной «b» в 10 раз быстрее, чем ранее созданная задача. Рационально использовать периодические прерывания для запуска программных прерываний, которым, в свою очередь, можно назначить приоритет выполнения. Более приоритетное выполнение задачи означает, что процедура задачи будет выполнена, а менее приоритетные не будут запущены до момента завершения выполнения ее процедуры. Преимуществом программных прерываний по сравнению с периодическими является возможность введения приоритетов выполнения.
int c=0; void isr_SWI_0() { c++;c++; } 38. Добавить в процедуру void prd_ISR1() строку SWI_post(&SWI0), которая будет запускать программное прерывание из этой процедуры: int a=0; void prd_ISR1() { a++; SWI_post(&SWI0): } SWI0 – имя прерывания, показывающееся в окне конфигурации операционной системы, в SWI-Software Interrupt Manager. SWI_post – имя функции API.
Процессор имеет на своем борту несколько периферийных устройств, которые могут генерировать прерывания, полный список приведен в файле SPRS174N.pdf., вырезка из него показана на рисунке: Рис.14 Рассмотрим конфигурацию через DSP-BIOS прерывания по событию от процессорного таймера, входящего в состав менеджера событий.
void Timer_init(void) { // Initialize EVA Timer 1: // Setup Timer 1 Registers (EV A) EvaRegs.GPTCONA.all = 0; // Set the Period for the GP timer 1 to 0x0200; EvaRegs.T1PR = 0x0200; // Period EvaRegs.T1CMPR = 0x0000; // Compare Reg // Enable Period interrupt bits for GP timer 1 // Count up, x128, internal clk, // enable compare, use own period EvaRegs.EVAIMRA.bit.T1PINT = 1; EvaRegs.EVAIFRA.bit.T1PINT = 1; // Clear the counter for GP timer 1 EvaRegs.T1CNT = 0x0000; EvaRegs.T1CON.all = 0x1742; // Start EVA ADC Conversion on timer 1 Period interrupt EvaRegs.GPTCONA.bit.T1TOADC = 2; }
Timer_init(); // вызов процедуры инициализации PieCtrlRegs.PIEIER2.all = M_INT4; // разрешение прерывания таймера IER |= M_INT2; // разрешение периферийных прерываний 2-ого уровня EINT; // глобальное разрешение прерываний Полный вид процедуры main будет следующим: void main() { Sys_init(); Timer_init(); PieCtrlRegs.PIEIER2.all = M_INT4; IER |= M_INT2; EINT; }
int d=0; void timer_ISR() { EvaRegs.EVAIMRA.bit.T1PINT = 1; EvaRegs.EVAIFRA.all = BIT7; PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; d++; }
Существует возможность вывода информации на ножки процессора (spru712.pdf). В плате отладочного набора светодиод управляется с одного из пинов процессора. Сейчас будет рассмотрен пример создания эффекта мигающего светодиода. 45. Сконфигурировать ножки процессора как однобитовые порты, работающие на вывод. Для этого ввести следующую процедуру конфигурации (в файле initDSP.c): void Gpio_init(void) { EALLOW; GpioMuxRegs.GPFMUX.all=0x0000; GpioMuxRegs.GPFDIR.all=0xffff; EDIS; }
void prd_ISR1() { a++; SWI_post(&SWI0); if (a%2) GpioDataRegs.GPFDAT.all =0xAAAA; else GpioDataRegs.GPFDAT.all =0x5555; }
Созданные процедуры вынуждены запускаться согласно событиям, связанным со временем. В случае если нет необходимости поддержать расчеты с выдачей результатов к заданному времени (соблюдение режима реального времени), предлагается для запуска таких процедур использовать механизм задач (tasks). Задача запускается только тогда, когда не выполняются прерывания, то есть выполняется в фоновом режиме. Задачи возможно также распределить между собой по приоритетам выполнения.
long int e=0; void s_TSK0() { while (1) { e++; } } Данная процедура осуществляет постоянное инкрементирование переменной «е», имитируя тем самым сложный расчет, не требующий выдачи результата к жестко установленному моменту времени с заданной периодичностью. Все время процессора, не занятое выполнением процедур обслуживания прерываний, будет выделено на инкрементирование переменной «е». Объявление переменной как long необходимо для выполнения будущих пунктов.
long int f=0; void s_TSK1() { while (1) { f++; } }
Для того, чтобы работали обе задачи (то есть происходило переключение между ними по различным событиям), необходимо использовать механизм семафоров операционной системы. Рассмотрим пример, в котором одна задача умеет только инкрементировать (добавлять единицу) заданную переменную, а вторая – декрементировать (вычитать единицу) ту же самую переменную. Основной целью разрабатываемой программы будет удержание значения переменной в рамках заданного диапазона путем переключения между двумя задачами. Воспользуемся функциями SEM_pend (ожидать выставления семафора) и SEM_post (выставить семофор.) Соответственно, более приоритетная задача, для того чтобы дать возможность работать менее приоритетной задаче, должна выставить ожидание семафора, тем самым отложив свое исполнение, и операционная система в таком случае запустит менее приоритетную задачу. Менее приоритетная задача должна произвести свои вычисления, после которых выставить семафор, тем самым запуская более приоритетную задачу, находящуюся в ожидании выставления семафора. В нашем случае более приоритетная задача – TSK1.
long int e=0;long int f=0; void s_TSK0()// менее приоритетная задача { while(1) { e++; if (e>20000000) SEM_post(&mySEM); f=e/100000; } } void s_TSK1()// более приоритетная задача { while(1) { e--; if (e<1) SEM_pend(&mySEM,20000); f=e/100000; } } В данном коде имя семафора – mySEM. Переменная «е» используется для постоянного изменения с целью удержания ее в заданном дипазоне. Переменная «f» используется для масштабирования с целью удобства визуализации процессов вычисления при отладке.
#include extern SEM_Obj mySEM;
Итоговое содержание файла appDSP.c: #include "..\include\DSP281x_Device.h" #include #include #include extern SWI_Obj SWI0; extern SEM_Obj mySEM; void main() { Sys_init(); Timer_init(); Gpio_init(); PieCtrlRegs.PIEIER2.all = M_INT4; IER |= M_INT2; EINT; } int a=0; void prd_ISR1() { a++; SWI_post(&SWI0); if (a%2) GpioDataRegs.GPFDAT.all =0xAAAA; else GpioDataRegs.GPFDAT.all =0x5555; } int b=0; void prd_ISR2() { b++; } int c=0; void isr_SWI_0() { c++;c++; } int d=0; void timer_ISR() { EvaRegs.EVAIMRA.bit.T1PINT = 1; EvaRegs.EVAIFRA.all = BIT7; PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; d++; } long int e=0;long int f=0; void s_TSK0()// менее приоритетная задача { while(1) { e++; if (e>20000000) SEM_post(&mySEM); f=e/100000; } } void s_TSK1()// более приоритетная задача { while(1) { e--; if (e<1) SEM_pend(&mySEM,20000); f=e/100000; } } Итоговое содержание файла initDSP.c: #include "..\include\DSP281x_Device.h" void Sys_init(void) { EALLOW; SysCtrlRegs.HISPCP.all = 0x0001; SysCtrlRegs.LOSPCP.all = 0x0002; SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; SysCtrlRegs.PCLKCR.bit.EVBENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1; SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1; SysCtrlRegs.PCLKCR.bit.SPIENCLK=1; SysCtrlRegs.PCLKCR.bit.ECANENCLK=1; SysCtrlRegs.PCLKCR.bit.ADCENCLK=1; EDIS; } void Timer_init(void) { // Initialize EVA Timer 1: // Setup Timer 1 Registers (EV A) EvaRegs.GPTCONA.all = 0; // Set the Period for the GP timer 1 to 0x0200; EvaRegs.T1PR = 0x0200; // Period EvaRegs.T1CMPR = 0x0000; // Compare Reg // Enable Period interrupt bits for GP timer 1 // Count up, x128, internal clk, // enable compare, use own period EvaRegs.EVAIMRA.bit.T1PINT = 1; EvaRegs.EVAIFRA.bit.T1PINT = 1; // Clear the counter for GP timer 1 EvaRegs.T1CNT = 0x0000; EvaRegs.T1CON.all = 0x1742; // Start EVA ADC Conversion on timer 1 Period interrupt EvaRegs.GPTCONA.bit.T1TOADC = 2; } void Gpio_init(void) { EALLOW; GpioMuxRegs.GPFMUX.all=0x0000; GpioMuxRegs.GPFDIR.all=0xffff; EDIS; } |
Учебно-методическое пособие Рекомендовано методической комиссией... Методы молекулярной диагностики: Учебно-методическое пособие. Авторы: А. Д. Перенков, Д. В. Новиков, С. Г. Фомина, Л. Б. Луковникова,... |
Учебно-методическое пособие Елабуга 2016 ббк 74. 58 Учебно-методическое... Методическое пособие предназначено для студентов 1 курса высших учебных заведений неязыковых специальностей |
||
Учебно-методическое пособие по клинической фармакологии Оренбург, 2007 Учебно-методическое пособие предназначено для самостоятельной работы студентов медицинских вузов, обучающихся по специальности «Лечебное... |
Методическое пособие Саратов 2008 г. Организация комплексной системы... Методическое пособие предназначено для руководителей и преподавателей- организаторов обж образовательных учреждений |
||
Учебно-методическое пособие ... |
Организация и технология документационного обеспечения управления учебно-методическое пособие ... |
||
Учебно-методическое пособие «Учебные игры и ситуационные задачи в... Учебные игры и ситуационные задачи в гинекологии: Учебно-методическое пособие / Под ред. А. А. Радионченко. – Томск: Сибгму,... |
Учебно-методическое пособие Казань 2010 Печатается по рекомендации... Учебно-методическое пособие по курсу «Организационное поведение» /Д. М. Сафина. – Казань: Казанский (Приволжский) федеральный университет;... |
||
Учебно-методическое пособие. Новосибирск, 2006 Учебно-методическое пособие предназначено инструкторам детско-юношеского и спортивного туризма с целью повышения уровня знаний и... |
Учебно-методическое пособие к лабораторным занятиям по курсу «Основы кристаллооптики» Практическое руководство по работе с поляризационным микроскопом для исследования петрографических объектов: Учебно-методическое... |
||
Учебно-методическое пособие организация инженерной защиты населения Учебно-методическое пособие разработано применительно к Программе обучения слушателей на курсах гражданской защиты Копейского городского... |
Учебно-методическое пособие Санкт-Петербург 2007 Автор: Черемисов... Учебно-методическое пособие предназначено для подготовки руководящего состава, специалистов гочс и пб, руководителей служб, аварийно-спасательных... |
||
Учебно-методическое пособие для студентов пм. 04.(07.) «Выполнение... Учебно-методическое пособие составлено в соответствии с требованиями Федерального Государственного образовательного стандарта по... |
Учебно-методическое пособие санкт-Петербург 2009г. Автор: Г. П. Подвигин... Учебно-методическое пособие предназначено для должностных лиц, специалистов го и рсчс организаций |
||
Учебно-методическое пособие Кемерово 2015 г. Согласовано: кроо «памск» Учебно-методическое пособие предназначено для студентов стоматологического факультета, гигиенистов стоматологических со средним медицинским... |
Федеральное государственное образовательное учреждение Высшего профессионального... Вакуумный практикум: Учебно-методическое пособие. Ростов-на-Дону, 2008. 55с |
Поиск |