Читайте также:
|
|
//p30mem резервирование 30 страницы памяти для работы доайвера SPORT
#define pmem_sport0 p30mem
#define SPORT0_QUENE_FULL 0x00000001//очередь односвязного циклического списка заполнена
#define SPORT0_ELM_FREE 0x00000002//элемент списка свободен
#define SPORT0_ELM_INUSE 0x00000004//элемент списка используется
/////////////////////////////////////////////////////
#define SPORT0_READ_QUERY 0x00000010//запрос на периодическое чтение данных
#define SPORT0_READ_RUNNING 0x00000020//выполняется операция чтения данных
#define SPORT0_READ_COMPLETE 0x00000040//чтение данных sport0 завершено
/////////////////////////////////////////////////////
#define SPORT0_WRITE_QUERY 0x00000400//запрос на периодическую запись данных
#define SPORT0_WRITE_RUNNING 0x00000800//выполняется запись данных
#define SPORT0_WRITE_COMPLETE 0x00001000//запись данных заверешена
/////////////////////////////////////////////////////
typedef struct __DataBiSport{ // структура данных списка SPI
uint BiSportWrite[FIFO_INOUT_SPORT];// данные для передачи в СК
uint BiSportRead[FIFO_INOUT_SPORT];// данные считанные с СК
uint len_rw;
uint *pmsg;
uint tid; //дескриптор задачи, которая запросила обмен данными
int mu_i; //номер 1-го такта запуска обмена данными
uint fi; //частота запуска i-го обмена
uint j; //номер такта на котором должен запускаться обмен данными для i-ой задачи
uint NTask;//номер задачи
}_DataBiSport;
typedef struct __BiSPort{
_DataBiSport Data;
struct __BiSPort *pnext;
}_BiSPort;
Структура данных для обработчика прерывания от таймера драйвера SPORT
typedef struct __IrqSPORT{
uint IRQ_SPORT; //признак наличия прерывания
uint NIRQ_SPORT; //общее число прерываний
uint dt; // задержка **
uint ti; // номер i-го такта **
}_IrqSPORT;
Инициализация данных драйвера SPORT
· Настроить решистры цифрового интерфейса передачи данных SPORT и регистры DMA.
· Подключиться к обработчику прерывания SPORT при выдачи данных.
· Подключиться к обработчику прерывания от таймера.
· Подключиться к обработчику программного прерывания 1 для взаимодействия драйвера с другими задачами.
· Инициализация списка SPort0.
· Начальная инициализация структуры данных для обработчика прерывания _IrqSPORT.
Алгоритм работы драйвера SPORT запускается в обработчике прерывания от таймера.
Начало
IrqSPORT – указатель на структу IrqSPORT
IrqSPORT->ti++;
if(IrqSPORT->ti > IrqSPORT->dt){ Если наступило время запуска драйвера SPORT, то {
1 IrqSPORT->ti = 0; 2 IrqSPORT->IRQ_SPORT = 1; //признак наличия прерывания
3 IrqSPORT->NIRQ_HQUART ++; //общее число прерываний
4 j++; //j-й такт таймера
5 Запуск обменов данными
}
Конец
Запуск обменов данными
Начало
Цикл по списку запросов на обмен данными с СК {
Если i-й обмен данными должен выполниться на j-м такте таймера, то{
Зафиксировать элемент списка, для которо го надо выполнить обмен данными
Выйти из цикла
}
}
Запустить i-й обмен данными. В этом случае данные для передачи в СК выдаются в SPORT.
Конец
Обработчик прерывания SPORTa при выдачи данных.
Начало
Завершение i-го обмена данных.
В этом случае данные, считанные с SPORTа, записываются в массив данных считанных с СК.
Проверить,есть ли еще обмены данными, которые должны быть выполнены на j-м такте таймера. Для этого выполнить алгоритм Запуск обменов данными
Конец
Дата добавления: 2015-12-08; просмотров: 52 | Нарушение авторских прав