реклама на сайте
подробности

 
 
> Циклический буфер на AVR, (Примеры применения)
=GM=
сообщение Aug 24 2007, 15:16
Сообщение #1


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Тема открыта по горячим следам недавней острой дискуссии.

В ней одним из участников (defunct) была приведена программа, в которой использовался циклический буфер для работы с последовательным портом МК AT90S2313. На взгляд автора программа написана достаточно грамотно, но как-то слишком размашисто, без учёта мизерности ресурсов данного МК. Предлагаю участникам поделиться примерами и приёмами использования циклического буфера в программных разработках.

Для затравки предлагаю следующие фрагменты.

А. Запись байта из регистра AL в циклический буфер
Код
      mov     xl,qhead    ;указатель на запись
      st      x+,al       ;запишем байт
      cp      xl,qend     ;конец буфера?
      brne    .+2         ;нет, обходим
      ldi     xl,buffer   ;да, установим начало

Б. Чтение байта из циклического буфера в регистр AL
Код
      mov     xl,qtail    ;указатель на чтение
      ld      al,x+       ;прочитаем байт
      cp      xl,qend     ;конец буфера?
      brne    .+2         ;нет, обходим
      ldi     xl,buffer   ;да, установим начало

Если использовать буфер не произвольной длины, а кратный степени 2, и размещать его в памяти не произвольно, а начиная с адресов, кратных длине буфера, то размер кода можно немного сократить. Например.

В. Запись байта из регистра AL в циклический буфер длиной 32
Код
      mov     xl,qhead    ;указатель на запись
      st      x+,al       ;запишем байт
      cbr     xl,0xE0     ;держим указатель в предписанных рамках

Г. Чтение байта из циклического буфера длиной 32 в регистр AL
Код
      mov     xl,qtail    ;указатель на чтение
      ld      al,x+       ;прочитаем байт
      cbr     xl,0xE0     ;держим указатель в предписанных рамках

Здесь qhead, qtail, qend – регистровые переменные, содержащие адреса-указатели ячеек в озу для записи, чтения и конца буфера соответственно.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
4 страниц V  « < 2 3 4  
Start new topic
Ответов (45 - 51)
mse
сообщение Sep 4 2007, 18:39
Сообщение #46


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(Dog Pawlowa @ Sep 4 2007, 22:06) *
Люди, а как Вы синхронизируете скорости заполнения буфера и отправки от него?
...
Вы то как делаете?

Дык...ХОН-ХОФФ, аппаратная синхра...
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Sep 4 2007, 18:44
Сообщение #47


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата
Висеть в ожидании, пока там не освободится места, мне запрещает какая-то религия

Дык ждать-то по-любому нужно. Вопрос в том, делать ли чего полезное при этом или нет. А это скорее к механизмам шедулинга.
В случае достаточно долгого ожидания есть прямая целесообразность выйти из ожидания (отдать управление ОС), а потом иногда заходить и проверять или ждать(проверять) извещения о событии (буфер не полон) и уж тогда добивать.
while(On){
if(len<=0) break;
if(putc(*src)==EOF){
OS_Yield();//тут передаём управление ОС
}
src++;
len--;
}
Я, правда, чаще использую для выхода/входа в ожидающие функции не OS_Yield(), а механизм статических сопрограмм реализованный макросами http://www.chiark.greenend.org.uk/~sgtatham/coroutine.h
http://www.chiark.greenend.org.uk/~sgtatham/coroutines.html


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
bodja74
сообщение Sep 4 2007, 20:46
Сообщение #48


Знающий
****

Группа: Свой
Сообщений: 543
Регистрация: 22-10-05
Пользователь №: 9 984



Цитата(Dog Pawlowa @ Sep 4 2007, 21:06) *
Люди, а как Вы синхронизируете скорости заполнения буфера и отправки от него?
Может что такое новое придумали? smile.gif


Вы то как делаете?


Придумали уже давно,читайте внимательно пост 34.
Самый простой дернуть ногу CTS сом-порта ,он аппаратно приостановит передачу данных из него.
XON\XOFF - это еще нужно такой режим включить на дровах.
Хотя эти способы не освобождает от отслеживания на случай переполнения отправного буффера на ПК.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 5 2007, 05:03
Сообщение #49


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(sensor_ua @ Sep 4 2007, 21:44) *
Дык ждать-то по-любому нужно. Вопрос в том, делать ли чего полезное при этом или нет. А это скорее к механизмам шедулинга.

Угу, спасибо. А без ОС единственная возможность использовать это время - натолкать в прерывания побольше функциональности, логично? Я то работаю без ОС.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
sensor_ua
сообщение Sep 5 2007, 06:33
Сообщение #50


Профессионал
*****

Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387



Цитата(Dog Pawlowa @ Sep 5 2007, 08:03) *
Угу, спасибо. А без ОС единственная возможность использовать это время - натолкать в прерывания побольше функциональности, логично? Я то работаю без ОС.

Использование статических сопрограмм требует только большого цикла (round-robin), хотя этим применение не ограничиваетчся. А Adam Dunkel наваял на этом деле даже нечто типа операционки - Protothreads http://www.sics.se/~adam/pt/


--------------------
aka Vit
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Sep 5 2007, 07:19
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(sensor_ua @ Sep 5 2007, 09:33) *
Использование статических сопрограмм требует только большого цикла (round-robin), хотя этим применение не ограничиваетчся. А Adam Dunkel наваял на этом деле даже нечто типа операционки - Prothothreads http://www.sics.se/~adam/pt/

Спасибо. Я где-то рядом болтаюсь в подходах, используя switch или вызовы функций по индексу, а у него хорошо все проанализировано и систематизировано.


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
defunct
сообщение Sep 8 2007, 22:21
Сообщение #52


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Dog Pawlowa @ Sep 4 2007, 21:06) *
Люди, а как Вы синхронизируете скорости заполнения буфера и отправки от него?

На отправку (тобиш TX буфер) - опорная точка - всегда пропускная способность канала, от нее и синхронизироваться. Регуляторов только 2 - размер буфера и задержка между вливанием очередной порции данных.

Цитата
Вы то как делаете?
Там где канал с "узким горлышком" 300-1200 бод, а данных передавать много - ставлю 32k-128k внешней памяти. +2$ к стоимости устройства, +5см^2 места на плате.
Go to the top of the page
 
+Quote Post

4 страниц V  « < 2 3 4
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 20:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01465 секунд с 7
ELECTRONIX ©2004-2016