Перейти к содержанию

Философия аппаратного SPI - чем занять МК?


Рекомендуемые сообщения

Я сейчас про случай, когда тактовая частота SPI равна половине или даже равна тактовой процессора. Соответственно, чем занять МК, пока идет отправка данных? У нас есть всего 16 тактов (или меньше). Обычно идет проверка флага опустошения буфера. Но тогда в чем профит аппаратного SPI, если на том же USI данные отправляются за те же 16 тактов, но МК занят тактированием(!)?. Вот чем занять МК? Отправить в остановку? Так дольше будем подготавливаться к остановке, потом уход на вектор прерывания (4 такта как минимум) и возврат из него. Ежели заниматься чем-то параллельно, то так же теряем время на обработку прерывания. Получается - только тупить в троттлинге?

Ссылка на комментарий
Поделиться на другие сайты

Занять чем-то современный МК - это вообще вопрос вопросов. Или вы достигли такого уровня, что у вас каждый такт на пользу делу тратится?

Обычно поступают так: сначала ждут готовности SPI, а затем пихают данные. И пока он отправляет полученный байт, занимаются чем-то полезным. Если к моменту, когда можно слать следующий байт, SPI успеет завершить передачу, никакого ожидания не будет. А если не успеет - будет минимальное ожидание. А уж чем МК занять - это вам надо думать...

// не правильный подход - бессмысленное ожидание
uint8_t spi(uint8_t d){
   UDR = d;
   while(!(SPSR & (1<<UDRE));
   return UDR;
}

// правильный подход - минимальное ожидание
uint8_t spi(uint8_t d){
   while(!(SPSR & (1<<UDRE));
   uint8_t res = UDR;
   UDR = d;
   return res;
}

 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Конечно ждать. На большой скорости много посторонней задачи в ущерб скорости передачи не сделаешь.
Поэтому на старших контроллерах такие задачи делаются через DMA. И у нас появлется не много кусочков свободы по 16 тактов, а один большой кусок времени, пропорциональный объёму передачи.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

14 часа назад, Alexeyslav сказал:

Поэтому на старших контроллерах такие задачи делаются через DMA.

А кроме ARM, есть в каких ядрах DMA?

15 часов назад, ARV сказал:

Или вы достигли такого уровня, что у вас каждый такт на пользу делу тратится?

Не достиг, но всячески стремлюсь.

15 часов назад, ARV сказал:

Если к моменту, когда можно слать следующий байт, SPI успеет завершить передачу, никакого ожидания не будет. А если не успеет - будет минимальное ожидание. А уж чем МК занять - это вам надо думать...

Обычно, массив уже готов полностью к передаче. Я так понимаю, это с технологией DMA мы можем отослать за раз 5 байтов, а на простых МК типа восьмибиток придется отвлекаться на каждый байт.

Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Вот не жалею что перешел на стм32 :D

По сабжу. А что если не 16 тактов занять? Спи отвалится? Если нет то можно что угодно.

Как показали выше, ждать нужно до отправки, а потом смысла нет. Вы отправили последний байт и ждете пока улетит, хотя могли уже что то делать :)

Думаю если можно слать кусками, то есть не имея лимита в 16 тактов, то можно что угодно делать)

while () {
  if (spi_ready()) {
    spi_send(buf++);
  } else {
    work();
  }
}

 

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

10 минут назад, DrobyshevAlex сказал:

Вы отправили последний байт и ждете пока улетит

А где тут отправляется последний байт, интересно, по вашему мнению???

buf++

это навсегда!!!

надо было какую то проверку наличия данных в буфере куда-нить присобачить, да ведь? типа:

while(1)
{
  if(SpiReady())
  {
      if(byteCount != 0)
      {
          send(buf++);
          byteCount--;
      {
  }
  work();
}

...
где то в ворке:
ARRAY[0] = 33;
ARRAY[1] = 34;
buf = ARRAY;
byteCount = 2;

 

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Что-то я вообще не пойму, нафига ждать флаг. прерывания же есть. Настроить его на окончание передачи и все. тогда работа с SPI будет выглядеть примерно так:

  1. Загрузили данные в буфер.
  2. МК занимается полезной работой
  3. Сработало прерывание по окончанию отправки
  4. Загрузили следующий байт
  5. МК занимается полезной работой
  6. ...
Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, ruhi сказал:

А где тут отправляется последний байт, интересно, по вашему мнению???

Тут это где? Вы о чем вообще? Я написал что если кому то надо отправить вот так

spi_write(b1);

а дальше например уже не надо слать, то в случае ожидания после отправки байта таким способом

16 часов назад, ARV сказал:

// не правильный подход - бессмысленное ожидание uint8_t spi(uint8_t d){ UDR = d; while(!(SPSR & (1<<UDRE)); return UDR; }

как раз бессмысленное ожидание, и я сказал что раньше об этом уже написали

26 минут назад, DrobyshevAlex сказал:

Как показали выше, ждать нужно до отправки

как бы это об этом и было.

 

9 минут назад, ruhi сказал:

buf++

это навсегда!!!

да ну? а не чего что это вообще просто набросок алгоритма, ни чего не имеющего общего с реальной прилой? может у вас всего 1 байт так там вообще не надо смещать указатель.

или вам тут надо готовый 100%  код написать? сами ни как? тогда давайте 100% готовое тз.

9 минут назад, ruhi сказал:

надо было какую то проверку наличия данных в буфере куда-нить присобачить, да ведь?

о, оказывается понимаете, тогда что это было за сообщение? показать что вы гений? :D

ТАк я пойду вашим путем, Я вставил ваш код!!! а он не компилится!!! вы врете!

1 минуту назад, BARS_ сказал:

прерывания же есть

кстати да :)

Изменено пользователем DrobyshevAlex
Ссылка на комментарий
Поделиться на другие сайты

5 минут назад, BARS_ сказал:

работа с SPI будет выглядеть примерно так:

так это же как бы DMA и получится!

А мужики то не знают :) !

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, ruhi сказал:

