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

 
 
> WinAVR & External memory, проблема
Axer
сообщение May 24 2005, 08:28
Сообщение #1





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



Здравствуйте. У меня проблема с внешней памятью при работе с АтМега64.
Есть программа, рабочая. При подключении внешней памяти начинаются непонятные ошибки, причем ошибки начинаются при выполнении команды memmove() или при выполнении функции вывода строки:
Код
while (*s) ce210_send(*s++);

Вот строчка в мейкфайле, где включаю память, и потом флаги:
Код
EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x8090ff
   ASFLAGS = -Wa,-ahlms=$(<:%.S=lst/%.lst),-gstabs -mmcu=$(MCU)
   CPFLAGS = -MMD -g -O$(OPT) -funsigned-char -funsigned-bitfields -fpack-struct -Wall -Wstrict-prototypes -Wa,-ahlms=$(<:%.c=lst/%.lst) -mmcu=$(MCU) $(CDEFS)
   LDFLAGS = -Wl,-Map=lst/$(TRG).map,--cref, -L$(LIBDIR), $(EXTMEMOPTS) -lm -mmcu=$(MCU)

Вот инициализация в программе:
Код
   setreg(MCUCR, SRE, 1);    // enable external memory (xram)
   setreg(MCUCR, SRW10, 1);                      // configure xram
   XMCRA = _BV(SRW00) | _BV(SRW01) | _BV(SRW11); //

Видно, что проблемы именно с памятью, но вот только где конкретно, не могу понять.
Что не так?
P.S. Версия ВинАВР последняя.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
pulsar-17
сообщение Jun 3 2005, 11:18
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 7-12-04
Из: Московская область
Пользователь №: 1 376



можно и без volatile:

void ce210_print(char *s)
{
register char ch;

while (1)
{
ch = *s;
if (ch == 0) break; //(или return)
ce210_send(ch);
s++;
}
}

при while (*a) ce210_send(*a++); да еще и volatile будет скорее всего 2 обращения к памяти, что в данном случае бессмысленно
Go to the top of the page
 
+Quote Post
BorisRozentsvaig
сообщение Jun 3 2005, 13:19
Сообщение #3


Участник
*

Группа: Свой
Сообщений: 36
Регистрация: 23-03-05
Из: Санкт-Петербург
Пользователь №: 3 617



Цитата(pulsar-17 @ Jun 3 2005, 15:18)
можно и без volatile:

void ce210_print(char *s)
{
  register char ch;

   while (1)
     {
        ch = *s;
        if (ch == 0) break; //(или return)
        ce210_send(ch);
        s++;
     }
}

при while (*a) ce210_send(*a++); да еще и volatile будет скорее всего 2 обращения к памяти, что в данном случае бессмысленно
*


Через register тоже можно, не спорю. Но в данном случае главное не скорость, а чтобы заработало :-)
volatile - это для общности.... smile.gif
Go to the top of the page
 
+Quote Post
pulsar-17
сообщение Jun 4 2005, 06:33
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 32
Регистрация: 7-12-04
Из: Московская область
Пользователь №: 1 376



Цитата(BorisRozentsvaig @ Jun 3 2005, 16:19)
Через register тоже можно, не спорю. Но в данном случае главное не скорость, а чтобы заработало :-)
volatile - это для общности.... smile.gif
*


Согласен, но мой вариант более предсказуем с точки зрения компилятора (GCC). И в дизассемблере с ним проще разобраться.

Axer, дизассемблируйте Ващу функцию и посмотрите чего там скомпилилос. Я неоднократно нарывался на "неправильный код"(сам был виноват), т.к. GCC очень требователен к конструкциям языка.
Проверьте, какое значение указателя записывается перед вызовом функции и
что находится по этому указателю.
Да и стоит ли на текстовые сообщения ОЗУ тратить? У меня они только во флеше сидят.
#include <avr\io.h>
#include <avr\pgmspace.h>

const prog_char str[] = "test message";

void print(const prog_char *s)
{
char ch;

while(1)
{
ch = pgm_read_byte(s);
if (ch == 0) break;
PORTA = ch;
s++;
}
}

