Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
toweroff
Добрый день всем!
Что-то в даташите не найду сабжа. Понятно, что в DC разделе, но не вижу...
Где обычно NXP такие вещи указывает?
Мне б примерно, от CCLK отталкиваясь, посмотреть, сколько NOP займет

Там пляски с бубном какие-то... без оптимизации внешний девайс прекрасно работает на внешней шине асинхронной, с O3 & Time свистопляска какая-то sad.gif
kovigor
Цитата(toweroff @ Jan 15 2013, 18:18) *
без оптимизации внешний девайс прекрасно работает на внешней шине асинхронной, с O3 & Time свистопляска какая-то sad.gif

Было такое, на LPC и с Кейлом. Почти наверняка дело не в скорости доступа к ОЗУ, а в оптимизации. Запретите компилятору оптимизировать, например, процедуры, формирующие временные диаграммы на шине. Для этого перед не допускающим оптимизации кодом напишите:

Код
#pragma O0

потом, если нужно, снова включите оптимизацию:

Код
#pragma O3

Например:

Код
//установка бита GPNVM[0..2].
//В случае успеха возвращает "0", в случае ошибки возвращает "1"
unsigned int set_gpnvm_bit(unsigned int gpnvm_bit_to_set)
{
#pragma O0
unsigned int i;

*AT91C_EFC_FCR = (0x5a000000 | (gpnvm_bit_to_set << 8) | 0x0b);
i = 0;
while ((i & 0x00000001) == 0) i = (*AT91C_EFC_FSR);
//Проверяем, не было ли ошибки (для этой команды
//возможна только одна ошибка: "Bad command")
if (i & 0x00000002) return 1; else return 0;
#pragma O3
}


А еще гляньте осциллографом временные диаграммы на шине ...
toweroff
Цитата(kovigor @ Jan 15 2013, 19:43) *
Было такое, на LPC и с Кейлом. Почти наверняка дело не в скорости доступа к ОЗУ, а в оптимизации.

так в оптимизации и дело sm.gif
Нет, у меня никак программно функции задержки не делаются. Там, похоже, дело в том, что девайсу нужно "отдохнуть" около 70нс после доступа. Если код не оптимизировать, то оно как раз и получалось. Как только перекинул функции в RAMFUNC (они будут обслуживать бутлоадер), так и начались пляски
Вот теперь сижу и NOP вставляю, но все равно как-то мутно sad.gif

Возможно, дело связано с компилятором, он неверно воспринимает описание доступа к памяти (как вариант)
У меня сидит внешняя 32-разрядная SRAM на CS4, на CS0 сидит девайс

Я передаю указатель как (void*), а в функциях чтения/записи в девайс присваиваю его указателю на (volatile unsigned int*)
Интересно, но часть команд, котрые обращаются к внутренней SRAM, отрабатываются. Как только лезу к внешней - начинаются проблемы с девайсом уже, он не передает то, что в него пишется. Сейчас проверю осциллом, что там происходит, но часть команд отрабатывается, часть - нет, особенно, когда уже начинаю гнать блоки по 50-100 КБ
Однако, если просто гонять туда-сюда данные от девайса и к нему, все в порядке с любой оптимизацией
kovigor
Цитата(toweroff @ Jan 15 2013, 20:41) *
Там, похоже, дело в том, что девайсу нужно "отдохнуть" около 70нс после доступа. Если код не оптимизировать, то оно как раз и получалось. Как только перекинул функции в RAMFUNC (они будут обслуживать бутлоадер), так и начались пляски

Функции из RAM обычно (но не всегда) выполняются быстрее, чем из Flash, даже без всякой оптимизации. Вообще, смотреть надо. Может, у вас ошибка в программе, в результате которой переполняется какой-то массив или стек. Или параметры контроллера внешнего ОЗУ некорректно выставлены. Или плата некорректно разведена. Отключайте блоки кода по одному, смотрите, что и как меняется, и думайте, думайте ...
P.S. Посмотрите .map - файл и узнайте, какие переменные где разместились. Возможно, у вас внешнее ОЗУ расположено не там, где его предполагает размещенным компилятор ...
toweroff
Цитата(kovigor @ Jan 15 2013, 22:16) *
Функции из RAM обычно (но не всегда) выполняются быстрее, чем из Flash, даже без всякой оптимизации.

разумеется, отсюда и бубен sm.gif

Цитата(kovigor @ Jan 15 2013, 22:16) *
Вообще, смотреть надо...
и думайте, думайте ..

тем и заняты
Hamster1979
Если данные туда-сюда пишутся нормально проблема гдето в коде скорее всего ошибка. Посмотрите може еще гденибуть volatile забыли вставить, он переменную какуюнибуть оптимизирует что приводит к ошибке.Если есть подозрение на стек - объявите часть локальных перемнных как static - это выкинет их в область глобальных переменных.
SyncLair
Я конечно не супер эксперт, но кажется что частота работы внутренней ОЗУ всегда равна частоте процессора.
Конечно исключения могут быть если шину занял DMA.
toweroff
Все было хитрее
Настроить паузы между выборками из памяти можно и через ESMC (External Static Memory Controller)
Но! Только для конкретного банка!Если после этого делать обращение к другому банку, то паузы нет!
В результате, добавилось 2 NOP'а перед началом доступа к девайсу после доступа к памяти, и все завертелось. Почему-то девайсу нужна была пауза даже не столько между собственными /CS, сколько просто между /RD и /WR, пусть и чужими wacko.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.