реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> МК зависает при попытке чтения буфера, cortex-m3 lm3s
marco
сообщение Jan 8 2011, 09:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 12-12-10
Пользователь №: 61 580



Здравствуйте.
Имею EVB с LM3S2965 (64КБайт RAM). openocd over ftdi.
В данный момент работаю с флеш. Требуется корректно обработать ситуацию изменения состояния бита '0' -> '1'. Для этого нужно сохранить всю страницу (1Кбайт == unsigned long [32]) во временный буфер, стереть страницу, изменить требуемые данные в буфере и записать буфер на флеш.
При попытке чтения данных из буфера МК зависает. Сам проект мизерный. Игрался с размером буфера: при его резком уменьшении МК работает, но меня это не устраивает. Реализовывать буфер на самой флеш не хочу: это медленно и таким образом можно убить саму флеш.
Доберусь до работы - там в IAR попробую отладить и пробежаться по регистрам.
Go to the top of the page
 
+Quote Post
sonycman
сообщение Jan 8 2011, 09:55
Сообщение #2


Любитель
*****

Группа: Свой
Сообщений: 1 864
Регистрация: 20-08-06
Из: Тольятти
Пользователь №: 19 695



Как копируете? Приведите код.
Может, проблемы с обращением к невыровненным данным? К несуществующему адресу?
Go to the top of the page
 
+Quote Post
marco
сообщение Jan 8 2011, 10:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 12-12-10
Пользователь №: 61 580



Цитата(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 корректные данные. Ошибка происходит лишь при использовании достаточно большого буфера, но это всё равно не те цифры, как мне кажется, которые, например, могут исчерпать память или что-то в этом духе.

Go to the top of the page
 
+Quote Post
skripach
сообщение Jan 8 2011, 11:01
Сообщение #4


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



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

Зависает при попытке записи во флеш из буфера, если я правильно понял.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
marco
сообщение Jan 8 2011, 14:19
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 12-12-10
Пользователь №: 61 580



Цитата(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) *
Зависает при попытке записи во флеш из буфера, если я правильно понял.

Да, именно так.

Сообщение отредактировал marco - Jan 8 2011, 14:21
Go to the top of the page
 
+Quote Post
skripach
сообщение Jan 8 2011, 16:11
Сообщение #6


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
Ткните пальцем

Прям ткнуть затрудняюсь, на ламинариях флеш не писал. Непонятно почему вы не пользуйтесь функциями записи во флеш из этого самого an01237 ?
К примеру, не вижу в приведённом вами куске кода установки адреса куда писать, ожидания конца записи?


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
marco
сообщение Jan 8 2011, 19:00
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 12-12-10
Пользователь №: 61 580



Цитата(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 отрабатывает, после - нет.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 8 2011, 19:08
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Прошу прощения за банальность, но Вы, как мне кажется, пытаетесь реализовать эмуляцию EEPROM (EEPROM emulation). Поищите в интернете по этим ключевым словам. На эту проблему нужно смотреть несколько шире, чем просто "0 обратить обратно в 1". Уже давно придуманы разные алгоритмы, оптимальные для различных случаев.
Go to the top of the page
 
+Quote Post
marco
сообщение Jan 8 2011, 19:33
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 12-12-10
Пользователь №: 61 580



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

Да. Именно так. Просто реализация эмуляции EEPROM от Luminary меня совсем не устраивает. Я пишу что-то вроде БД.

Сообщение отредактировал marco - Jan 8 2011, 19:34
Go to the top of the page
 
+Quote Post
skripach
сообщение Jan 8 2011, 20:17
Сообщение #10


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Цитата
В функциях, приведённых в StellarisWare от Luminary нет обработки ситуации,

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


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
marco
сообщение Jan 8 2011, 20:37
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 12-12-10
Пользователь №: 61 580



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

Фактически, я так делаю (примеры из an01237 плёвые), но по непонятным мне причинам результат таков, что МК зависает.
Go to the top of the page
 
+Quote Post
skripach
сообщение Jan 8 2011, 21:11
Сообщение #12


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Не знаю.
Errat'у смотрели?
Функция из an... тоже виснет?


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 13:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01469 секунд с 7
ELECTRONIX ©2004-2016