GetSmart 0 24 октября, 2015 Опубликовано 24 октября, 2015 · Жалоба При отладке обнаружил, что последняя запись из команд STR/STM в Local SRAM [0x40000000..0x4000xxxx] не доходит до SRAM. Вероятно все записи (через Internal SRAM Controller) буферизуются и если поступает сигнал Reset, то последняя запись не пропишется при любом ожидании, даже если прочитать из этого же (последнего) адреса. Проблема актуальна только для устройств, при сбросе сохраняющих в памяти какие-то переменные. Проверял на LPC213x и LPC214x. Т.к. не имею ARM7 с DMA, например LPC24xx, то не могу проверить тот же эффект в DMA SRAM. Но эта память работает не через Internal SRAM Controller. Если где-то описана эта фича срам-контроллера, то кто-нибудь подскажите где. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 24 октября, 2015 Опубликовано 24 октября, 2015 · Жалоба http://electronix.ru/forum/index.php?showtopic=131171 то же? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 24 октября, 2015 Опубликовано 24 октября, 2015 · Жалоба Думаю, что сегодя-завтра смогу проэспериментировать на LPC2148, LPC2103 и на LPC2368. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 24 октября, 2015 Опубликовано 24 октября, 2015 · Жалоба Эксперимент провел. Вот такой: __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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alechek 0 26 октября, 2015 Опубликовано 26 октября, 2015 · Жалоба Ничего странного. Кэширование записи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 26 октября, 2015 Опубликовано 26 октября, 2015 · Жалоба Ничего странного. Кэширование записи. Вы открыли всем нам глаза! А как только быть с тем фактом, что кэша у LPC2148 нет, не было и не будет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 26 октября, 2015 Опубликовано 26 октября, 2015 (изменено) · Жалоба Эксперимент провел. Вот такой: На 2148 проверить надо аналогичную запись в регион USB DMA SRAM. check_wr_value = 0xDEADBEEF; Напоминает пароль CODE0001 в IOHandler-e. Изменено 26 октября, 2015 пользователем GetSmart Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alechek 0 26 октября, 2015 Опубликовано 26 октября, 2015 · Жалоба Вы открыли всем нам глаза! А как только быть с тем фактом, что кэша у 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 26 октября, 2015 Опубликовано 26 октября, 2015 · Жалоба Ага, не было... Было есть и будет! Забавно. Народ увлёкся экспериментами и забыл почитать мануал. Целую бурю в стакане устроили Кстати, сейчас вам расскажут, что это вовсе не кэш. Ну и так далее :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 26 октября, 2015 Опубликовано 26 октября, 2015 · Жалоба Народ увлёкся экспериментами и забыл почитать мануал. Вот только в мануале на 2478 буфер не упоминается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 26 октября, 2015 Опубликовано 26 октября, 2015 · Жалоба Ага, не было... Было есть и будет! Здорово! Хорошая все объясняющая цитата. Только ведь, это действительно не кэш :). Хотя бы по той причне, что авторы этого решения НЕ назвали это кэшем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 октября, 2015 Опубликовано 26 октября, 2015 · Жалоба Только ведь, это действительно не кэш :). Это не кэш, а какой-то косяк разработчиков. Надо было принимать в буфер и тут же записывать в память. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 26 октября, 2015 Опубликовано 26 октября, 2015 · Жалоба Это не кэш, а какой-то косяк разработчиков. Надо было принимать в буфер и тут же записывать в память. И не косяк. Они прияли такое решение и даже, как оказалось, документировали. Хотя, конечно, этому абзацу больше пригодно место в errata, как описание неявных особенностей поведения контролера памяти и способа обхода. В общем случае такое поведение (задержка записи в собственно память на такт записи к памяти) совершенно безобидно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 октября, 2015 Опубликовано 26 октября, 2015 · Жалоба В общем случае такое поведение (задержка записи в собственно память на такт записи к памяти) совершенно безобидно. Я с LPC не знаком, просто заинтересовался. Из приведенной выдержки из руководства не следует, что там задержка на такт. Там задержка на целую запись. :rolleyes: Иначе можно было барьером обойтись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 26 октября, 2015 Опубликовано 26 октября, 2015 · Жалоба Я с LPC не знаком, просто заинтересовался. NXP один из самых по максмуму использующих ARM-овские ядра для всего и вся. Не помню уже за давностью лет, но скорее всего там SRAM тоже от ARM и этот эффект соответственно не только у LPC. Из приведенной выдержки из руководства не следует, что там задержка на такт. Там задержка на целую запись. :rolleyes: Задержка на такт записи - цикл записи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться