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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> WinAVR & External memory, проблема
BorisRozentsvaig
сообщение Jun 3 2005, 13:19
Сообщение #16


Участник
*

Группа: Свой
Сообщений: 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
Сообщение #17


Участник
*

Группа: Свой
Сообщений: 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
Сообщение #18


Участник
*

Группа: Участник
Сообщений: 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
Dimy
сообщение May 2 2012, 08:13
Сообщение #19


Участник
*

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



Странно,
портится глобальный флаг готовности буфера приема объявленный как
volatile uint8_t fCmdComplite = 0;

прерывание его выставляет = "1", но где то он портится в "0" и в main() он уже "0"...
- свои "сбросы" этого флага убрал...
- его положение сместил в .bss
0x00800248 fCmdComplite

... один ---, т.е. не помогает..

(оптимизация Os)

.... (в 12:15)

Похоже это косяки WinAVR:
при оптимизации -О2 удалось "довести" массивы до 768 единиц!

Шаманство какое-то!!!

Кто нибудь знает как с ним бороться?

..... (18:06)
нет все таки, ряд глюков остался...
наверняка у меня где-то косяк в коде...

кто нибудь знает:
WinAVR при различной оптимизации может валидный код "убивать"?
для IAR, Keil и ICC, что то я таких проблем не припомню...



Сообщение отредактировал Dimy - May 2 2012, 14:14
Go to the top of the page
 
+Quote Post
Dimy
сообщение May 5 2012, 07:13
Сообщение #20


Участник
*

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



В общем проблемма решена.

Для тех кто наступит на те же грабли:
наплюйте на настройки WinAVR через оболочку (Project/Configeration Options)
просто пользуйтесь внешним Makefile с правками по рекомендации:
http://www.avrfreaks.net/index.php?name=PN...ght=winavr+xram


Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 11:53
Рейтинг@Mail.ru


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