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

 
 
> ARM920T - MMU, AT91RM9200 доступ к глобальной переменной
Arischenko Ivan
сообщение Oct 4 2010, 08:21
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768



Добрый день.
Запрограммирована таблица 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, объявленный глобально. В описанном коде переменная не меняется, такое ощущение что достается из кэша. Если область памяти, где находится программа объявить не кэшируемой и не буфферизируемой, то код начинает работать как надо.
Самое простое решение - вынести переменную в область памяти, объявленной не кэшируемой и не буфферизируемой или есть другое решение?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
sergeeff
сообщение Oct 4 2010, 08:47
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Я тоже именно так поступаю в аналогичных случаях.
Go to the top of the page
 
+Quote Post
MALLOY2
сообщение Oct 4 2010, 09:53
Сообщение #3


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Если этот массив заполняет DMA (PDC в случае атмела) то возникает такой эффект, буфер нужно делать не кешируемым или инвалидатить кеш в области этого буфера, что в большинстве случаев геморой.
Go to the top of the page
 
+Quote Post
Arischenko Ivan
сообщение Oct 5 2010, 08:51
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768



Спасибо за ответы.

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

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

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

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

И все заработало, как должно.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Oct 5 2010, 11:35
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Еще надо на забыть исключить этот регион из таблиц кеша при его настройке.
Go to the top of the page
 
+Quote Post
Arischenko Ivan
сообщение Oct 5 2010, 20:16
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 112
Регистрация: 29-10-06
Пользователь №: 21 768



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


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

Но вылезла другая проблема = теперь бинарник увеличился на 1Мб, т.е. на размер страницы из-за того что не кэшируемая переменная вынесена в другую страницу.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th June 2025 - 11:46
Рейтинг@Mail.ru


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