Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Кольцевой буфер не успевает себя сдвигать до прихода нового байта..
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
ILYAUL
Цитата(AHTOXA @ Nov 11 2011, 22:19) *
Расшифровываю: 100<X<500 Чему равен X когда надо отправить ответ? Ну как минимум сто . Т.е не раньше .
У вас явные проблемы с чтением sad.gif
Расшифровываю правильно : ответить надо не позже, чем X мкс, где 100 < X < 500. Про "не раньше" там нет и не было.


Попробуйте подумать ещё чуть чуть. Вы всё для себя написали сами
kolobok0
Цитата(Alt.F4 @ Nov 11 2011, 14:15) *
...В итоге SRAM - 2 байта (один маркер, другой счетчик символов при сохранении данных), и скорость максимальная. =)



не, можно быстрее sm.gif
если 3 байта. 2 байта = адресс подпрограммы.
1 = счётчик байт.

тем самым вы не тратите на ран-тайме время для вычисления адреса. на этапе компиляции он автоматически вычисляется. единственный минус такого подхода - более аккуратное программирование..

(круглый)
AHTOXA
Цитата(ILYAUL @ Nov 12 2011, 00:45) *
Попробуйте подумать ещё чуть чуть. Вы всё для себя написали сами

Мда. Это клиника...
Вам уже три человека сказали, что вы неправы. Может, попробуете подумать?
ILYAUL
Цитата(AHTOXA @ Nov 12 2011, 00:50) *
Мда. Это клиника...
Вам уже три человека сказали, что вы неправы. Может, попробуете подумать?


Для тех кто в танке и думать не хочет , а может и хуже ,читаем специально для них

Цитата
Принимаем команды по наложению OSD, шина RS485 абонентов много, при получении команды не позже чем через нцать мкс (точное число ен помню больше 100 но меньше 500) следует отправить подтверждение приема.

Что имеем : Отправить команду непозже чем цать мкс - сия фраза смысла не несёт , смысл имеют озвученные цифры
Обозначим время ответа X
больше 100 - значит Х>100

меньше 500 - значит Х<500
Получается , что ответ надо отправить в промежуток между 100мкс - 500мкс - 100<X<500

Отсюда следует , что X должен быть, НЕ МЕНЬШЕ 100 ( по условию Х>100) и НЕ БОЛЬШЕ 500 (по условию Х<500)

Вследующий раз , когда будете что-то писать - ДУМАЙТЕ!!!
aaarrr
Цитата(ILYAUL @ Nov 12 2011, 01:44) *
Что имеем : Отправить команду непозже чем цать мкс - сия фраза смысла не несёт

"при получении команды следует отправить подтверждение приема не позже чем через X мкс" - что не так со смыслом?

Цитата(ILYAUL @ Nov 12 2011, 01:44) *
смысл имеют озвученные цифры

Цифры относятся к одному числу X. Оно может принимать значения от 100 до 500, конкретного значения написавший не помнит.

Цитата(ILYAUL @ Nov 12 2011, 01:44) *
Получается , что ответ надо отправить в промежуток между 100мкс - 500мкс - 100<X<500

Никоим образом не получается.
Allregia
Цитата(ILYAUL @ Nov 11 2011, 23:44) *
Для тех кто в танке и думать не хочет , а может и хуже ,читаем специально для них


Что имеем : Отправить команду непозже чем цать мкс - сия фраза смысла не несёт ,


Почему "не несет"? Очень даже несет - там написано что время ответа от 0 до Х.


Цитата
смысл имеют озвученные цифры
Обозначим время ответа Xбольше 100 - значит Х>100 меньше 500 - значит Х<500

Получается , что ответ надо отправить в промежуток между 100мкс - 500мкс - 100<X<500


Нет, здесь написано что максимальное значение Х может быть от 100 до 500.
А поскольку про минимальное вообще ничего не указано, то его можно принять равным нулю, т.е. ответ сразу.


Т.е. в целом, интервал ответа может быть от 0 до 100 , и от 0 до 200, и от 0 до 500.
Вот от 0 до 600 - уже не может.

Цитата
Вследующий раз , когда будете что-то писать - ДУМАЙТЕ!!!


вот именно sm.gif
ILYAUL
Allregia , aaarrr

Спасибо, за Выше прочтение , но я останусь при своём мненини.
Особенно мне понравился ответ сразу , даже не посмотрев , что пришло помеха или команда
AHTOXA
Цитата(ILYAUL @ Nov 12 2011, 16:24) *
Спасибо, за Выше прочтение , но я останусь при своём мненини.

laughing.gif Я восхищён упорством упёртостью этого человека! sm.gif
_Ivana
О как интересно! Примерно в то же время, что разворачивалась дискуссия, я тоже писал свою первую (и пока единственную) в жизни программку на С - драйвер GPG-модуля, прием/передача NMEA команд по USART, причем в рамках невытесняющей многозадачности с планировщиком sm.gif И тоже хотел анализировать символы и считать контрольную сумму внутри прерывания по приему, и также дискутировал с руководителем проекта, который меня убедил, что на этом бедном камне кроме моего вшивого GPS висят ещё дохрена внешних железяк по SPI, USART и просто на ногах по уровням, и что сидеть в прерываниях мы не будем дольше минимально необходимого времени для записи байта, и добил наличием прерываний без флагов, которые мы вообще потеряем, если будем сидеть долго в других, ибо AVR вложенные прерывания не допускает... sm.gif И я понуро пошел осваивать кольцевой буфер с указателями хвоста и головы, разбор его содержимого при каждом такте системного таймера планировщика, только разумеется безо всякого сдвига самого буфера и переписывания его ещё в какие-то массивы - только результирующие координаты в глобальную переменную, по буферу бежал по элементам последовательно и без возвратов, размер кратным степени 2 не делал (банально не влез в ОЗУ отладочного маленького камня, надо минимум 80 (максимальная посылка NMEA), а 128 уже не влезал) - и что, нормально все работает, я был очень рад и доволен sm.gif Сразу после включения GPS конечно начинает слать по несколько посылок одновременно каждую секунду, и буфер скорее всего переполняется, но я его сначала не анализирую, отправляю команду "слать только формат RMC раз в N секунд", и даже если он шлет раз в секунду вполне успеваю разгрести буфер и даже вывалить в отладочную печать в терминал и сами посылки и разобранные валидные координаты.

ЗЫ решение, как его придумал автор (с 25 подпрограммами) я навскидку не понял, буду пробовать его осознать sm.gif
_Артём_
Цитата(_Ivana @ Jan 10 2012, 19:01) *
добил наличием прерываний без флагов, которые мы вообще потеряем,


Что за прерывания без флагов, просветите.
Зачем вы их теряете, зря это.


Цитата(_Ivana @ Jan 10 2012, 19:01) *
ибо AVR вложенные прерывания не допускает... sm.gif


Согласен именно ":)"

Код
#pragma vector=TIMER1_COMPA_vect// TIMER1_COMPA_vect взят для примера, можно брать любое другое прерывание
__interrupt void Timer1_period_ISR()
{
    TIMSK &=  ~(1 << OCIE1A);// запрет повторного прерывания по этому же источнику
    asm("sei"); // глобальное разрешение прерываний
    // тут вложенные прерывания разрешены
    asm("cli"); // глобальный запрет прерываний
    TIMSK |=  (1 << OCIE1A);// разрешение прерывания по TIMER1_COMPA_vect (если надо)
}



Цитата(_Ivana @ Jan 10 2012, 19:01) *
И я понуро пошел осваивать

Да, хорошо быть начальником: он по определению и не дурак и мат часть знает.

Цитата(_Ivana @ Jan 10 2012, 19:01) *
банально не влез в ОЗУ отладочного маленького камня, надо минимум 80 (максимальная посылка NMEA), а 128 уже не влезал)


Я так понял что у вас а не мегаАВР, а недоАВР какой-то. Но "невытесняющая многозадачность с планировщиком"
при этом влазит (какая ОСь кстати?).

ИМХО, отлаживаться правильней/удобней на большем камне, а не на меньшем (я про ОЗУ).

Цитата(_Ivana @ Jan 10 2012, 19:01) *
И я понуро пошел осваивать

Да, хорошо быть начальником: он по определению и не дурак и мат часть знает.

Цитата(_Ivana @ Jan 10 2012, 19:01) *
надо минимум 80 (максимальная посылка NMEA), а 128 уже не влезал)


Это смотря как делать.
См.
ссылка
_Ivana
Цитата
Что за прерывания без флагов, просветите.

