|
Подскажите по реализации библиотеки для МК? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 18)
|
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
|
|
|
|
|
Aug 27 2015, 06:52
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(demiurg1978 @ Aug 26 2015, 21:20)  Но, как бы я сделал...берем таймер...в прерываниях считываем нужные порты...По достижении нужного кол-ва прерываний-отсчетов отключаем прерывание, таймер, ставим флаг. Так тоже можно. Но зачем? Зачем занимать таймер, настраивать его, выполнять другие телодвижения, когда достаточно простого цикла ожидания. Ведь из функции все равно не выйдешь, пока не наберешь все отсчеты и не обработаешь их.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Aug 27 2015, 13:18
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(jcxz @ Aug 27 2015, 10:19)  Затем чтобы освободить CPU для выполнения менее приоритетных задач в многозадачной среде. Или хотя-бы для выполнения WFE/WFI в фоновой задаче. А как использование таймера в моем случае позволит освободить CPU? Простите, но я действительно не понимаю  Смотрите. Есть некая программа, пусть даже с ОС. В какой-то момент она вызывает мою функцию, задача которой снять 100 отсчетов с ноги с интервалом в 10(+/-) мкс, обработать их блоком и вернуть результат. Так вот, какая разница для основной программы, как будет отсчитываться интервал между считыванием в моей функции: циклом задержки с nop-ами, таймером с ожиданием флага переполнения, таймером с DMA и прочее и прочее? Ведь функция в любом случае вернет управление только после накопления ВСЕХ отсчетов и, чтобы я ни придумал, это в любом случае займет не менее 1 мс. Если я не прав, то буду очень благодарен за разъяснение
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|