Главная arrow Форум  
20.09.2019 г.
Главная
Проекты
Статьи
Начинающим
Архив новостей
Ссылки
Контакты
Поиск
Файлы
Форум
Карта сайта
Авторизация





Забыли пароль?
Ещё не зарегистрированы? Регистрация
Поддержи наш сайт!
Через WebMoney

 R785211844650
 Z210696637574
 E368177590409

Форум ARV Research
Добро пожаловать, Гость
Пожалуйста Вход или Регистрация.
Забыли пароль?
В ответ на: WinAVR, XRAM и оптимизация (1 просматривает)
_GEN_GOTOBOTTOM Ответить

TOPIC: В ответ на: WinAVR, XRAM и оптимизация

#7513
_dark (Пользователь)
Новичок
Постов: 2
graphgraph
WinAVR, XRAM и оптимизация 04.05.2012 12:34 Репутация: 0  
Прошу помощи ув. ARV или затоков WinAVR

Mega128A + SRAM, WinAVR + AVR Studio 4.18

Задача:
- разместить в XRAM несколько длинных массивов, оставив все остальное во внутренней RAM Mega128A
(во внутренней памяти программа работает, но массивы укорочены).

Что делаю:
1)
- в оболочке WinAVR указываю доп. сегмент .xdata 0x802000
- переопределяю размещение массивов (размерность сокращена)
volatile UCHAR BufAdc1[281] __attribute__ ((section (".xdata")));
volatile UINT BufAdc2[281] __attribute__ ((section (".xdata")));
volatile UINT BufAdc3[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);
*.map Размещение:
.xdata 0x00802000 0x57d Variables.o
0x00802000 BufAdc1
0x00802119 BufAdc2
0x0080234b BufAdc3

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

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

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

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

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

не помогает...
т.е. похоже, что дело не в наезде памяти...

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

но ряд глюков остался(не читаются отдельные переменные по запросам UART),
т.е программа работает нестабильно...

Но так быть не должно! Шаманство какое-то!!!

В чем может быть косяк?
Кто нибудь знает как с ним бороться?
Очень прошу пнуть в нужном направлении!

Содержимое поста отредактировано: _dark, в: 04.05.2012 12:36

Содержимое поста отредактировано: _dark, в: 04.05.2012 12:45
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
#7520
ARV (Администратор)
Администратор
Постов: 2384
graph
В ответ на: WinAVR, XRAM и оптимизация 04.05.2012 20:29 Репутация: 175  
сложно сказать, что у вас не так, не видя кода. но могу предположить, что дело не в массивах и не в месте их размещения. причина может быть гораздо проще: я вижу, что вы указываете размер массива путем "магического" числа. наверняка где-то в программе это магическое число встречается еще не один раз - и где-то наверняка опечатка/ошибка или просто забыли указать правильное его значение, вот у вас и происходят странности. избежать этой проблемы легко, если использовать #define ARR_SZ 1281 , а во всех местах программы, где идет работа с массивами, использовать константу ARR_SZ.
разумеется, может еще быть много причин "странного" поведения программы, внешне не связанных с XRAM - от "забытого" volatile до отсутствия "атомарного2 доступа к переменным типа int или long.

я не исключаю, что и в компиляторе может быть баг - чисто теоретически это может быть.
Не стыдно не знать, стыдно не учиться
  Для добавления сообщений Вы должны зарегистрироваться или авторизоваться.
_GEN_GOTOTOP Ответить
© Copyright 2007 Best of Joomla, Работает на FireBoardполучить последние сообщения прямо на Ваш рабочий стол