Был бы специалистом - просветил бы. А так только на задворках памяти осталось что-то типа прерываний по высокому/низкому уровню на ногах.

Цитата
Согласен именно ":)"

Спасибо за науку и пример. Буквально несколько часов назад обсуждали с тем же руководителем проекта применение именно такой особенности AVR (и не только их) - возможность сделать enable interrupt внутри прерывания, запретив только этот же источник - для вынесения "параллельных потоков" наружу уже готового линейного кода без переделки последнего, сохранение при этом в стек адресов возвратов из прерываний очень вдохновляет.

Цитата
Да, хорошо быть начальником: он по определению и не дурак и мат часть знает.

Ну, это в данном случае не следствие а наоборот причина, почему он начальник rolleyes.gif

Цитата
Я так понял что у вас а не мегаАВР, а недоАВР какой-то. Но "невытесняющая многозадачность с планировщиком" при этом влазит (какая ОСь кстати?).
ИМХО, отлаживаться правильней/удобней на большем камне, а не на меньшем (я про ОЗУ).

В финальном проекте будет.... не знаю что, но AVR побольше. А отлаживаю я свой блок на AT90USB162 с 512 байт ОЗУ rolleyes.gif На что начальник говорит - если ты уложишься в эти 512 байт, то в готовом проекте я буду уверен, что ОЗУ не переполнится даже если все задачи начнут работать одновременно (условно). А у меня там ещё и конвертор USB<->COM с приемом команд и выдачей отладочной информации в терминал на комп sm.gif
ОС нет, самонаписанный нами же шедуллер, который по кругу запускает задачи, каждая из которых написана НЕ как при ОС - как будто других задач нет и все время её, а в виде "зашел, проверил готовность предыдущего шага - начал следующий - вышел", если я понятно объяснил sm.gif

Цитата
Это смотря как делать.
См. ссылка

Спасибо за полезные прямые ссылки, буду изучать и пытаться понимать.
ЗЫ: если в прерывании по приему очередного символа не делать ничего. кроме того как класть его в кольцевой буфер, то конечно даже в этом случае можно исхитриться и обойтись буфером меньше длины посылки (отрезая уже проверенные символы и считая контрольную сумму), но мне было проще анализировать имея строку целиком. Я подозреваю, что при анализе буфера я много раз пробегаю от начала посылки до конца буфера - и если посылка ещё не вся пришла, то делаю это зря... Но таков сейчас мой алгоритм анализа. Можно конечно придумать флаг - пришел конец посылки и тогда анализировать буфер, а после анализа сбрасывать...
_Артём_
Цитата(_Ivana @ Jan 12 2012, 22:00) *
Был бы специалистом - просветил бы. А так только на задворках памяти осталось что-то типа прерываний по высокому/низкому уровню на ногах.


Флаг вроде был. Но один на все источники.


Цитата(_Ivana @ Jan 12 2012, 22:00) *
Буквально несколько часов назад обсуждали с тем же руководителем проекта применение именно такой особенности AVR (и не только их) - возможность сделать enable interrupt внутри прерывания, запретив только этот же источник - для вынесения "параллельных потоков" наружу уже готового линейного кода без переделки последнего, сохранение при этом в стек адресов возвратов из прерываний очень вдохновляет.


100%-но работающая возможность, лишь бы стека хватило.

Цитата(_Ivana @ Jan 12 2012, 22:00) *
ОС нет, самонаписанный нами же шедуллер, который по кругу запускает задачи, каждая из которых написана НЕ как при ОС - как будто других задач нет и все время её, а в виде "зашел, проверил готовность предыдущего шага - начал следующий - вышел", если я понятно объяснил sm.gif


Понятно, что-то вроде вызова функций, сохраняющих номер итерации(состояния).

Цитата(_Ivana @ Jan 12 2012, 22:00) *
Я подозреваю, что при анализе буфера я много раз пробегаю от начала посылки до конца буфера - и если посылка ещё не вся пришла, то делаю это зря... Но таков сейчас мой алгоритм анализа. Можно конечно придумать флаг - пришел конец посылки и тогда анализировать буфер, а после анализа сбрасывать...


Флаг придумать несложно: например приём символа с кодом 0x0D(CR) означает конец строки в NMEA и по нему можно начинать анализ.

Успехов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.