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

 
 
> Виртуозное владение IARом, предлагаю маленький подфорум
LeoLabs
сообщение May 18 2005, 05:09
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 5-03-05
Пользователь №: 3 082



Предлагаю открыть новую тему, помогающую овладеть всеми хитростями IARa всем начинающим. Также предлагаю вносить свои идеи, фенечки и тонкости, какими пользуетесь при написании проги на ИАРе.

И первый вопрос: - я организовал массив в СИ, с начальным адресом 0х100 и длиной 256 - чар : "__no_init unsigned char MyBuffer [256]@0x100;" - идея сделать кольцевой буффер, для простой работой с указателями (простой инкремент младшего байта указателя), с ним я работаю как в СИ, так и в ассемблере. ?? - как сделать инкремент младшего байта указателя в СИ? и вообще работать только с младшим байтом?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
standpoint
сообщение May 18 2005, 05:16
Сообщение #2





Группа: Новичок
Сообщений: 11
Регистрация: 4-05-05
Пользователь №: 4 743



Цитата(LeoLabs @ May 18 2005, 08:09)
Предлагаю открыть новую тему, помогающую овладеть всеми хитростями IARa всем начинающим. Также предлагаю вносить свои идеи, фенечки и тонкости, какими пользуетесь при написании проги на ИАРе.

И первый вопрос: - я организовал массив в СИ, с начальным адресом 0х100 и длиной 256 - чар : "__no_init unsigned char MyBuffer [256]@0x100;" - идея сделать кольцевой буффер, для простой работой с указателями (простой инкремент младшего байта указателя), с ним я работаю как в СИ, так и в ассемблере. ?? - как сделать инкремент младшего байта указателя в СИ? и вообще работать только с младшим байтом?
*


При чем здесь IAR? В С для создания динамического кольцевого буфера используется связка maloc-free. В С++ вообще для создания массивов рекомендуется использовать STL
Go to the top of the page
 
+Quote Post
LeoLabs
сообщение May 18 2005, 06:24
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 47
Регистрация: 5-03-05
Пользователь №: 3 082



Standpoint, а вы на чем программируете? не ПиСи ли? а то как-то ответ не "железячника". smile.gif
Go to the top of the page
 
+Quote Post
standpoint
сообщение May 18 2005, 18:59
Сообщение #4





Группа: Новичок
Сообщений: 11
Регистрация: 4-05-05
Пользователь №: 4 743



Цитата(LeoLabs @ May 18 2005, 09:24)
Standpoint, а вы на чем программируете? не ПиСи ли? а то как-то ответ не "железячника". smile.gif
*

Сорри,
я имел ввиду динамический буфер, а не статический. (Т.е. у которого размер меняется в зависимости от количества поступивших данных/обработанных данных.) Естественно, под каждый элемент буфера выделять память глупо даже для PC, и я этого не предлагал.

Для статического кольцевого буфера существует два пути:
1) косвенная адресация - требует четыре указателя pHead, pTail, сBuf[0] и сBuf[BUFSZ-1], последние два, если buf-глобальный, генерятся в памяти программ.
void Init(){
pHead = pTail = cBuf;
}
void Push(char val){
if(pTail == pHead)
return false;

*pHead = val;

if( pHead == &сBuf[BUFSZ-1])
pHead = cBuf;
else
pHead++;

return true;
}
bool Pop(char val){
if(pTail == pHead)
return false;

char val = *pTail;

if( pTail == &сBuf[BUFSZ-1])
pTail = cBuf;
else
pTail++;

return true;
}

2) индексная: два индекса в памяти данных + константа в памяти программ + указатель на буфер сгенерированный линкером в памяти программ
void Init(){
ixHead = ixTail = 0;
}
bool Push(char val){
if(ixTail == ixHead)
return false;

cBuf[ixHead] = val;

if( ixHead == (BUFSZ-1))
ixHead = 0;
else
ixHead++;

return true;
}
bool Pop(char* val){
if(ixTail == ixHead)
return false;

*val = cBuf[ixTail];

if( ixTail == (BUFSZ-1))
ixTail = 0;
else
ixTail++;

return true;
}

Конструкция
if( ix == (BUFSZ-1))
ix = 0;
else
ix++;
обычно меняется на
ix %= BUFSZ;
Но для IAR - не советуюsmile.gif)

Конкретная реализация выбирается исходя из параметров буфера.

Возможны опечатки и неточности, но смысл в целом таков. Типы указателей я не приводил, для боевого кода советую привести, как это сделал vet, вдруг потом на ARM свою программу будете переносить. Кстати union, предложенный vet в таком виде не переносим, поскольку бывают как big-, так и -little endian uC, а указатели в общем случае не 16-разрядные.

Может выделять память динамически и не совсем целесообразно, просто экономить ресурсы бывает иногда важнее - должна быть золотая середина вот и все. Например, такой вопрос: как встраиваемая система будет обрабатывать ошибку в функции Pop()???

Ко всему, не я же при решении задачи пришел к тому выводу, что мне совершенно необходим буфер размера 0x100 по адресу 0x100, и задачу необходимо решать именно на AVR,- так что в этом смысле я, возможно, и не "железячник":)))) А может быть просто не стоит забивать гвозди микроскопом?wink.gif
Go to the top of the page
 
+Quote Post



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

 


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


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