Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: МК зависает при попытке чтения буфера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
marco
Здравствуйте.
Имею EVB с LM3S2965 (64КБайт RAM). openocd over ftdi.
В данный момент работаю с флеш. Требуется корректно обработать ситуацию изменения состояния бита '0' -> '1'. Для этого нужно сохранить всю страницу (1Кбайт == unsigned long [32]) во временный буфер, стереть страницу, изменить требуемые данные в буфере и записать буфер на флеш.
При попытке чтения данных из буфера МК зависает. Сам проект мизерный. Игрался с размером буфера: при его резком уменьшении МК работает, но меня это не устраивает. Реализовывать буфер на самой флеш не хочу: это медленно и таким образом можно убить саму флеш.
Доберусь до работы - там в IAR попробую отладить и пробежаться по регистрам.
sonycman
Как копируете? Приведите код.
Может, проблемы с обращением к невыровненным данным? К несуществующему адресу?
marco
Цитата(sonycman @ Jan 8 2011, 15:55) *
Как копируете? Приведите код.
Может, проблемы с обращением к невыровненным данным? К несуществующему адресу?


В прошлом посте ошибся с размерностью буфера. unsigned long [256].

CODE

#define PAGESIZE 0x400
#define MIN_ENTRY_SIZE 0x4
#define ENTRY_PER_PAGE (PAGESIZE / MIN_ENTRY_SIZE)

unsigned long ulBuf[ENTRY_PER_PAGE];

/* Save entire page to buffer */
/*
For example, cuPageAddr == 0x00030000.
Memmap: 0x00000000 - 0x0003FFFF - On-chip flash.
*/
for(usEntry = 0; usEntry < ENTRY_PER_PAGE; usEntry++)
ulBuf[usEntry] = ReadFlash(cuPageAddr + (usEntry * MIN_ENTRY_SIZE));

EraseFlashPage(cuPageAddr);

/* Редактирование буфера
........ */

for(usEntry = 0; usEntry < ENTRY_PER_PAGE; usEntry++) {
/* Data register. Здесь МК зависает. */
HWREG(FLASH_FMD) = ulBuf[usEntry];
....
}


Отлаживал по-разному. В ulBuf корректные данные. Ошибка происходит лишь при использовании достаточно большого буфера, но это всё равно не те цифры, как мне кажется, которые, например, могут исчерпать память или что-то в этом духе.

skripach
Читайте an01237 от TI.
Цитата
При попытке чтения данных из буфера МК зависает.

Зависает при попытке записи во флеш из буфера, если я правильно понял.
marco
Цитата(skripach @ Jan 8 2011, 17:01) *
Читайте an01237 от TI.

Ткните пальцем, пожалуйста. Весь прочёл. Не нашёл ничего похожего, кроме
Цитата
Each word may not be subject to more than a specific number of programming cycles before an
erase cycle is required. In other words, for any given word, FlashProgram can only be called
twice before FlashErase is called.

Не очень понятное ограничение. А именно, непонятно, что имеется в виду под 'programming cycles'.
Я могу сделать
11111111 ->
11111110 ->
11111100 ->
11111000 ->
...
00000000
?

Цитата(skripach @ Jan 8 2011, 17:01) *
Зависает при попытке записи во флеш из буфера, если я правильно понял.

Да, именно так.
skripach
Цитата
Ткните пальцем

Прям ткнуть затрудняюсь, на ламинариях флеш не писал. Непонятно почему вы не пользуйтесь функциями записи во флеш из этого самого an01237 ?
К примеру, не вижу в приведённом вами куске кода установки адреса куда писать, ожидания конца записи?
marco
Цитата(skripach @ Jan 8 2011, 22:11) *
Прям ткнуть затрудняюсь, на ламинариях флеш не писал.

Не могли бы привезти аналогичное описание для вашего МК? Очень бы хотелось хранить настройки прямо на борту.
Цитата(skripach @ Jan 8 2011, 22:11) *
Непонятно почему вы не пользуйтесь функциями записи во флеш из этого самого an01237 ?

В функциях, приведённых в StellarisWare от Luminary нет обработки ситуации, когда нужно в бите '0' обратить обратно в '1' (позволю напомнить, что запись производится по логическому И). Вернее, обработка есть, но она заключается лишь в возврате ошибки, если результат (настоящая информация на флеш) не соответствует ожиданию (данным, записанным а FMD).
В "правильном" случае надо:
1. Посмотреть, стоит ли вобще записывать данные в блок (возможно, записываемое слово идентично уже находящемуся по этому адресу).
2. IF ( <текущие данные в блоке> И <записываемые данные> != <записываемые данные> ), то нужно стереть страницу (сохранив всю страницу, помимо целевого слова), записать страницу на флеш с внесёнными изменениями.
ELSE ( просто записываем слово на флеш без танцев).

Цитата(skripach @ Jan 8 2011, 22:11) *
К примеру, не вижу в приведённом вами куске кода установки адреса куда писать, ожидания конца записи?

Эта часть кода следует за присвоением FMD. Я её опустил, ибо выполнение оной не происходит. Проверяется (мной) расcтавлением return-ов в произвольных места: перед чтением буфера return отрабатывает, после - нет.
scifi
Цитата(marco @ Jan 9 2011, 01:00) *
В функциях, приведённых в StellarisWare от Luminary нет обработки ситуации, когда нужно в бите '0' обратить обратно в '1' (позволю напомнить, что запись производится по логическому И). Вернее, обработка есть, но она заключается лишь в возврате ошибки, если результат (настоящая информация на флеш) не соответствует ожиданию (данным, записанным а FMD).

Прошу прощения за банальность, но Вы, как мне кажется, пытаетесь реализовать эмуляцию EEPROM (EEPROM emulation). Поищите в интернете по этим ключевым словам. На эту проблему нужно смотреть несколько шире, чем просто "0 обратить обратно в 1". Уже давно придуманы разные алгоритмы, оптимальные для различных случаев.
marco
Цитата(scifi @ Jan 9 2011, 01:08) *
Прошу прощения за банальность, но Вы, как мне кажется, пытаетесь реализовать эмуляцию EEPROM (EEPROM emulation). Поищите в интернете по этим ключевым словам. На эту проблему нужно смотреть несколько шире, чем просто "0 обратить обратно в 1". Уже давно придуманы разные алгоритмы, оптимальные для различных случаев.

Да. Именно так. Просто реализация эмуляции EEPROM от Luminary меня совсем не устраивает. Я пишу что-то вроде БД.
skripach
Цитата
В функциях, приведённых в StellarisWare от Luminary нет обработки ситуации,

Ну так реализуйте эту обработку сами, далее по результатам используйте функцию записи со стеранием или без. Почему вы не можете использовать функцию записи во флеш из an01237 так и не понял.
marco
Цитата(skripach @ Jan 9 2011, 02:17) *
Ну так реализуйте эту обработку сами, далее по результатам используйте функцию записи со стеранием или без. Почему вы не можете использовать функцию записи во флеш из an01237 так и не понял.

Фактически, я так делаю (примеры из an01237 плёвые), но по непонятным мне причинам результат таков, что МК зависает.
skripach
Не знаю.
Errat'у смотрели?
Функция из an... тоже виснет?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.