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

|
Цитата(adnega @ Aug 25 2015, 11:24)  А разработчики не могут сами взять эти отсчеты и передать в функцию? Хоть программными задержками, хоть таймером с DMA. Изначально так и предполагалось - они копят сырые отсчеты, а я только обрабатываю. Но что-то пошло не так...
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Aug 25 2015, 08:57
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(zltigo @ Aug 25 2015, 11:24)  Поскольку Вы уже заняли в "библиотеке" какие-то IO и видимо жестко, то так-же занять еще и таймер уже не страшно. С одной стороны Вы правы, однако здесь я вижу две проблемы: 1. Никто не может гарантировать, что будет свободный таймер. Конечно, это весьма маловероятно, но все же... 2. Как его конфигурировать? В этом случае разработчики должны предоставить информацию о тактовой частоте. (Да, в CMSIS есть такая переменная, но кто сказал, что они будут использовать CMSIS или не вырежут эту функциональность?) А потом еще читать регистры RCC, высчитывать тактовую таймеров... Раз уж все равно вводить требования к основной программе, то пусть будет пункт 4 - мне так проще  Цитата(adnega @ Aug 25 2015, 11:35)  Может, достаточно подсказать им как это делается? Да они знают, просто на высшем уровне было принято такое решение. Может все еще и поменяется
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Aug 25 2015, 09:12
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Harvester @ Aug 25 2015, 11:57)  С одной стороны Вы правы, однако здесь я вижу две проблемы: 1. Никто не может гарантировать, что будет свободный таймер. Конечно, это весьма маловероятно, но все же... Но кто-то ведь гарантровал, то будут свободные пины, которые Вы читать собрались, или тоже нет  QUOTE 2. Как его конфигурировать? Так-же, как и все остальное - библиотека по любому имеет функцию инициализации. Вот и потребуйте вызов этой функции с указанием тактовой частоты.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 25 2015, 09:29
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(zltigo @ Aug 25 2015, 12:12)  Но кто-то ведь гарантровал, то будут свободные пины, которые Вы читать собрались, или тоже нет  Они не свободны, а жестко подключены к внешней периферии! Но Вашу мысль я понял. Буду решать. Возник еще вопрос. Допустим я задействую таймер. Т.к. я не знаю, какая в основной программе будет система прерываний (приоритеты и пр.), я буду контролировать интервал ожиданием флага переполнения. Если не принимать во внимание вопросы эстетики, то чем это решение принципиально будет отличаться от программной задержки с помощью цикла?
Сообщение отредактировал Harvester - Aug 25 2015, 10:14
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Aug 25 2015, 11:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(Harvester @ Aug 25 2015, 12:29)  Допустим я задействую таймер. Т.к. я не знаю, какая в основной программе будет система прерываний (приоритеты и пр.), я буду контролировать интервал ожиданием флага переполнения. Если не принимать во внимание вопросы эстетики, то чем это решение принципиально будет отличаться от программной задержки с помощью цикла? Я правильно понял, что эта "библиотека" будет содержать вечный цикл с ожиданием флажка таймера (с последующей обработкой данных) ? Это принципиально плохое решение. Хотя бы потому, что остальной, неизвестной части программы тоже нужно процессорное время.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Aug 25 2015, 12:16
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(esaulenka @ Aug 25 2015, 14:44)  Я правильно понял, что эта "библиотека" будет содержать вечный цикл с ожиданием флажка таймера (с последующей обработкой данных) ? Это принципиально плохое решение. Хотя бы потому, что остальной, неизвестной части программы тоже нужно процессорное время. Не совсем так. При вызове одной конкретной функции нужно взять 100 отсчетов с интервалом в 10 мкс (100 кГц) и обработать их. Т.е. весь вопрос в том, как реализовать, условно говоря, функцию delay_10us(). В любом случае возврат из функции возможен только после взятия всех отсчетов, а раз так, то какая разница как ждать: считать nop-ы или ждать флаг?
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Aug 25 2015, 12:54
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(Harvester @ Aug 25 2015, 15:16)  При вызове одной конкретной функции нужно взять 100 отсчетов с интервалом в 10 мкс (100 кГц) и обработать их. ... В любом случае возврат из функции возможен только после взятия всех отсчетов, И почему бы это сразу не описать, в первом же сообщении?.. Цитата(Harvester @ Aug 25 2015, 15:16)  Т.е. весь вопрос в том, как реализовать, условно говоря, функцию delay_10us(). Таймером, на мой взгляд - единственное нормальное решение. Без всяких прерываний, раз уж эту миллисекунду не жалко :-) Если в контроллере не используется встроенный ЦАП, можно задействовать самые простые таймеры - TIM6/TIM7. Считать nop'ы можно, но, во-первых, лениво (это после каждой правки расчётной части проверять, подбирать заново...), а во-вторых, частота опроса будет плавать, если алгоритм обработки нелинейный (например, входные значения меньше 100 обсчитаются по одной ветке, больше 100 - по другой).
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Aug 25 2015, 13:34
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(ViKo @ Aug 25 2015, 15:34)  Если все выводы принадлежат одному порту, можно попробовать читать порт и по DMA складывать в память. А пересылку DMA запускать таймером. Все будет работать аппаратно, регулярно. Только запускать процесс и ждать окончания придется в программе. Это уже лишнее - все равно ведь ждать :D Но на будущее учту
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Aug 26 2015, 18:20
|
Местный
  
Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|