Перейти к содержанию
    

NXP ARM7 не прописывается последняя запись в Local SRAM

При отладке обнаружил, что последняя запись из команд STR/STM в Local SRAM [0x40000000..0x4000xxxx] не доходит до SRAM. Вероятно все записи (через Internal SRAM Controller) буферизуются и если поступает сигнал Reset, то последняя запись не пропишется при любом ожидании, даже если прочитать из этого же (последнего) адреса. Проблема актуальна только для устройств, при сбросе сохраняющих в памяти какие-то переменные. Проверял на LPC213x и LPC214x. Т.к. не имею ARM7 с DMA, например LPC24xx, то не могу проверить тот же эффект в DMA SRAM. Но эта память работает не через Internal SRAM Controller.

 

Если где-то описана эта фича срам-контроллера, то кто-нибудь подскажите где.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думаю, что сегодя-завтра смогу проэспериментировать на LPC2148, LPC2103 и на LPC2368.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эксперимент провел. Вот такой:

__no_init volatile unsigned long check_wr_value;

 

void check_wr(void)

{

__disable_interrupt();

check_wr_value = 0xCAFEBABE;

check_wr_value = 0xDEADBEEF;

// Watcdog Reset

WDFEED = 0xA5;

}

На двух контроллерах.

На LPC2367 результат правильный:

DEEADBEEF

 

На LPC2148 дурдом:

CAFEBABE

 

Других под рукой не оказалось. Но и с этим понятно, что шляпа :(

 

Повторная запись помогает, как и запись еще куда нибудь.

 

На LPC для входа в загрузчик отродясь использовал прямой переход по адресу, и писал не в память а в scratch регистр UART.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ничего странного. Кэширование записи.

Вы открыли всем нам глаза! А как только быть с тем фактом, что кэша у LPC2148 нет, не было и не будет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эксперимент провел. Вот такой:

На 2148 проверить надо аналогичную запись в регион USB DMA SRAM.

 

check_wr_value = 0xDEADBEEF;

Напоминает пароль CODE0001 в IOHandler-e.

Изменено пользователем GetSmart

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы открыли всем нам глаза! А как только быть с тем фактом, что кэша у LPC2148 нет, не было и не будет?

Ага, не было... Было есть и будет!

8. On-chip Static RAM (SRAM)

The SRAM controller incorporates a write-back buffer in order to prevent CPU stalls

during back-to-back writes. The write-back buffer always holds the last data sent by

software to the SRAM. This data is only written to the SRAM when another write is

requested by software (the data is only written to the SRAM when software does another

write). If a chip reset occurs, actual SRAM contents will not reflect the most recent write

request (i.e. after a "warm" chip reset, the SRAM does not reflect the last write operation).

Any software that checks SRAM contents after reset must take this into account. Two

identical writes to a location guarantee that the data will be present after a Reset.

Alternatively, a dummy write operation before entering idle or power-down mode will

similarly guarantee that the last data written will be present in SRAM after a subsequent

Reset.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага, не было... Было есть и будет!

Забавно. Народ увлёкся экспериментами и забыл почитать мануал. Целую бурю в стакане устроили :biggrin:

Кстати, сейчас вам расскажут, что это вовсе не кэш. Ну и так далее :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Народ увлёкся экспериментами и забыл почитать мануал.

Вот только в мануале на 2478 буфер не упоминается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ага, не было... Было есть и будет!

Здорово! Хорошая все объясняющая цитата. Только ведь, это действительно не кэш :). Хотя бы по той причне, что авторы этого решения НЕ назвали это кэшем.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только ведь, это действительно не кэш :).

Это не кэш, а какой-то косяк разработчиков. Надо было принимать в буфер и тут же записывать в память.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не кэш, а какой-то косяк разработчиков. Надо было принимать в буфер и тут же записывать в память.

И не косяк. Они прияли такое решение и даже, как оказалось, документировали. Хотя, конечно, этому абзацу больше пригодно место в errata, как описание неявных особенностей поведения контролера памяти и способа обхода. В общем случае такое поведение (задержка записи в собственно память на такт записи к памяти) совершенно безобидно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем случае такое поведение (задержка записи в собственно память на такт записи к памяти) совершенно безобидно.

Я с LPC не знаком, просто заинтересовался. Из приведенной выдержки из руководства не следует, что там задержка на такт. Там задержка на целую запись. :rolleyes:

Иначе можно было барьером обойтись.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я с LPC не знаком, просто заинтересовался.

NXP один из самых по максмуму использующих ARM-овские ядра для всего и вся. Не помню уже за давностью лет, но скорее всего там SRAM тоже от ARM и этот эффект соответственно не только у LPC.

Из приведенной выдержки из руководства не следует, что там задержка на такт. Там задержка на целую запись. :rolleyes:

Задержка на такт записи - цикл записи.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...