|
|
  |
Кольцевой буфер не успевает себя сдвигать до прихода нового байта.., Помогите найти решение. |
|
|
|
Nov 11 2011, 14:50
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Flexz @ Nov 11 2011, 16:46)  Ясно написано,.... при получении команды не позже чем через нцать мкс (точное число ен помню больше 100 , но меньше 500)... Расшифровываю: 100< X<500 Чему равен X когда надо отправить ответ? Ну как минимум сто . Т.е не раньше .Запятую поставил я - правила грамматики. Цитата и "сидим в прерывании" это вы сами придумали - ничего подобного , это же Ваш принцип сидеть там до упора.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 11 2011, 17:01
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Flexz @ Nov 11 2011, 20:46)  Каверкать чужие слова, и выдавать свои мысли за чужие - дурной тон, завязывайте с этим. В ТЗ, кстати, было следующее "...отправить ответую посылку не позднее, чем через 10 битовых интервалов...", а сокрости работы от 19200 до 115200бод. Что Вы написали , то я и "каверкую" , строго исходя из того что Вы пишите. Прочитайте свою последнюю фразу и подумайте что Вы написали с точки зрения простой логики.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 11 2011, 18:19
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(ILYAUL @ Nov 11 2011, 20:50)  Цитата(Flexz @ Nov 11 2011, 15:47)  1. Принимаем команды по наложению OSD, шина RS485 абонентов много, при получении команды не позже чем через нцать мкс (точное число ен помню больше 100 но меньше 500) следует отправить подтверждение приема.
Расшифровываю: 100< X<500 Чему равен X когда надо отправить ответ? Ну как минимум сто . Т.е не раньше . У вас явные проблемы с чтением  Расшифровываю правильно : ответить надо не позже, чем X мкс, где 100 < X < 500. Про "не раньше" там нет и не было.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 11 2011, 18:45
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(AHTOXA @ Nov 11 2011, 22:19)  Расшифровываю: 100< X<500 Чему равен X когда надо отправить ответ? Ну как минимум сто . Т.е не раньше . У вас явные проблемы с чтением Расшифровываю правильно : ответить надо не позже, чем X мкс, где 100 < X < 500. Про "не раньше" там нет и не было. Попробуйте подумать ещё чуть чуть. Вы всё для себя написали сами
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 11 2011, 19:15
|
практикующий тех. волшебник
    
Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417

|
Цитата(Alt.F4 @ Nov 11 2011, 14:15)  ...В итоге SRAM - 2 байта (один маркер, другой счетчик символов при сохранении данных), и скорость максимальная. =) не, можно быстрее  если 3 байта. 2 байта = адресс подпрограммы. 1 = счётчик байт. тем самым вы не тратите на ран-тайме время для вычисления адреса. на этапе компиляции он автоматически вычисляется. единственный минус такого подхода - более аккуратное программирование.. (круглый)
|
|
|
|
|
Nov 11 2011, 21:44
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(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)
Вследующий раз , когда будете что-то писать - ДУМАЙТЕ!!!
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Nov 11 2011, 22:01
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(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 Никоим образом не получается.
|
|
|
|
|
Nov 12 2011, 09:46
|
Профессионал
    
Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763

|
Цитата(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 - уже не может. Цитата Вследующий раз , когда будете что-то писать - ДУМАЙТЕ!!! вот именно
|
|
|
|
|
Jan 10 2012, 17:01
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
О как интересно! Примерно в то же время, что разворачивалась дискуссия, я тоже писал свою первую (и пока единственную) в жизни программку на С - драйвер GPG-модуля, прием/передача NMEA команд по USART, причем в рамках невытесняющей многозадачности с планировщиком  И тоже хотел анализировать символы и считать контрольную сумму внутри прерывания по приему, и также дискутировал с руководителем проекта, который меня убедил, что на этом бедном камне кроме моего вшивого GPS висят ещё дохрена внешних железяк по SPI, USART и просто на ногах по уровням, и что сидеть в прерываниях мы не будем дольше минимально необходимого времени для записи байта, и добил наличием прерываний без флагов, которые мы вообще потеряем, если будем сидеть долго в других, ибо AVR вложенные прерывания не допускает...  И я понуро пошел осваивать кольцевой буфер с указателями хвоста и головы, разбор его содержимого при каждом такте системного таймера планировщика, только разумеется безо всякого сдвига самого буфера и переписывания его ещё в какие-то массивы - только результирующие координаты в глобальную переменную, по буферу бежал по элементам последовательно и без возвратов, размер кратным степени 2 не делал (банально не влез в ОЗУ отладочного маленького камня, надо минимум 80 (максимальная посылка NMEA), а 128 уже не влезал) - и что, нормально все работает, я был очень рад и доволен  Сразу после включения GPS конечно начинает слать по несколько посылок одновременно каждую секунду, и буфер скорее всего переполняется, но я его сначала не анализирую, отправляю команду "слать только формат RMC раз в N секунд", и даже если он шлет раз в секунду вполне успеваю разгрести буфер и даже вывалить в отладочную печать в терминал и сами посылки и разобранные валидные координаты. ЗЫ решение, как его придумал автор (с 25 подпрограммами) я навскидку не понял, буду пробовать его осознать
|
|
|
|
|
Jan 12 2012, 12:24
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(_Ivana @ Jan 10 2012, 19:01)  добил наличием прерываний без флагов, которые мы вообще потеряем, Что за прерывания без флагов, просветите. Зачем вы их теряете, зря это. Цитата(_Ivana @ Jan 10 2012, 19:01)  ибо AVR вложенные прерывания не допускает...  Согласен именно ":)" Код #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 уже не влезал) Это смотря как делать. См. ссылка
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|