Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
PeterBr
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 30
#1

Эффективность чтения датчиков SPI через DMA в режиме реального времени - Микроконтроллер

20.04.2016, 08:34. Просмотров 400. Ответов 6
Метки нет (Все метки)

Кто знает, насколько эффективно использование разных датчиков интерфейса SPI, для отслеживания показателей в режиме реального времени? С обычной передачей данных все понятно, но датчики, которые вызывают события после каждого переданного байта для обработки в реальном времени, дает ли какое-нибудь преимущество DMA ?
http://www.cyberforum.ru/avr/thread1951954.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.04.2016, 08:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Эффективность чтения датчиков SPI через DMA в режиме реального времени (Микроконтроллер):

USART0 в SPI режиме работает?
Именно USORT0. Пробовал в обоих симуляторах ATmega644 с буквами и без,...

Часы реального времени
надо часы сделать для процессора Atmega. Схема в протеусе сделана,а вот только...

Чтение байта в режиме SPI 9 битов
Разбираюсь с интерфейсом SPI 9 битов, возник вопрос по чтению из дисплея от...

Часы Реального времени на атмега16
Всем доброго вечера. Подскажите пожалуйста как написать на С функцию...

Часы реального времени на Atmega16
Собрала в Proteus схему и написала код, но работает криво (схема в Протеус и...

6
Voland_
1475 / 985 / 93
Регистрация: 04.01.2010
Сообщений: 3,252
20.04.2016, 09:25 #2
...весьма размытое описание задачи. Если вам надо написать реферат - то надо все равно привязываться к конкретным примерам.
Цитата Сообщение от PeterBr Посмотреть сообщение
датчики, которые вызывают события после каждого переданного байта для обработки в реальном времени, дает ли какое-нибудь преимущество DMA ?
не совсем ясно, что вы имеете ввиду. Датчик, подключенный по SPI не "вызывает" прерывание после переданного байта - его вызывает интерфейс SPI, независимо от того, что на нем висит.

Цитата Сообщение от PeterBr Посмотреть сообщение
дает ли какое-нибудь преимущество DMA ?
Конечно дает. Но по большому счету все зависит от соотношения "прямых участков" вычитки данных и команд управления. Иногда SPI дает очень хорошие результаты, но требует больше памяти. Но иногда он просто не нужен, если объема обмениваемых данных очень мало.
Многое также зависит от "прямоты рук" программиста. По крайней мере в 90% процентах случаев я встречал код, использующий DMA в режиме "задержки", то есть программа просто ожидает завершения обмена в цикле. А это естественно мало что дает в плане проивзодительности. То есть да, интерфейс работает быстро, но МК все равно ждет относительно много времени завершения передачи или приема данных.
2
PeterBr
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 30
20.04.2016, 13:55  [ТС] #3
Вот код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
void SysTick_Handler(void)
{
GPIOE_BSRR|=0x80000;
DMA2_S3CR|=0x1;
}
 
void USART_TX(uint32_t y)
{
USART2_DR=y-127;// центрируем график с осей по центру экрана
while (!(USART2_SR&0x80)==0x80){}
}
 
void SystemInit(void)
{
}
 
uint8_t x[] ={0xA9,0};//Адрес регистров осей акселерометра которые будут считываться.
uint8_t y[2];
uint8_t z;
uint32_t i;
 
void USART_ini(void)
{
RCC_GPIO|=0x1;
GPIOA_MODER|=0xA0; 
GPIOA_AFRL|=0x7700; 
RCC_UART2|=0x20000; 
USART2_BRR=0x683;
USART2_CR3|=0x80;
USART2_CR1|=0x8;
NVIC_ISER1|=0x40;
USART2_CR1|=0x2000;
}
 
void SPI_ini(void)
{ 
RCC_GPIO|=0x19;
 
GPIOA_MODER|=0xA800;
GPIOA_AFRL|=0x55500000; 
 
GPIOE_MODER|=0x40;
GPIOE_PUPDR|=0x40;
GPIOE_BSRR|=0x8;
 
RCC_SPI1|=0x1000;
 
SPI1_CR1 |= 0x0002 |0x0001; 
SPI1_CR1 |=0x0300|0x0028;
SPI1_CR1 |=0x04;
SPI1_CRCPR=7;
SPI1_CR2|=0x3;
SPI1_CR1|=0x0040;
 
GPIOE_BSRR=0x80000;
SPI1_DR=0x20;
while (!(SPI1_SR&0x1)==0x1){};
z=SPI1_DR;
SPI1_DR=0x97; 
while (!(SPI1_SR&0x1)==0x01){}
z=SPI1_DR;  
GPIOE_BSRR=0x8; 
}
 
void DMA_ini(void)
{ 
DMA1_RCC|=0x200000;
DMA2_RCC|=0x400000;
//.....................TX
DMA2_S3CR= 0x06000000;//DMA_Channel_3;
DMA2_S3PAR=0x4001300C;//SPI->DR
DMA2_S3M0AR= (uint32_t)x;
DMA2_S3CR|= 0x40;//DMA_DIR_MemoryToPeripheral;
DMA2_S3NDTR=2;
DMA2_S3CR|=0x0400;
DMA2_S3CR|=0x10000;
//DMA2_S3CR|=0x8;
//DMA2_S3CR|=0x100;//DMA_CIRCULAR
DMA2_S3CR|=0x10;
 
NVIC_ISER1=0x8000000;
DMA2_S3CR|=0x10;
//....................RX
DMA2_S0CR= 0x06000000;//DMA_Channel_3;
DMA2_S0PAR=0x4001300C;//SPI->DR
DMA2_S0M0AR=(uint32_t)y;
DMA2_S0CR|= 0;//peripheralToMemory
DMA2_S0NDTR=2;
DMA2_S0CR|=0x400;
DMA2_S0CR|=0x10000;
//DMA2_S0CR|=0x100;
DMA2_S0CR|=0x10;
 
NVIC_ISER1=0x1000000;
DMA2_S0CR|=0x10;
} void DMA2_Stream0_IRQHandler(void)//...........SPI->RX
{ 
GPIOE_BSRR=0x8;
DMA2_LIFCR=0x20;
USART_TX(y[1]);
}
 
void DMA2_Stream3_IRQHandler(void)//...........SPI->TX
{ 
GPIOE_BSRR=0x80000;
if((DMA2_LISR&0x8000000)==0x8000000)
{DMA2_LIFCR=0x8000000;
DMA2_S0CR|=0x1;}
}
void DMA1_Stream6_IRQHandler(void)
{ 
 
if((DMA_HISR&0x200000)==0x200000)
DMA_HIFCR=0x200000;
}
 
int main(void)
{
USART_ini();
SPI_ini();
DMA_ini();
GPIOD_MODER|=0x55000000;
GPIOD_OTYPER|=0x55000000;
SysTic_RVR=0xFFF;
SysTic_CVR=0x0;
SysTic_CTRL_Status=0x10007;
while(1)
{
GPIOD_ODR=0xF000;
for(i=0;i<1000000;i++){};
GPIOD_ODR=0x0;
for(i=0;i<1000000;i++){};
}
}
сайта http://ivarious.com/index.php?onecat...20систем&id=52
Эффективно ли после каждого байта создавать прерывание на его обработку, или все-таки в таких делах DMA не эффективен?
0
Voland_
1475 / 985 / 93
Регистрация: 04.01.2010
Сообщений: 3,252
20.04.2016, 14:15 #4
Цитата Сообщение от PeterBr Посмотреть сообщение
Эффективно ли после каждого байта создавать прерывание на его обработку, или все-таки в таких делах DMA не эффективен?
Я бы не стал ковыряться в подобном мусоре (это насчет исходного кода). Равно как и раскручивать рейтинг сайта подобным способом.
1
ValeryS
Модератор
7125 / 5393 / 669
Регистрация: 14.02.2011
Сообщений: 18,211
20.04.2016, 22:29 #5
Цитата Сообщение от Voland_ Посмотреть сообщение
Датчик, подключенный по SPI не "вызывает" прерывание после переданного байта
датчик может выставить какую то ногу в 1 или 0, сигнализируя что данные готовы
а контроллер ловит этот сигнал, вызывает прерывания и считывает данные
по моему мнению здесь DMA нафиг не нужен
датчик может послать разное количество байт
вот например nrf24l01 может послать от одного до 6 байт, на какой размер будем DMA програмировать

Добавлено через 3 минуты
Цитата Сообщение от PeterBr Посмотреть сообщение
для отслеживания показателей в режиме реального времени
что ты понимаешь под "Реальным временем"
0
PeterBr
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 30
21.04.2016, 04:06  [ТС] #6
В реальном времени - наблюдение за показателями. Эта тема поднималась на одном форуме easyelectronics под названием "DMA для SPI в коротких сессиях" , Но прочитав ту тему я пока так и не понял эффективно или нет.
Например бесплилотник который реагирует на "перекосы" в воздухе, он же должен чем быстрее отслеживать свое положение, следовательно - обрабатывать каждый принятый байт с осей x, y, z сразу. Анализировать данные придется всеровно - ядру, так как только он понимает что происходит и что делать. То есть - пришел байт (пусть будет через DMA) и должно как-никак происходить прерывание ро окончанию передачи (значит отвлекать ядро ).

В есть еще элементы FIFO в датчиках , которые не отправляют данные пока не наберется 4-8 байт, их передавать методом DMA вроде уже эффективнее. Но получается так теряется скорость считывания осей.

Добавлено через 15 минут
Незнаю понятно ли я выражаюсь, но как мне кажется - напрашивается мысль - если данные не анализируются ядром, а просто откуда то и куда то пишутся - DMA эффективен даже после передачи по одному байту. А если данные анализируются ядром - DMA вроде как не эффективен, так как ядро получается свободно только пока передается один байт, оно даже не успеет за это время сделать что то другое как тут-же произойдет прерывание по принятию нового байта которого нужно анализировать, и принять нужное решение что делать.
0
ValeryS
Модератор
7125 / 5393 / 669
Регистрация: 14.02.2011
Сообщений: 18,211
21.04.2016, 07:07 #7
Цитата Сообщение от PeterBr Посмотреть сообщение
В реальном времени - наблюдение за показателями.
Дилетантская точка зрения система реального времени-это система которая реагирует через гарантированное время после воздействия.
а время это может быть и одна миллисекунда и один час, но всегда одинаковое
поэтому Виндос и Люникс не системы реального времени,слишком много факторов влияющих на реакцию системы, а FreeRTOS система реального времени
Цитата Сообщение от PeterBr Посмотреть сообщение
Например бесплилотник который реагирует на "перекосы" в воздухе, он же должен чем быстрее отслеживать свое положение, следовательно - обрабатывать каждый принятый байт с осей x, y, z сразу.
все это рассмотрено давно уже в дисциплине под названием АСУ(Автоматические Системы Управления) в частности "системы с обратной связью", есть такая штука переходные процессы
сразу ничего не бывает, даже свет имеет конечную скорость распространения
Цитата Сообщение от PeterBr Посмотреть сообщение
В есть еще элементы FIFO в датчиках ,
"смешались в кучу кони, люди"(с) Лермонтов.
FIFO( First Input First Output)-Это способ хранения данных "Первый пришел первый ушел", другое название очередь, к датчикам никакого отношения не имеет
Цитата Сообщение от PeterBr Посмотреть сообщение
а просто откуда то и куда то пишутся - DMA эффективен даже после передачи по одному байту.
а зачем это нужно? первый принцип информатики -получение, обработка и передача данных, если нет обработки то все это нафиг не нужно, достаточно провод бросить

посему вопрос
Цитата Сообщение от PeterBr Посмотреть сообщение
насколько эффективно использование разных датчиков интерфейса SPI, для отслеживания показателей в режиме реального времени?
в отрыве от реальных задач, не имеет смысла
для управления паровым котлом, инерционность десятки минут, очень даже эффективный ширины канала SPI хватит, а для управления ядерной реакцией нет

посему сначала создается ТЗ, потом просчитывается математическая модель, чтобы система не "пошла в разнос"(самовозбуждение) время реакции, гистерезис, вид ОС( обратная связь) положительная, отрицательная
потом функциональная схема, потом принципиальная, и только потом программирование
2
21.04.2016, 07:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.04.2016, 07:07
Привет! Вот еще темы с решениями:

Программные часы реального времени (RTC)
Доброго, подскажите исходник (желательно C++) программых часов реального...

Работа с картой SD в режиме SPI (без использования FAT)
Форумчане, прошу помощи. Задача следующая: наладить связь между контроллером и...

Разработка часов реального времени на МС68НС11 (точность до 1 мин)
Всем привет. Необходимо разработать часы на МС68НС11, время отображаться будет...

Вывод данных с часов реального времени DS3231S (asm)
Приобрел платку с DS3231SN. И пробую подключить ее к меге16 на пинбоарде с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru