Пито
Пт, 07 октября 2016 г., 17:45
Лоргажер SDCARD с FIFO и FIR -фильтром (Freertos) для Maple Mini или Blue Pills
====
Как обсуждалось на этом форуме, написание непрерывного потока данных в SDCard сложно.
Не из -за скорости написания SDCARD, а из -за Напишите задержки (до 250 мс).
Во время WL SDCARD не реагирует на входящие данные, это означает, что когда данные не буферируются, данные теряются.
Вы должны преодолеть отключения WL (случайное происхождение, частая, случайная продолжительность) каким -то образом, вот пример с «буферизацией FIFO».
Подробнее об этой проблеме WL, который вы можете найти здесь:
http: // www.STM32duino.com/viewtopic.PHP ... 288#P18207
Ниже вы можете найти полную демонстрацию, которую я написал для Maplemini, и SDCARD, подключенный к SPI1:
1. Мы обратите внимание на 8ADC, 200 раз в секунду,
2. Применяем фильтр с низким проходом 30 Гц на каждый измерение канала ADC,
3. Мы записываем данные в буфер FIFO,
4. параллельно Мы читаем данные из FIFO и записываем данные на SDCARD настолько быстро, насколько мы можем,
5. Формат, который мы пишем данные на SDCARD, - это CSV, так что вы можете проанализировать, что происходит в Excel,
6. Мы также регистрируем информацию о статусах FIFO (значения счета семафоров).
Примечание:
1. В этой демонстрации мы читаем каналы 8ADC в качестве примера, но некоторые каналы ADC читают сигналы SPI1,
Как вы можете увидеть в результатах в файле CSV,
2. Вы можете играть с размером FIFO в записях (здесь по умолчанию 150), фактическим содержанием образца записи и с
Период выборки/скорость (по умолчанию 5 мс = 200 Гц) Такое все вписывается в память Maplemini (мы предполагаем, что вы получили 20 КБ ОЗУ)
И вы не получаете переполнены FIFO, когда попадает в WL,
3. Я пытался прокомментировать код как разрешенное время,
4. При условии, как есть, никаких гарантий каких-либо видов,
5. Используйте свой собственный риск.
Наслаждайтесь журналом,
Пито
====
Как обсуждалось на этом форуме, написание непрерывного потока данных в SDCard сложно.
Не из -за скорости написания SDCARD, а из -за Напишите задержки (до 250 мс).
Во время WL SDCARD не реагирует на входящие данные, это означает, что когда данные не буферируются, данные теряются.
Вы должны преодолеть отключения WL (случайное происхождение, частая, случайная продолжительность) каким -то образом, вот пример с «буферизацией FIFO».
Подробнее об этой проблеме WL, который вы можете найти здесь:
http: // www.STM32duino.com/viewtopic.PHP ... 288#P18207
Ниже вы можете найти полную демонстрацию, которую я написал для Maplemini, и SDCARD, подключенный к SPI1:
1. Мы обратите внимание на 8ADC, 200 раз в секунду,
2. Применяем фильтр с низким проходом 30 Гц на каждый измерение канала ADC,
3. Мы записываем данные в буфер FIFO,
4. параллельно Мы читаем данные из FIFO и записываем данные на SDCARD настолько быстро, насколько мы можем,
5. Формат, который мы пишем данные на SDCARD, - это CSV, так что вы можете проанализировать, что происходит в Excel,
6. Мы также регистрируем информацию о статусах FIFO (значения счета семафоров).
Примечание:
1. В этой демонстрации мы читаем каналы 8ADC в качестве примера, но некоторые каналы ADC читают сигналы SPI1,
Как вы можете увидеть в результатах в файле CSV,
2. Вы можете играть с размером FIFO в записях (здесь по умолчанию 150), фактическим содержанием образца записи и с
Период выборки/скорость (по умолчанию 5 мс = 200 Гц) Такое все вписывается в память Maplemini (мы предполагаем, что вы получили 20 КБ ОЗУ)
И вы не получаете переполнены FIFO, когда попадает в WL,
3. Я пытался прокомментировать код как разрешенное время,
4. При условии, как есть, никаких гарантий каких-либо видов,
5. Используйте свой собственный риск.
Наслаждайтесь журналом,
Пито
Сэндрин
Солнце 23 октября 2016 г., 17:12
Потрясающая работа! Я имею в виду, что .Ино выложен таким образом, чтобы это было понятно.
Как вы, кажется, знаете систему, у меня есть буфер с 16 мега-словесными, который можно рассматривать как FIFO. Будет ли эта работа или SD -карта, которая собирается выйти на следование до этого? Вы упомянули 20K, вы пробовали сбросить так много? Просто пытаюсь понять размеры буфера
Как вы, кажется, знаете систему, у меня есть буфер с 16 мега-словесными, который можно рассматривать как FIFO. Будет ли эта работа или SD -карта, которая собирается выйти на следование до этого? Вы упомянули 20K, вы пробовали сбросить так много? Просто пытаюсь понять размеры буфера
Пито
Пт 28 октября 2016 г. 12:43
Размер буфера FIFO:
====
Fifo_size = data_rate * max_expected_sdcard_write_latency
Пример:
====
Вы образуете 100bytes 500x в секунду.
data_rate = 100 x 500 = 50 кб/с (это скорость, которую вы хотите записать данные в SDCARD).
max_expected_sdcard_write_latency = 250msec
Fifo_size = 50 кб/сек * 0.25 секунды = 12.5 КБ
Будет ли эта работа или SD -карта, которая собирается выйти на следование до этого? Вы упомянули 20K, вы пробовали сбросить так много? Просто пытаюсь понять размеры буфера Помните о написании данных в FIFO, а для SDCARD выполняются «параллельно» - поэтому не имеет значения, как FIFO большой (при условии, что он был разработан достаточно большим для данной цели)
Вы не «сбрасываете» FIFO за один выстрел - это непрерывный процесс, который проводится параллельно - вы подталкиваете данные в FIFO и данные от FIFO в SDCARD в то же самое время.. Посмотрите на Fifofree и Fifodata в полученном .Файл CSV - Когда происходит WL, FifOfree начинает уменьшаться, а Fifodata увеличивается (образец за образцом) - После окончания WL процесс переходит на себя..
Попробуйте пример/Sketch Source выше - он использует почти все доступные оперативные операции. Также не обращайте внимания на эскиз, он использует размер FIFO 150 «Записи данных», где запись состоит из многих элементов, и записывает элементы в качестве читаемого_текса в .Файл CSV - Таким образом, DataRate - это количество текстовых чар (включительно запятые, пространства, \ r \ n) плюс другая дополнительная информация, записанная на SDCard в секунду..
Также прочитайте эту тему: http: // www.STM32duino.com/viewtopic.PHP ... 288#P18207
====
Fifo_size = data_rate * max_expected_sdcard_write_latency
Пример:
====
Вы образуете 100bytes 500x в секунду.
data_rate = 100 x 500 = 50 кб/с (это скорость, которую вы хотите записать данные в SDCARD).
max_expected_sdcard_write_latency = 250msec
Fifo_size = 50 кб/сек * 0.25 секунды = 12.5 КБ
Будет ли эта работа или SD -карта, которая собирается выйти на следование до этого? Вы упомянули 20K, вы пробовали сбросить так много? Просто пытаюсь понять размеры буфера Помните о написании данных в FIFO, а для SDCARD выполняются «параллельно» - поэтому не имеет значения, как FIFO большой (при условии, что он был разработан достаточно большим для данной цели)
Вы не «сбрасываете» FIFO за один выстрел - это непрерывный процесс, который проводится параллельно - вы подталкиваете данные в FIFO и данные от FIFO в SDCARD в то же самое время.. Посмотрите на Fifofree и Fifodata в полученном .Файл CSV - Когда происходит WL, FifOfree начинает уменьшаться, а Fifodata увеличивается (образец за образцом) - После окончания WL процесс переходит на себя..
Попробуйте пример/Sketch Source выше - он использует почти все доступные оперативные операции. Также не обращайте внимания на эскиз, он использует размер FIFO 150 «Записи данных», где запись состоит из многих элементов, и записывает элементы в качестве читаемого_текса в .Файл CSV - Таким образом, DataRate - это количество текстовых чар (включительно запятые, пространства, \ r \ n) плюс другая дополнительная информация, записанная на SDCard в секунду..
Также прочитайте эту тему: http: // www.STM32duino.com/viewtopic.PHP ... 288#P18207
Сэндрин
Вторник 01 ноября 2016 г. 2:21
Спасибо за ваш ответ,
Что я действительно имел в виду, так это то, сколько может быть один материал в буферах SD -карт, прежде чем это WL должно произойти?
Я могу переписать для большого внешнего FIFO, но должен знать, полезно ли это или нет. Мне нужно сбросить около 2 м/секунду
-РЕДАКТИРОВАТЬ- ОК, я только что увидел в другой ветке, которую вы упомянули >2megs / wl, так что я думаю, стоит преследовать
Таким образом, с очень большим буфером RAM / FIFO, непрерывные потоки при 500 тыс. / S могут быть легко реализованы путем потоковой передачи в
SD-карта, скажем, 750 тыс./S, так что максимальное максимальное время 250 мс никогда не будет проблемой.
Спасибо!!
..Но должен быть ограничение на объем данных, которые может удерживать SD -карта, перед передачей его в флэш -ячейках...
Что я действительно имел в виду, так это то, сколько может быть один материал в буферах SD -карт, прежде чем это WL должно произойти?
Я могу переписать для большого внешнего FIFO, но должен знать, полезно ли это или нет. Мне нужно сбросить около 2 м/секунду
-РЕДАКТИРОВАТЬ- ОК, я только что увидел в другой ветке, которую вы упомянули >2megs / wl, так что я думаю, стоит преследовать
Таким образом, с очень большим буфером RAM / FIFO, непрерывные потоки при 500 тыс. / S могут быть легко реализованы путем потоковой передачи в
SD-карта, скажем, 750 тыс./S, так что максимальное максимальное время 250 мс никогда не будет проблемой.
Спасибо!!
..Но должен быть ограничение на объем данных, которые может удерживать SD -карта, перед передачей его в флэш -ячейках...
Пито
Вторник 01 ноября 2016 г., 14:51
..1) ..Сколько может быть один материал в буферах SD -карт до того, как должен произойти WL?
-РЕДАКТИРОВАТЬ- ОК, я только что увидел в другой ветке, которую вы упомянули >2megs / wl, так что я думаю, стоит преследовать
2) Таким образом, с очень большим буфером RAM / FIFO, непрерывные потоки при 500 тыс. / S могут быть легко реализованы путем потоковой передачи в
SD-карта, скажем, 750 тыс./S, так что максимальное максимальное время 250 мс никогда не будет проблемой.
3)..Но должен быть ограничение на объем данных, которые может удерживать SD -карта, перед передачей его в флэш -ячейках... 1) Не знаю, это зависит от фактической SD -карты, WL - «случайный» эффект..
2) Скорость потоковой передачи данных MAX зависит от производительности MCU, типа SDCARD, параметров интерфейса SDCARD - т.е. SPI Clock FREQ., Тип интерфейса - SPI или SDIO и т. Д.
3) Это зависит от фактической SDCard - HW карты отличается, прошивка отличается, так что трудно ответить..
Лучший способ - экспериментировать и измерить..
-РЕДАКТИРОВАТЬ- ОК, я только что увидел в другой ветке, которую вы упомянули >2megs / wl, так что я думаю, стоит преследовать
2) Таким образом, с очень большим буфером RAM / FIFO, непрерывные потоки при 500 тыс. / S могут быть легко реализованы путем потоковой передачи в
SD-карта, скажем, 750 тыс./S, так что максимальное максимальное время 250 мс никогда не будет проблемой.
3)..Но должен быть ограничение на объем данных, которые может удерживать SD -карта, перед передачей его в флэш -ячейках... 1) Не знаю, это зависит от фактической SD -карты, WL - «случайный» эффект..
2) Скорость потоковой передачи данных MAX зависит от производительности MCU, типа SDCARD, параметров интерфейса SDCARD - т.е. SPI Clock FREQ., Тип интерфейса - SPI или SDIO и т. Д.
3) Это зависит от фактической SDCard - HW карты отличается, прошивка отличается, так что трудно ответить..
Лучший способ - экспериментировать и измерить..
Сэндрин
Вторник 01 ноября 2016 г., 16:23
Большое спасибо, пито, ты очень помог!
WL is случайный, теперь имеет смысл, угадайте, что он направлен на научные эксперименты
Ваше здоровье,
Сэнди
WL is случайный, теперь имеет смысл, угадайте, что он направлен на научные эксперименты
Ваше здоровье,
Сэнди
michael_l
Ср. 09 ноября 2016 г., 10:30
Пито, вы можете предложить немного хорошего, но не слишком дорогого адаптера SD -карты с eBay для использования с Bluepill ? У меня есть несколько дисплеев SPI ILI9341 с держателем SD -карты. Они в порядке ?
РЕДАКТИРОВАТЬ: Нашел один с буфериальным чипом:
http: // www.eBay.сопутствующий.Великобритания/ITM/Micro-SD-Stor ... 1033157413
РЕДАКТИРОВАТЬ: Нашел один с буфериальным чипом:
http: // www.eBay.сопутствующий.Великобритания/ITM/Micro-SD-Stor ... 1033157413
Пито
Ср. 09 ноября 2016 г. 13:38
При использовании SDCARD с MAPlemini или BluePill Избегайте щитов/плат SDDCARD с переключателями уровня, переводчиками напряжения, буферами/драйверами, резисторами в сигнальных путях.
Вся установка должна быть 3.3v прямо.. Единственное, что важно, это то, что SDCards 3.3V, поэтому необходим регулятор напряжения, когда SDCARD питается от 5V, а хорошая развязка (между VCC3V3 и GND) вблизи SDCARD (т.е. 2x 10-222-UF Ceramic Multylayer).
Вся установка должна быть 3.3v прямо.. Единственное, что важно, это то, что SDCards 3.3V, поэтому необходим регулятор напряжения, когда SDCARD питается от 5V, а хорошая развязка (между VCC3V3 и GND) вблизи SDCARD (т.е. 2x 10-222-UF Ceramic Multylayer).
michael_l
Пн 13 февраля 2017 г. 14:29
Это самое близкое, что я мог бы найти на основе вашей рекомендации. Кажется, у многих есть регулятор LDO. Это нет, но у него все еще есть резисторы. Вы можете это порекомендовать ? Спасибо.
http: // www.eBay.сопутствующий.UK/ITM/LC-Technology ... Oswarzxoem~
http: // www.eBay.сопутствующий.UK/ITM/LC-Technology ... Oswarzxoem~
Беннебой
Пн 13 февраля 2017 г. 14:47
Одним из будущих требований проекта, над которым я работаю, будет то, чтобы сдавать данные в SD на постоянной основе, частота выборки будет намного ниже, чем это, примерно один раз каждые 250 мс, поэтому в реальных терминах я мог бы написать 4 раза столько данных один раз в секунду, если накладные расходы на запись/SD были высокими.
Будет максимум 20 показаний для вывода.
Итак, вопрос, я, вероятно, на меня повлияет на это или мой выходной объем «под порогом»?
Будет максимум 20 показаний для вывода.
Итак, вопрос, я, вероятно, на меня повлияет на это или мой выходной объем «под порогом»?
victor_pv
Пн 13 февраля 2017 г. 15:20
michael_l написал:Это самое близкое, что я мог бы найти на основе вашей рекомендации. Кажется, у многих есть регулятор LDO. Это нет, но у него все еще есть резисторы. Вы можете это порекомендовать ? Спасибо.
http: // www.eBay.сопутствующий.UK/ITM/LC-Technology ... Oswarzxoem~
http: // www.eBay.сопутствующий.UK/ITM/LC-Technology ... Oswarzxoem~
Стивестронг
Пн 13 февраля 2017 г. 15:23
michael_l написал: Вы можете это порекомендовать ? http: // www.eBay.сопутствующий.UK/ITM/LC-Technology ... Oswarzxoem~
Пито
Вт 14 февраля 2017 г. 12:08
victor_pv написал:michael_l написал:Это самое близкое, что я мог бы найти на основе вашей рекомендации. Кажется, у многих есть регулятор LDO. Это нет, но у него все еще есть резисторы. Вы можете это порекомендовать ? Спасибо.
http: // www.eBay.сопутствующий.UK/ITM/LC-Technology ... Oswarzxoem~
http: // www.eBay.сопутствующий.UK/ITM/LC-Technology ... Oswarzxoem~
Пито
Вт 14 февраля 2017 г. 12:21
Bennehboy написал:Итак, вопрос, я, вероятно, на меня повлияет на это или мой выходной объем «под порогом»?
michael_l
Сб 11 марта 2017 г., 17:21
Спасибо, ребята, был слишком занят другими задачами, но теперь получил изменение, чтобы попробовать это. Когда я вставляю автомобили, сбрасывается Blue Board - это нормально и что вызывает это ?
Пито
Солнце 12 марта 2017 г. 8:42
Это не нормально, когда вы вставляете SDCARD, и BP сбрасывает.
Двойная проверка проводки. Модуль SDCARD нужно 3.3В.
Двойная проверка проводки. Модуль SDCARD нужно 3.3В.
ZMEMW16
Солнце 12 марта 2017 г. 14:27
Переключатель обнаружения карты скрещен с Линия сброса ?
Незначительное редактирование
Незначительное редактирование
Пито
Солнце 12 марта 2017 г. 18:07
Также проверьте с OhMmeter возможные шорты между булавками SDCARD (все комбинации). Сокет отключен от BP во время измерения..
Шериннкпотеин
SAT 08 апреля 2017 12:16
Быстрый вопрос о фундаментальном функционировании RTOS -версии журнала SD SD.
Я работаю над Arduinos уже несколько месяцев, и как я понимаю, что библиотека SD работает, создает буфер 512B, и каждый запрос на написание на SD выдвигается в буфер. Буфер наконец -то записан на SD -карте, когда он ближе к полному. Поэтому, когда я вычисляю время, необходимое для написания данных на SD-карту в петле байта за раз, я получаю как несколько десятков микросексов для большинства транзакций и одну нечетную запись в диапазоне 5-200 мс (или, может быть, иногда).
Когда мы используем реализацию RTOS? Если да, то кто бы уточнит в данной ситуации
-Поток продюсера производит 1b каждый MS, и это должно быть записано на SD -карту.
-Тема потребителей просто пишет на SD -карту.
Производитель, будучи более высоким приоритетом, разбудится каждый MS, и задача, которую она выполняет. Поэтому, когда буфер библиотеки SD заполняется и пришло время на самом деле написать на SD -карту. ЦП делает запрос на доступ к записи на SD -карту, и из -за задержки, связанных с порядком нескольких MS, запрос прерывается между ними, а процессор переключается на потоку продюсера, которая записывается в FIFO, как обычно. После выполнения своей задачи производитель снова спит, и запрос, генерируемый потребительским потоком, который был прерван между ранее, снова инициируется, что приводит к созданию аналогичных задержек записи, как и раньше. По этой логике успешная запись никогда не может произойти, но, поскольку она это делает, я знаю, что мое понимание его функционирования недоступно.
Мне нужно понять это, чтобы я мог соответствующим образом структурировать свой код. заранее спасибо. Я знаю, что мои объяснительные (если это слово) навыки - это беспорядок.
Я работаю над Arduinos уже несколько месяцев, и как я понимаю, что библиотека SD работает, создает буфер 512B, и каждый запрос на написание на SD выдвигается в буфер. Буфер наконец -то записан на SD -карте, когда он ближе к полному. Поэтому, когда я вычисляю время, необходимое для написания данных на SD-карту в петле байта за раз, я получаю как несколько десятков микросексов для большинства транзакций и одну нечетную запись в диапазоне 5-200 мс (или, может быть, иногда).
Когда мы используем реализацию RTOS? Если да, то кто бы уточнит в данной ситуации
-Поток продюсера производит 1b каждый MS, и это должно быть записано на SD -карту.
-Тема потребителей просто пишет на SD -карту.
Производитель, будучи более высоким приоритетом, разбудится каждый MS, и задача, которую она выполняет. Поэтому, когда буфер библиотеки SD заполняется и пришло время на самом деле написать на SD -карту. ЦП делает запрос на доступ к записи на SD -карту, и из -за задержки, связанных с порядком нескольких MS, запрос прерывается между ними, а процессор переключается на потоку продюсера, которая записывается в FIFO, как обычно. После выполнения своей задачи производитель снова спит, и запрос, генерируемый потребительским потоком, который был прерван между ранее, снова инициируется, что приводит к созданию аналогичных задержек записи, как и раньше. По этой логике успешная запись никогда не может произойти, но, поскольку она это делает, я знаю, что мое понимание его функционирования недоступно.
Мне нужно понять это, чтобы я мог соответствующим образом структурировать свой код. заранее спасибо. Я знаю, что мои объяснительные (если это слово) навыки - это беспорядок.
victor_pv
Солнце 09 апреля 2017 г. 1:53
Когда поток возобновлен, он не перезагружается, он возобновляется с точки зрения, в которой он был прерван.
Таким образом, у вас есть ветка вашего писателя, ожидая, когда SDCARD ответит на команду, но SDCARD занята, делая то, что делает SDCARD, и потребуется 50 мс, чтобы ответить. В этом случае поток писателя должен быть в петле, ожидая правильного ответа правильно?
В то время как в этом цикле планировщик прерывает его и возобновляет другой поток (поток датчика Call It), который требует 500us, а затем засыпает на 100 мс. Когда нить датчика ложится спать, планировщик смотрит, что является следующим активным потоком для запуска. Тема писателя не спала, она ждала в петле и была прервана, поэтому, когда возобновилось, возвращается к тому же циклу и продолжает ждать правильного ответа с SD -карты.
Эту поток можно прервать и возобновить много раз, находясь в цикле, но в конечном итоге SDCARD отвечает назад, и ветка писателя продолжается с процессом письма.
Это проясняет это?
Таким образом, у вас есть ветка вашего писателя, ожидая, когда SDCARD ответит на команду, но SDCARD занята, делая то, что делает SDCARD, и потребуется 50 мс, чтобы ответить. В этом случае поток писателя должен быть в петле, ожидая правильного ответа правильно?
В то время как в этом цикле планировщик прерывает его и возобновляет другой поток (поток датчика Call It), который требует 500us, а затем засыпает на 100 мс. Когда нить датчика ложится спать, планировщик смотрит, что является следующим активным потоком для запуска. Тема писателя не спала, она ждала в петле и была прервана, поэтому, когда возобновилось, возвращается к тому же циклу и продолжает ждать правильного ответа с SD -карты.
Эту поток можно прервать и возобновить много раз, находясь в цикле, но в конечном итоге SDCARD отвечает назад, и ветка писателя продолжается с процессом письма.
Это проясняет это?
Шериннкпотеин
Солнце 09 апреля 2017 3:11
victor_pv написал:Когда поток возобновлен, он не перезагружается, он возобновляется с точки зрения, в которой он был прерван.
Пито
Солнце 09 апреля 2017 г. 9:43
Размер задержки SDCARD оценивается не RTOS, а вами во время компиляции..
Представьте себе худшую задержку корпуса 250 мс. И вы хотите написать (задачу датчика) 10 кб/с на карту (теперь она не имеет значения во время задач).
Таким образом, буфер FIFO должен быть 0.25 секунд * 10 кб/с = 2.5 КБ.
При предположении написания в SDCard много Быстро, как скорость написания задачи датчика в буфер FIFO, она не будет переполнена в течение 250 мс.
Время: как написал Виктор, это предварительный многозадачный, поэтому считыватель датчика будет писать с интервалами 1 мс, скажем, 3Bytes (3 кб/с) в буфере FIFO.
«Параллельно» (то есть трюк RTOS), который писатель SDCARD пытается написать на SDCARD с полной скорости буфера FIFO (то есть 1 МБ/сек), когда FIFO не пуст. В то время как FIFO заполняется с левой стороны на скорости 3 кб/секунды, он впадает из правой стороны на скорости 1 МБ/с, все параллельно, иногда блокируется с правой стороны задержкой записи.
Обычно FIFO будет все время пустым. Когда наступает задержка записи, FIFO начинает заполняться (как бутылка). Размер FIFO будет достаточно для запланированной задержки. Когда задержка заканчивается, писатель SDCARD продирает FIFO на полную скорость SDCARD (1 МБ/с).
Когда вы запускаете мой пример выше, играйте с ним и соблюдайте .Данные CSV, вы бы увидели, как это работает подробно.
Переключение:
Мое текущее понимание таково, что переключатель, когда выполняет задачу «датчика» (скажем, на 300US с начала тика 1M.
Это случается на 301 -й микросекунде с начала тика 1 мс в качестве примера.
Задача датчика планируется работать с интервалами 1 мс (период выборки в клещах), но SDWriter «всегда» готов продолжить с написанием данных с FIFO на SDCARD (когда FIFO не пусто)..
Таким образом, SDWriter не ждет до тех пор, пока следующий xth 1M..
Когда вы запланировали несколько задач, которые будут начаты и запустить на Xth Tick, планировщик пытается запустить все запланированные задачи на Xth Tick (в последовательности круглой робин, когда задачи с тем же приоритетом). Когда скажем, все 3 задачи закончатся в 820us с самого начала Xth, SDWriter будет сразу же продолжить с написанием на SDCARD с 821 -й микросекунды..
Представьте себе худшую задержку корпуса 250 мс. И вы хотите написать (задачу датчика) 10 кб/с на карту (теперь она не имеет значения во время задач).
Таким образом, буфер FIFO должен быть 0.25 секунд * 10 кб/с = 2.5 КБ.
При предположении написания в SDCard много Быстро, как скорость написания задачи датчика в буфер FIFO, она не будет переполнена в течение 250 мс.
Время: как написал Виктор, это предварительный многозадачный, поэтому считыватель датчика будет писать с интервалами 1 мс, скажем, 3Bytes (3 кб/с) в буфере FIFO.
«Параллельно» (то есть трюк RTOS), который писатель SDCARD пытается написать на SDCARD с полной скорости буфера FIFO (то есть 1 МБ/сек), когда FIFO не пуст. В то время как FIFO заполняется с левой стороны на скорости 3 кб/секунды, он впадает из правой стороны на скорости 1 МБ/с, все параллельно, иногда блокируется с правой стороны задержкой записи.
Обычно FIFO будет все время пустым. Когда наступает задержка записи, FIFO начинает заполняться (как бутылка). Размер FIFO будет достаточно для запланированной задержки. Когда задержка заканчивается, писатель SDCARD продирает FIFO на полную скорость SDCARD (1 МБ/с).
Когда вы запускаете мой пример выше, играйте с ним и соблюдайте .Данные CSV, вы бы увидели, как это работает подробно.
Переключение:
Мое текущее понимание таково, что переключатель, когда выполняет задачу «датчика» (скажем, на 300US с начала тика 1M.
Это случается на 301 -й микросекунде с начала тика 1 мс в качестве примера.
Задача датчика планируется работать с интервалами 1 мс (период выборки в клещах), но SDWriter «всегда» готов продолжить с написанием данных с FIFO на SDCARD (когда FIFO не пусто)..
Таким образом, SDWriter не ждет до тех пор, пока следующий xth 1M..
Когда вы запланировали несколько задач, которые будут начаты и запустить на Xth Tick, планировщик пытается запустить все запланированные задачи на Xth Tick (в последовательности круглой робин, когда задачи с тем же приоритетом). Когда скажем, все 3 задачи закончатся в 820us с самого начала Xth, SDWriter будет сразу же продолжить с написанием на SDCARD с 821 -й микросекунды..
- Планирование.JPG (43.49 киб) просмотрено 783 раза
Шериннкпотеин
Солнце 09 апреля 2017 13:52
Большое спасибо за подробный ответ. Тем не менее, мне нужно подтвердить то, что я сейчас понимаю, верно.
1) Предположим, что, как на рисунке, SD записать задачу Запрос доступа к записи в клеке, соответствующем t = 0 и сталкивается с задержкой (предполагают 250 мс). Поэтому до 250 -го тика каждый раз, планировщик переключается на SD записать задачу , Задача только ждет, когда будет обслуживаться запрос?
2) Итак, что происходит, когда Датчик задача берет, скажем, 800US для завершения, и задача SD остается только 200US до того, как произойдет преодоление.
В этом случае, поскольку фактическая запись составляет 512b (это размер кэша, как определено, я верю в »Фасолют.час"; не буфер FIFO, объявленный пользователем во время компиляции) и может занять 1.6 мс @ 300 кбит / с (минус задержка). Таким образом, что задача по написанию (когда на самом деле написано на карту) прерывается (так как у нее есть только срез времени на 200 до 200 лет), и она завершит транзакцию в 8 таких клещах (1.6 мс / 200us).
1) Предположим, что, как на рисунке, SD записать задачу Запрос доступа к записи в клеке, соответствующем t = 0 и сталкивается с задержкой (предполагают 250 мс). Поэтому до 250 -го тика каждый раз, планировщик переключается на SD записать задачу , Задача только ждет, когда будет обслуживаться запрос?
2) Итак, что происходит, когда Датчик задача берет, скажем, 800US для завершения, и задача SD остается только 200US до того, как произойдет преодоление.
В этом случае, поскольку фактическая запись составляет 512b (это размер кэша, как определено, я верю в »Фасолют.час"; не буфер FIFO, объявленный пользователем во время компиляции) и может занять 1.6 мс @ 300 кбит / с (минус задержка). Таким образом, что задача по написанию (когда на самом деле написано на карту) прерывается (так как у нее есть только срез времени на 200 до 200 лет), и она завершит транзакцию в 8 таких клещах (1.6 мс / 200us).
- форум.JPG (53.18 киб) просмотрено 771 раз
Пито
Солнце 09 апреля 2017 14:27
Во -первых, написание в SDCARD (я использую библиотеку SDFAT) работает через DMA, AFIK. Во -вторых, чтобы написать кэш 512B в SDCARD занимает около 285us в SPI 18 МГц (однако, это делается на фоне).
Мой пример регистрации, приведенный выше регистрации.
Конечно, вы можете получить переполнение FIFO, когда время имеет решающее значение, и у вас недостаточно буферного пространства FIFO. Когда FIFO не может быть опустошен быстро, вы получаете переполнения (они также зарегистрированы вместе с водяным знаком FIFO при каждом измерении образца), и некоторое количество ваших данных теряется до тех пор, пока он не восстановится.
Просто попробуйте и сообщите
Пример журналов с каждым измерением образца:
Мой пример регистрации, приведенный выше регистрации.
Конечно, вы можете получить переполнение FIFO, когда время имеет решающее значение, и у вас недостаточно буферного пространства FIFO. Когда FIFO не может быть опустошен быстро, вы получаете переполнения (они также зарегистрированы вместе с водяным знаком FIFO при каждом измерении образца), и некоторое количество ваших данных теряется до тех пор, пока он не восстановится.
Просто попробуйте и сообщите
Пример журналов с каждым измерением образца:
void setup() {
// initialise serial
Serial.begin(115200);
//this makes a 73K sketch
//byte *buf;
//buf = new byte [64];
//this makes a 12K sketch
byte buf[64];
}
void loop()
{
Serial.println("Running...");
delayMicroseconds(1000000);
}
Шериннкпотеин
Солнце 09 апреля 2017 г., 16:32
Пито написал:Во -первых, написание в SDCARD (я использую библиотеку SDFAT) работает через DMA, AFIK.
Пито
Солнце 09 апреля 2017 г., 17:45
Ах, это много разъясняет, если DMA вступает в игру. Я все еще застрял с 8 -битным AVR Modus operandi. В этом случае должна возникнуть проблема, если и потоки потребителя и производителя используют разные устройства SPI (скажем, NRF24L01 и SD -карта).
Если две задачи используют один и тот же ресурс (то есть SPI1), вы должны использовать мутекс для блокировки ресурса при использовании.
Если производитель использует SPI1 и потребителя, SPI2, нет проблем.
К вашему сведению - SPI1 работает до 36 МГц (база 72 МГц). И чертеж работает до 128 МГц разгоночным. Так что забудьте 8 -бит
Если производитель использует SPI1 и потребителя, SPI2, нет проблем.
К вашему сведению - SPI1 работает до 36 МГц (база 72 МГц). И чертеж работает до 128 МГц разгоночным. Так что забудьте 8 -бит
Шериннкпотеин
Солнце 09 апреля 2017 18:07
Если производитель использует SPI1 и потребителя, SPI2, нет проблем.
Как я пропустил несколько портов SPI на таблетках. Я внезапно начинаю чувствовать себя самым богатым человеком живым!!! Думаю, мне потребуется некоторое время, чтобы привыкнуть к богатству... Будешь тяжело пытаться немного поспать сегодня вечером из волнения!!!
Надеюсь, что библиотечная база STM32Duino скоро достигнет уровня подростков. Это будет конец эпохи AVR, как мы знаем.
Надеюсь, что библиотечная база STM32Duino скоро достигнет уровня подростков. Это будет конец эпохи AVR, как мы знаем.
Пито
Вт 11 апреля 2017 г. 15:07
Прилагаемый, пожалуйста "Базовый" Версия моего демо -версии "SDCARD с FIFO" (оригинал в моем первом посте здесь).
По умолчанию:
. Период выборки набор 1 мс
. Записывает около 20 бит на выборку (запись) в данные.Файл CSV (Time [US], ADC1, перерасход, Fifofree, Fifodata)
. Нет FIR -фильтра на ADC
. Использует 400 записей Deep Fifo
Здесь он работает без переполнений с помощью основной SDCARD. Ниже приведена Fifodata от Excel, указывающая на 3 задержки, которые заняли до 190 записей в FIFO. Джиттер, который вы можете увидеть из зарегистрированных данных, время от времени составляет 1-2USEC (но 0 большую часть времени).
Скомпилировано для Maple Mini, для BluePill или других вы должны отрегулировать контакты светодиодов и SDCARD /CS.
По умолчанию:
. Период выборки набор 1 мс
. Записывает около 20 бит на выборку (запись) в данные.Файл CSV (Time [US], ADC1, перерасход, Fifofree, Fifodata)
. Нет FIR -фильтра на ADC
. Использует 400 записей Deep Fifo
Здесь он работает без переполнений с помощью основной SDCARD. Ниже приведена Fifodata от Excel, указывающая на 3 задержки, которые заняли до 190 записей в FIFO. Джиттер, который вы можете увидеть из зарегистрированных данных, время от времени составляет 1-2USEC (но 0 большую часть времени).
Скомпилировано для Maple Mini, для BluePill или других вы должны отрегулировать контакты светодиодов и SDCARD /CS.
- FIFO данные.JPG (36.65 киб) просмотрено 724 раза
Шериннкпотеин
Вт 11 апреля 2017 г., 21:38
Это звучит многообещающе. Вернутся с моей реализацией кода вместе с RF Thingy.
Большое спасибо!!
Большое спасибо!!
Шериннкпотеин
Ср 12 апреля 2017 г. 8:45 вечера
Только что попробовал свой код на моей синей таблетке, но, похоже, не работает. Скрипт загружается нормально, но никакой активности вообще нет. Я даже пытался разместить сообщение отладки сразу после сериала.начать (), но тщетно. Пример Blink в Maplefreertos, однако, работает нормально.
Любые предложения?
Спасибо
Любые предложения?
Спасибо
Пито
Ср 12 апреля 2017 г. 22:49
Вы используете Serial1 (внешний ключ)??
Если нет, вы должны переименовать Serial1 в сериал (USB) везде в источнике.
Если нет, вы должны переименовать Serial1 в сериал (USB) везде в источнике.
char* pvalue = NULL; // Pointer initialized with null
pvalue = new char[20]; // Request memory for the variable
Шериннкпотеин
Чт 13 апреля 2017 г. 10:38
Пито написал:Если нет, вы должны переименовать Serial1 в сериал (USB) везде в источнике.
Пито
Чт 13 апреля 2017 г. 11:28
Рад видеть, что кто -то еще задержки
На основе результатов, которые вы можете сыграть с размером FIFO. Уменьшите большую задержку может достичь более длительного периода захвата.
На основе результатов, которые вы можете сыграть с размером FIFO. Уменьшите большую задержку может достичь более длительного периода захвата.
Пито
Пт 14 апреля 2017 г. 15:25
Чтобы ускорить печать в .Файл CSV (особенно с частотой выборки 1 мс) вы можете попытаться использовать специальный SDFAT Special printfield () функция, которая претендует на гораздо быстрее, чем print (), например:
void setup() {
byte* a = new byte[1]; // 18330 bytes flash, 3928 bytes RAM
// byte* a = (byte*)malloc(1); // 15276 bytes flash, 2824 bytes RAM
// static byte a[1]; // 15276 bytes flash, 2824 bytes RAM
}
Пито
Пт 14 апреля 2017 г. 16:28
К вашему сведению: 43 МБ большой журнал, 1 мс выборки (со временем, ADC0, ADC1, ADC2, ошибки, элементы Fifodata, записанные на SDCARD как .текст CSV).
FIFO размер 400 записей. Нет данных.
Вы можете увидеть, как FIFO переживает критическое время (кажется, что выборка в 1 мс с вышеупомянутым количеством данных находится на грани возможности системы обрабатывать данные) и задержки записи SDCARD (только первый 1.Образцы 048 млн, показанные по очевидной причине):
FIFO размер 400 записей. Нет данных.
Вы можете увидеть, как FIFO переживает критическое время (кажется, что выборка в 1 мс с вышеупомянутым количеством данных находится на грани возможности системы обрабатывать данные) и задержки записи SDCARD (только первый 1.Образцы 048 млн, показанные по очевидной причине):
- Log 1ms 1mil.JPG (71.08 киб) просмотрено 612 раз
Пито
Сб 15 апреля 2017 г. 8:31 утра
И ниже того же упражнения, что и выше (та же самая SDCard, то же количество написанных данных, 1 мс отбора проб, размер FIFO устанавливается еще меньше - всего 300 записей), но с Sdfatex. FIFO расслаблен, вы можете увидеть несколько задержек.
Вы можете пойти с гораздо меньшим размером FIFO, как указывает изображение.
Скорость RD/WR EX (класс расширенного переноса) намного выше, чем со стандартным SDFAT (и вам не нужны большие кеши, чтобы получить такие скорости).
На практике это означает, что вы можете войти в систему гораздо больше данных с выборкой 1 мс. Пытаться
Вы можете пойти с гораздо меньшим размером FIFO, как указывает изображение.
Скорость RD/WR EX (класс расширенного переноса) намного выше, чем со стандартным SDFAT (и вам не нужны большие кеши, чтобы получить такие скорости).
На практике это означает, что вы можете войти в систему гораздо больше данных с выборкой 1 мс. Пытаться
- Log 1ms 1mil sdfatex.JPG (29.15 киб) просмотрено 595 раз
Пито
Сб 15 апреля 2017 г. 9:41
И это связано с оригинальным регистратором SDCARD из первого поста здесь, но с выборкой 1 мс, а также с SDFATEX, FR 9.0, Maple Mini.
Выборка включает в себя 8XADC и 67TAPS FIR-фильтр, применяемый на каждом канале ADC.
С размером 100 FIFO у меня нет нулевых ошибок, нет потерянных данных.
Мы пишем 50-60 байтов на образец (мы пишем .CSV Text), то есть данные 50-60 КБ/с на SDCARD.
Выборка включает в себя 8XADC и 67TAPS FIR-фильтр, применяемый на каждом канале ADC.
С размером 100 FIFO у меня нет нулевых ошибок, нет потерянных данных.
Мы пишем 50-60 байтов на образец (мы пишем .CSV Text), то есть данные 50-60 КБ/с на SDCARD.
- Log 1ms 1mil 8Adc fir sdfatex.JPG (40.45 киб) просмотрено 578 раз
Zoomx
Пт 22 июня 2018 г., 9:14
Два простых вопроса:
Если я хочу регистрировать меньшие каналы, мне нужно только прокомментировать другие, как в этом примере только с тремя первыми каннами?
Если я хочу регистрировать меньшие каналы, мне нужно только прокомментировать другие, как в этом примере только с тремя первыми каннами?
st-util
Пито
Пт 22 июня 2018 г., 8:25 вечера
Если я хочу регистрировать меньшие каналы, мне нужно только прокомментировать другие, как в этом примере только с тремя первыми каннами?
Вы должны прокомментировать все места, где вы определяете/связываете с этими значениями.. «Запись» состоит из этих значений, таким образом, вы сохраняете много места, тогда.. (FIFO работает с записями)..
Manolo88
Ср. 05 сентября 2018 г., 20:12
Пито, я хочу знать, если вы решили
https: // www.STM32duino.com/viewtopic.PHP?T = 1298#P16742
Сообщите, потому что мне нужно увеличить Tick Frec, и я не могу этого сделать. Я настраиваю
#define configtick_rate_hz ((ticktype_t) 1000)
в Rtosconfig.от от 100 до 100 или 2000 года, и нет никакого эффекта.
Вы можете помочь мне??
В 1 мс тика Tick работает идеально.
Спасибо за все.
https: // www.STM32duino.com/viewtopic.PHP?T = 1298#P16742
Сообщите, потому что мне нужно увеличить Tick Frec, и я не могу этого сделать. Я настраиваю
#define configtick_rate_hz ((ticktype_t) 1000)
в Rtosconfig.от от 100 до 100 или 2000 года, и нет никакого эффекта.
Вы можете помочь мне??
В 1 мс тика Tick работает идеально.
Спасибо за все.