int main (void)
{

print(str);

print(PSTR("TEST2"));//или так

return 0;
}
Go to the top of the page
 
+Quote Post
Dimy
сообщение May 2 2012, 04:44
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 14-05-09
Из: Москва
Пользователь №: 49 084



Поднимаю тему, чтобы не плодить новых.

Задача:
- разместить в XRAM несколько длинных массивы, оставив все остальное во внутренней RAM

Во внутренней памяти все работает.

Что делаю:
1)
- в оболочке WinAVR указываю доп. сегмент .xdata 0x802000
- переопределяю размещение массивов (размерность сокращена)
volatile UCHAR BufAdc[281] __attribute__ ((section (".xdata")));
volatile UINT BufAdc1[281] __attribute__ ((section (".xdata")));
volatile UINT BufAdc2[281] __attribute__ ((section (".xdata")));
- разрешаю работу XRAM (тайменги и конфиг. XRAM сути не меняют, но привожу)
MCUCR = (1<<SRE) | (0<<SRW10);
XMCRA = (0<<SRL2) | (0<<SRL1) | (0<<SRL0) | (0<<SRW01) | (0<<SRW00) | (0<<SRW11);
XMCRB = (0<<XMBK) | (0<<XMM2) | (0<<XMM1) | (0<<XMM0);
Размещение:
.xdata 0x00802000 0x57d Variables.o
0x00802000 BufAdc
0x00802119 BufAdc1
0x0080234b BufAdc2

Это работает!

2)
Увеличиваю размерность одного массива до нужного (в *.h как extern естественно тоже), остальное без изменений.
volatile UCHAR BufAdc[1281] __attribute__ ((section (".xdata")));
Размещение:
.xdata 0x00802000 0x965 variables.o
0x00802000 BufAdc
0x00802501 BufAdc1
0x00802733 BufAdc2

Не работает, точнее слетает связь по UART!
Смотрю по map - все остальные переменные находятся на своих местах, т.е. не менялись...
Эти массивы в работе UART при ответах естественно не участвуют.
Возвращаю размер на обратно - работает!

В чем мой косяк?
Прошу пнуть в нужном направлении.

(Mega128A + SRAM, WinAVR + AVR Studio 4.18)

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Axer   WinAVR & External memory   May 24 2005, 08:28
- - BorisRozentsvaig   Цитата(Axer @ May 24 2005, 12:28)Здравствуйте...   May 24 2005, 08:34
- - Axer   ЦитатаА каким образом у вас "s" объявлен...   May 24 2005, 09:17
- - pulsar-17   Возможно проблема в __heap_end=0x8090ff как я пон...   May 24 2005, 09:18
- - Axer   Нет, не в этом дело Да и не мог указатель так дал...   May 24 2005, 10:37
|- - BorisRozentsvaig   Цитата(Axer @ May 24 2005, 14:37)Нет, не в эт...   May 24 2005, 13:23
- - Axer   ЦитатаВы не ответили на вопрос: каким образом у ва...   May 25 2005, 11:26
|- - BorisRozentsvaig   Цитата(Axer @ May 25 2005, 15:26)ЦитатаВы не ...   May 25 2005, 12:34
- - Axer   так: ce210_print("string"); или так: cha...   May 25 2005, 12:45
|- - BorisRozentsvaig   Цитата(Axer @ May 25 2005, 16:45)так: ce210_p...   May 25 2005, 14:30
- - Axer   Цитата(BorisRozentsvaig @ May 25 2005, 17:30)...   May 26 2005, 07:14
|- - BorisRozentsvaig   А что, если вам попробовать запустить для начала т...   May 26 2005, 08:10
- - Axer   Сделал тест памяти. Все работает. С указателями си...   Jun 1 2005, 09:47
|- - BorisRozentsvaig   Цитата(Axer @ Jun 1 2005, 13:47)Сделал тест п...   Jun 3 2005, 06:10
- - Dimy   Странно, портится глобальный флаг готовности буфер...   May 2 2012, 08:13
- - Dimy   В общем проблемма решена. Для тех кто наступит на...   May 5 2012, 07:13


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

 


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


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