30.11.2016, 17:17
|
|
Гражданин KAZUS.RU
Регистрация: 21.02.2007
Сообщений: 551
Сказал спасибо: 37
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
|
Организация памяти.
Здравствуйте, возникла тут одна проблемка, как решить неясно.
В общем есть PIC18f452. Он опрашивает несколько датчиков. около 10 штук.
Результаты с датчиков я складываю в буфер длиной 64 байта.
Далее по запросу с головного устройства по SPI этот буфер передается.
Опрос датчиков происходит параллельно с использованием прерываний.
Проблема возникает в том появляются ситуации когда начинается чтение буфера по SPI но в этот же момент идет изменение этого буфера в основном коде так как сработало прерывание от датчика какого нибудь.
Хотел сделать второй буфер, но проблема в том что понятия цикла опроса не существует и данные с датчиков сыпятся как только готовы.
Подскажите пожалуйста как можно решить эту задачу???
|
|
|
|
30.11.2016, 17:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,508
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: Организация памяти.
Ну распараллеливания процессов в этом МК то нету и в помине. Так что при запросе инфы с головного устройства просто прекращаете прием с датчиков, не реагируете на получение инфы с датчиков и отправляете то, что есть. Либо, если вам важно, чтобы данные на всех датчиках обновились полностью, то в ответ на запрос головного устройства можете ему отправить сообщение о неготовности пакета данных. Это зависит от формата команд головного устройства и вообще от организации его работы. Предусмотрен ли у головного устройства обмен служебной инфой, помимо чисто данных, предусмотрена ли интеллектуальная работа типа "готово? -- нет! -- аа, ну я тогда попозже зайду".
Либо, (особенно если скорость передачи в головное устройство невысокая, слишком медленная для вас), то складываете инфу с датчиков в один буфер, не откладывая. А как только приходит запрос от головного устройства, кратковременно запрещаете реакцию на датчики (прерывания от них), копируете этот буфер во второй буфер полностью до конца, разрешаете прерывания от датчиков и спокойно отправляете второй буфер в головное устройство, этот буфер будет содержать инфу, зафиксированную в момент копирования из первого во втогой.
|
|
|
|
30.11.2016, 20:44
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Организация памяти.
Два буфера. Просто перекидывать указатель и все.
|
|
|
|
30.11.2016, 20:55
|
|
Заблокирован
Регистрация: 22.04.2014
Сообщений: 0
Сказал спасибо: 15
Сказали Спасибо 366 раз(а) в 284 сообщении(ях)
|
Re: Организация памяти.
Сообщение от Easyrider83
|
Два буфера. Просто перекидывать указатель и все.
|
Один большой буфер с отправкой по СПИ при заполненной половине.
|
|
|
|
30.11.2016, 21:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: Организация памяти.
Сообщение от worldmasters
|
Он опрашивает несколько датчиков. около 10 штук.
|
Сообщение от worldmasters
|
и данные с датчиков сыпятся как только готовы
|
Так мк датчики опрашивает, или получает с них данные по их собственной инициативе?
Во втором случае, если он еще и на SPI является слэйвом, проблема системная. Так нельзя. Более продвинутый МК с DMA может такое делать, а ваш ПИК нет (хотя если общение с каждым датчиком занимает немного времени, то заставить работать таки можно).
|
|
|
|
30.11.2016, 21:47
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,508
Сказал спасибо: 401
Сказали Спасибо 2,218 раз(а) в 1,316 сообщении(ях)
|
Re: Организация памяти.
Я так думаю, что датчик имеет выход INT прерывания по готовности. Некоторые АЦП-шки например имеют такой. RTC так же поступают, выводя секундные импульсы. А МК реагирует нна это по внешнему прерыванию.
|
|
|
|
30.11.2016, 21:59
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Организация памяти.
По INT надо флаг выставлять, а не датчики опрашивать.
|
|
|
|
01.12.2016, 01:54
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,246
Сказал спасибо: 11,165
Сказали Спасибо 3,854 раз(а) в 2,925 сообщении(ях)
|
Re: Организация памяти.
По существу задачи (без технических деталей)
В памяти организуются два буфера для данных.
Переключение идёт командой xor для флага указателя буфера.
Дополнительно к флагу организуются два поля (битовых) по биту на датчик.
При записи информации в буфер соответствующий бит or 1.
Тогда при запросе spi делаем xor, затем передаём всех у кого флаг 1 и записываем 0 во все биты флагов (and).
При таком алгоритме получается полностью независимая обработка.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
01.12.2016, 08:55
|
|
Вид на жительство
Регистрация: 03.02.2010
Сообщений: 347
Сказал спасибо: 138
Сказали Спасибо 65 раз(а) в 46 сообщении(ях)
|
Re: Организация памяти.
Сообщение от worldmasters
|
В общем есть PIC18f452. Он опрашивает несколько датчиков. около 10 штук.
|
Сообщение от worldmasters
|
Проблема возникает в том появляются ситуации когда начинается чтение буфера по SPI но в этот же момент идет изменение этого буфера в основном коде так как сработало прерывание от датчика какого нибудь.
|
Странно что у вас не возникает вопроса о том что делать если прерывания поступили сразу от двух и более датчиков. Вы же эту ситуацию как то разруливаете.
|
|
|
|
01.12.2016, 09:57
|
|
Гражданин KAZUS.RU
Регистрация: 21.02.2007
Сообщений: 551
Сказал спасибо: 37
Сказали Спасибо 17 раз(а) в 16 сообщении(ях)
|
Re: Организация памяти.
Сообщение от Stazher
|
Странно что у вас не возникает вопроса о том что делать если прерывания поступили сразу от двух и более датчиков. Вы же эту ситуацию как то разруливаете.
|
Приоритетами. некоторые датчики это УЗ дальномеры там важно между импульсами замерять время. Это по прерыванию с высоким приоритетом.
ацп - низкий приоритет.
контактные датчики в теле основного main опрашиваются.
когда сработало прерывание в нем фиксируются основные сигналы, время там или количество импульсов.
затем в основном цикле происходит обработка, запись в буфер и инициирование нового запроса.
NewWriter В данном случае под параллельностью можно понимать неблокирующее исполнение. В идеале голова должна иметь актуальные данные со всех датчиков максимально быстро. Подготовить полностью пакет не получается потому что например цап сможет опросить свои датчики за 100ms, а для уз этого времени мало. И получится что надо ацп запускать по новому кругу или ждать пока все уз будут готовы. Но к тому времени данные ацп уже станут неактуальными.
mike-y-k Была подобная идея. для передачи по спи есть указатель на начало массива. Далее проси перелистываем на 1 указатель и отправляем все байты что есть.
А если для каждого результата менять указатель по флагу готовности ... как это правильно расписать чет не соображу. К тому же этот пик не торопливый поэтому я стараюсь сложных алгоритмов организации избегать.
Сразу уточню что железо изменить нет возможности. Понимаю что есть более шустрые чипы но в данном случае без вариантов. Именно этот пик, 25Mhz частота кварца.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:52.
|
|