реклама на сайте
подробности

 
 
> Подскажите по реализации библиотеки для МК?
Harvester
сообщение Aug 25 2015, 08:20
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Добрый день.
Имеется плата с МК (STM32, но это не суть важно). Мне необходимо написать библиотеку, которая будет передана разработчикам основной программы в бинарном виде. Одна из функций моей библиотеки должна при вызове брать с частотой 100 кГц некоторое количество отсчетов с выводов МК.
Загвоздка в том, как организовать этот самый интервал между отсчетами. Мне приходят в голову следующие варианты:
1. Задержка в цикле - криво и не серьезно;
2. Задержка с использованием HAL-функций (SysTick);
3. Использование какого-либо аппаратного таймера;
4. Обязать разработчиков основной программы вызывать функцию взятия отсчетов с заданной периодичностью.
Из перечисленных вариантов мне больше нравится 4-й. Может я что-то упустил и есть другие решения?
Спасибо.


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Aug 25 2015, 12:34
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Если все выводы принадлежат одному порту, можно попробовать читать порт и по DMA складывать в память. А пересылку DMA запускать таймером. Все будет работать аппаратно, регулярно. Только запускать процесс и ждать окончания придется в программе.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Aug 25 2015, 13:34
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(ViKo @ Aug 25 2015, 15:34) *
Если все выводы принадлежат одному порту, можно попробовать читать порт и по DMA складывать в память. А пересылку DMA запускать таймером. Все будет работать аппаратно, регулярно. Только запускать процесс и ждать окончания придется в программе.

Это уже лишнее - все равно ведь ждать :D Но на будущее учту


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
demiurg1978
сообщение Aug 26 2015, 18:20
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 333
Регистрация: 19-12-13
Из: Новосибирск
Пользователь №: 79 709



Я с этими МК не работаю. Но, как бы я сделал: насколько я понял, должна быть стабильная частота 100 кГц. Так как эта функция работает от и до, то договариваемся с программистами, что берем хиленький не особо нужный таймер. Функция простенький автомат. Хоть флаговый, хоть свитч-кейс. Нулевое состояние - Инициализируем таймер на нужную частоту, прерывание, при этом рубим все мешающие (опять же, если это можно). Установка следующего состояния. Следующее состояние просто ожидание флага, который устанавливается в прерывании по достижении нужного кол-ва отсчетов. В прерываниях считываем нужные порты и кол-во прерываний (100), кладем считанные данные куда требуется. По достижении нужного кол-ва прерываний-отсчетов отключаем прерывание, таймер, ставим флаг, ставим обратно нулевое состояние и выходим.

И кстати, если уж функция работает от и до, то спокойно можно занять какой-нибудь таймер. Правда тут нюансы могут быть.

Что-то вроде такого:
Код
static unsigned char flags = 0;

void func (void)
{
   static unsigned char state;

   switch (state)
   {
      case 0:
         // инициализация ввода-вывода, переменных, таймера.
         state = 1;
         break;

      case 1:
         if (flags & (1<<0))
         {
            // отключение таймера, прерываний
            flags = 0;
            state = 0;
         }
         break;

      default:
         break;
   }
}


Сообщение отредактировал demiurg1978 - Aug 26 2015, 18:53
Go to the top of the page
 
+Quote Post
Harvester
сообщение Aug 27 2015, 06:52
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(demiurg1978 @ Aug 26 2015, 21:20) *
Но, как бы я сделал...берем таймер...в прерываниях считываем нужные порты...По достижении нужного кол-ва прерываний-отсчетов отключаем прерывание, таймер, ставим флаг.

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


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 27 2015, 07:19
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Harvester @ Aug 27 2015, 12:52) *
Так тоже можно. Но зачем? Зачем занимать таймер, настраивать его, выполнять другие телодвижения, когда достаточно простого цикла ожидания. Ведь из функции все равно не выйдешь, пока не наберешь все отсчеты и не обработаешь их.

Затем чтобы освободить CPU для выполнения менее приоритетных задач в многозадачной среде. Или хотя-бы для выполнения WFE/WFI в фоновой задаче.
Go to the top of the page
 
+Quote Post
Harvester
сообщение Aug 27 2015, 13:18
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846



Цитата(jcxz @ Aug 27 2015, 10:19) *
Затем чтобы освободить CPU для выполнения менее приоритетных задач в многозадачной среде. Или хотя-бы для выполнения WFE/WFI в фоновой задаче.

А как использование таймера в моем случае позволит освободить CPU? Простите, но я действительно не понимаю sad.gif
Смотрите. Есть некая программа, пусть даже с ОС. В какой-то момент она вызывает мою функцию, задача которой снять 100 отсчетов с ноги с интервалом в 10(+/-) мкс, обработать их блоком и вернуть результат.
Так вот, какая разница для основной программы, как будет отсчитываться интервал между считыванием в моей функции: циклом задержки с nop-ами, таймером с ожиданием флага переполнения, таймером с DMA и прочее и прочее? Ведь функция в любом случае вернет управление только после накопления ВСЕХ отсчетов и, чтобы я ни придумал, это в любом случае займет не менее 1 мс.
Если я не прав, то буду очень благодарен за разъяснение


--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Harvester   Подскажите по реализации библиотеки для МК?   Aug 25 2015, 08:20
- - adnega   Цитата(Harvester @ Aug 25 2015, 11:20) Од...   Aug 25 2015, 08:24
|- - Harvester   Цитата(adnega @ Aug 25 2015, 11:24) А раз...   Aug 25 2015, 08:33
|- - adnega   Цитата(Harvester @ Aug 25 2015, 11:33) Но...   Aug 25 2015, 08:35
- - zltigo   QUOTE (Harvester @ Aug 25 2015, 11:20) 3....   Aug 25 2015, 08:24
|- - Harvester   Цитата(zltigo @ Aug 25 2015, 11:24) Поско...   Aug 25 2015, 08:57
|- - zltigo   QUOTE (Harvester @ Aug 25 2015, 11:57) С ...   Aug 25 2015, 09:12
|- - Harvester   Цитата(zltigo @ Aug 25 2015, 12:12) Но кт...   Aug 25 2015, 09:29
|- - esaulenka   Цитата(Harvester @ Aug 25 2015, 12:29) До...   Aug 25 2015, 11:44
|- - Harvester   Цитата(esaulenka @ Aug 25 2015, 14:44) Я ...   Aug 25 2015, 12:16
|- - esaulenka   Цитата(Harvester @ Aug 25 2015, 15:16) Пр...   Aug 25 2015, 12:54
|- - adnega   Цитата(Harvester @ Aug 25 2015, 15:16) а ...   Aug 25 2015, 12:59
- - jcxz   Правильное ожидание готовности: Разрешаем прерыван...   Aug 28 2015, 12:10


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 23:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01437 секунд с 7
ELECTRONIX ©2004-2016