Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ARM920T - MMU
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Arischenko Ivan
Добрый день.
Запрограммирована таблица TTB, реальные адреса совпадают с реальными.
Цитата
for (i = 0; i < 4096; ++i)
pTranslationTable[i] = ((i << 20) + 0x12);


Включено : MMU, I-cache, D-cache
Область памяти, где находится программа объявлена кэшируемой и буферизируемой.
Цитата
pTranslationTable[0x21f] += (1<<2) + (1<<3);

Есть код :
Цитата
AT91F_US_ReceiveFrame(COM3,(char *)message,5,0,0);

if ((message[0]==(char)0x73) & (message[1]==(char)0x74) & (message[2]==(char)0x61) & (message[3]==(char)0x72) & (message[4]==(char)0x74))AT91C_BASE_PIOA->PIO_CODR |= ( LED_USER ) ;
if ((message[0]==(char)0x73) & (message[1]==(char)0x74) & (message[2]==(char)0x6F) & (message[3]==(char)0x70)) AT91C_BASE_PIOA->PIO_SODR |= ( LED_USER ) ;

AT91F_US_SendFrame(COM3,(char *)message,5,0,0);

переменная message -> массив char, объявленный глобально. В описанном коде переменная не меняется, такое ощущение что достается из кэша. Если область памяти, где находится программа объявить не кэшируемой и не буфферизируемой, то код начинает работать как надо.
Самое простое решение - вынести переменную в область памяти, объявленной не кэшируемой и не буфферизируемой или есть другое решение?
sergeeff
Я тоже именно так поступаю в аналогичных случаях.
MALLOY2
Если этот массив заполняет DMA (PDC в случае атмела) то возникает такой эффект, буфер нужно делать не кешируемым или инвалидатить кеш в области этого буфера, что в большинстве случаев геморой.
Arischenko Ivan
Спасибо за ответы.

Я решил следующим образом :

1. добавил в скрипт линкера дополнительную область и секцию.
Цитата
noncache : ORIGIN = 0x22000000 , LENGTH = 1M

.ncdata : {
_ncdata = . ;
*(.ncdata)
. = ALIGN(4);
_ncdata = . ;
} > noncache

И объявил массив в этой секции :
Цитата
char __attribute__ ((section (".ncdata"))) message[80];

И все заработало, как должно.
sergeeff
Еще надо на забыть исключить этот регион из таблиц кеша при его настройке.
Arischenko Ivan
Цитата(sergeeff @ Oct 5 2010, 15:35) *
Еще надо на забыть исключить этот регион из таблиц кеша при его настройке.


У меня по умолчанию объявляется кэшируемой только одна страница.

Но вылезла другая проблема = теперь бинарник увеличился на 1Мб, т.е. на размер страницы из-за того что не кэшируемая переменная вынесена в другую страницу.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.