ак это же как бы DMA и получится!

это получится простое прерывание. где код в прерывании выполняясь остановит выполнение кода основного цикла.

основное отличие dma от обычных прерываний как раз в тмо что этого нет, так что нет такого понятия как "как бы DMA" :)

 

 

дергать ножками с паузами в цикле - тоже как бы аппаратный  spi получиться тогда :D

 

Ссылка на комментарий
Поделиться на другие сайты

10 минут назад, ruhi сказал:

так это же как бы DMA и получится!

И близко не он. С DMA это было так:

  1. Сформировали массив данных
  2. Пнули DMА и пошли делать полезную работу
  3. Получили прерывание по окончанию отправки всего буфера.

Ну и DMA есть смысл использовать только на больших объемах данных. Если передавать с его помощью по несколько байт, то получим падение скорости вместо выигрыша.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, BARS_ сказал:

то получим падение скорости вместо выигрыша.

тут обычно целью является унификация доступа к функциям периферии, падение скорости (вообще скорость) особо не важна если вы работаете с малыми объемами данных.

1 час назад, DrobyshevAlex сказал:

и с дма его макс скорость замера упала)

значит неправильно было сконфигурировано-использовано. С дуру как говорится все можно сломать :( .

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Работа с SPI по прерываниям, как и любая работа по прерываниям, требудет повышенной культуры программирования. DMA, кстати, то же самое - это ближе к парадигме многопоточного программирования, там немало тонкостей. А в большинстве самодеятельных проектов необходимости в этом нет.

К тому же на вход в прерывание и выход из него тратится минимум 8 тактов, плюс минимально полезная работа с указателем и пересылка - исчерпывается весь лимит на "ожидание" при высокой скорости SPI. Поэтому в прерываниях есть смысл только при работе SPI на низкой тактовой частоте. Интересно, кому-то хоть раз требовалось реализовать МЕДЛЕННУЮ работу с периферией? ;) 

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

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, ruhi сказал:

падение скорости (вообще скорость) особо не важна если вы работаете с малыми объемами данных.

А для малых объемов и DMA не нужен, особой унификации он не даст. DMA удобен либо в случае пересылки больших объемов данных, либо при организации большого количества измерений. К примеру, запустил АЦП и он пишет в буфер через DMA. 

Ссылка на комментарий
Поделиться на другие сайты

30 минут назад, ARV сказал:

Интересно, кому-то хоть раз требовалось реализовать МЕДЛЕННУЮ работу с периферией?

в последний раз мне пришлось реализовать очень быструю работу по SPI (кстати) - больше 2Мегабайт в секунду непрерывный трафик,

теперь всю свою предыдущую работу с периферией я с полным основанием рассматриваю как "МЕДЛЕННУЮ работу с периферией",

если действительно интересно :) !

300МГц АРМ процессор, если интересно.

Изменено пользователем ruhi

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Только что, ruhi сказал:

больше 2Мегабайт в секунду

Но это явно не из оперы AVR... :) 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, ARV сказал:

Но это явно не из оперы AVR...

Написано же - АРМ, 32 бита, хотя какая разница? Он тоже Атмел(бывший) SAME70 - серия, на отладочной плате с ладошку, со светодиодами, с USB программатором, с Атмел студией ...

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

Разница большая. AVR это принципиально не под силу, а для ARM, пожалуй, даже и не много...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

3 минуты назад, ARV сказал:

AVR это принципиально не под силу

дело не в типе процессора, а в тактовой частоте, если появится AVR 300МегаГерцный, ему тоже будет под силу.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, ruhi сказал:

ему тоже будет под силу.

Не получится, он не умеет непрерывно лить по SPI. На счет Atmel не знаю, но STM могут лить данные непрерывным потоком даже без DMA, а вот у AVR будут разрывы в момент прогрузки очередного байта.

Ссылка на комментарий
Поделиться на другие сайты

Только что, BARS_ сказал:

у AVR будут разрывы в момент прогрузки очередного байта

Вроде как у самых последних реинкарнаций уже нет, но это не точно. Вроде там Микрочип сдлал систему событий - местами она почти как DMA...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

4 минуты назад, BARS_ сказал:

На счет Atmel не знаю,

вообще то AVR это тоже Атмел. Мне казалось что SPI периферийный узел у них (у Атмела) один и тот же во всех процессорах, с точки зрения регистровой модели. Но я могу конечно ошибаться по прошествии времени.

буферизация одного байта на отправку там вроде всегда была предусмотрена.

Можно сделать все! Но чем больше можно, тем больше нельзя!

Ссылка на комментарий
Поделиться на другие сайты

58 минут назад, ARV сказал:

Интересно, кому-то хоть раз требовалось реализовать МЕДЛЕННУЮ работу с периферией?

SPI - нет, I2C - да. Но там тупо частоту МК понижал.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...