|
|
  |
LPC, время доступа к внутренней RAM |
|
|
|
Jan 15 2013, 15:43
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(toweroff @ Jan 15 2013, 18:18)  без оптимизации внешний девайс прекрасно работает на внешней шине асинхронной, с O3 & Time свистопляска какая-то  Было такое, на 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 } А еще гляньте осциллографом временные диаграммы на шине ...
|
|
|
|
|
Jan 15 2013, 17:41
|

Гуру
     
Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514

|
Цитата(kovigor @ Jan 15 2013, 19:43)  Было такое, на LPC и с Кейлом. Почти наверняка дело не в скорости доступа к ОЗУ, а в оптимизации. так в оптимизации и дело  Нет, у меня никак программно функции задержки не делаются. Там, похоже, дело в том, что девайсу нужно "отдохнуть" около 70нс после доступа. Если код не оптимизировать, то оно как раз и получалось. Как только перекинул функции в RAMFUNC (они будут обслуживать бутлоадер), так и начались пляски Вот теперь сижу и NOP вставляю, но все равно как-то мутно  Возможно, дело связано с компилятором, он неверно воспринимает описание доступа к памяти (как вариант) У меня сидит внешняя 32-разрядная SRAM на CS4, на CS0 сидит девайс Я передаю указатель как (void*), а в функциях чтения/записи в девайс присваиваю его указателю на (volatile unsigned int*) Интересно, но часть команд, котрые обращаются к внутренней SRAM, отрабатываются. Как только лезу к внешней - начинаются проблемы с девайсом уже, он не передает то, что в него пишется. Сейчас проверю осциллом, что там происходит, но часть команд отрабатывается, часть - нет, особенно, когда уже начинаю гнать блоки по 50-100 КБ Однако, если просто гонять туда-сюда данные от девайса и к нему, все в порядке с любой оптимизацией
|
|
|
|
|
Jan 15 2013, 18:16
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(toweroff @ Jan 15 2013, 20:41)  Там, похоже, дело в том, что девайсу нужно "отдохнуть" около 70нс после доступа. Если код не оптимизировать, то оно как раз и получалось. Как только перекинул функции в RAMFUNC (они будут обслуживать бутлоадер), так и начались пляски Функции из RAM обычно (но не всегда) выполняются быстрее, чем из Flash, даже без всякой оптимизации. Вообще, смотреть надо. Может, у вас ошибка в программе, в результате которой переполняется какой-то массив или стек. Или параметры контроллера внешнего ОЗУ некорректно выставлены. Или плата некорректно разведена. Отключайте блоки кода по одному, смотрите, что и как меняется, и думайте, думайте ... P.S. Посмотрите .map - файл и узнайте, какие переменные где разместились. Возможно, у вас внешнее ОЗУ расположено не там, где его предполагает размещенным компилятор ...
|
|
|
|
|
Jan 23 2013, 05:53
|
Участник

Группа: Участник
Сообщений: 22
Регистрация: 26-03-05
Пользователь №: 3 697

|
Если данные туда-сюда пишутся нормально проблема гдето в коде скорее всего ошибка. Посмотрите може еще гденибуть volatile забыли вставить, он переменную какуюнибуть оптимизирует что приводит к ошибке.Если есть подозрение на стек - объявите часть локальных перемнных как static - это выкинет их в область глобальных переменных.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|