Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: IAP в LPC
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Romario
нужно ли копировать код, который вызывает функцию IAP в раму? или не обязательно.
в даташите явно это не написано. мнения разделись. хочется наверняка знать и успокоится.
чтобы не было граблей.

я вот тут попробовал и....
zltigo
Цитата(Romario @ Apr 28 2006, 14:29) *
нужно ли копировать код, который вызывает функцию IAP в раму?

Естественно не нужно.Чем-бы это могло чему-то помочь?
AlexandrY
Грабли будут по любому wink.gif

Цитата(Romario @ Apr 28 2006, 14:59) *
нужно ли копировать код, который вызывает функцию IAP в раму?


Если прямо на вопрос, то толку вызавать IAP из RAM если сам IAP передаст управление опять во FLASH?

А если взглянуть шире, то к любым слухам стоит прислушаться.
IAP в LPC вещь очень ненадежная и странная.
На мой взгляд у них серьезные проблемы с модулем Error Correction Code или контроллером FLASH.
Я например знаю последовательность данных запись которых во FLASH через IAP гарантировано приведет к искажению информации в соседних ячейках. Выражаться будет в том, что в соседней ячейке с записанным 0 и которую при записи совершенно не трогаем возникнет бит 1, который нельзя будет в последствии перезаписать в 0! (ну не считая полного стирания сектора)
Ни отключение MAM, ни отключение PLL, ничего от этого эффекта не помогает. Проверено на нескольких LPC2148, и в разных секторах.
Использование IAP полностью корректное, прерывания отключены, питание стабильное, эффект тоже очень стабильный - 100%-ый.
Процедура использования IAP сверена с тем как делается в примерах у IAR и у Keil, в файловой системе Keil-а и как рекомендует сам Philips. Тонкость в том, что в файловых системах применяется многократная дозапись страниц в сектора FLASH-и. Если писать страницы сразу и не трогать потом, эффект не заметил пока. Но, скажем, знаю разработчиков которые имели проблемы и с однократной постраничной записью.
zltigo
Цитата(AlexandrY @ Apr 29 2006, 16:41) *
Грабли будут по любому wink.gif
....
А если взглянуть шире, то к любым слухам стоит прислушаться.
...

Я например знаю последовательность данных запись которых во FLASH через IAP гарантировано приведет к искажению информации в соседних ячейках.

Ну вот кто-то где-то что-то сказал :-(

1. Давайте сюда эту жуткую последовательность.
2. Городить файловую систему (32K блоки после стирания восстанавливать :-( ) на встроенном FLASH на запись - наверное не стоит по любому.
3. ISP загрузчик сам через ISP (естественно без дозаписи 512 байтовыми страницами а сразу сектором) работает с абсолютно разной информацией и никаких проблем......
AlexandrY
Цитата(zltigo @ Apr 29 2006, 18:54) *
Цитата(AlexandrY @ Apr 29 2006, 16:41) *

Грабли будут по любому wink.gif
....
А если взглянуть шире, то к любым слухам стоит прислушаться.
...

Я например знаю последовательность данных запись которых во FLASH через IAP гарантировано приведет к искажению информации в соседних ячейках.

Ну вот кто-то где-то что-то сказал :-(

1. Давайте сюда эту жуткую последовательность.
2. Городить файловую систему (32K блоки после стирания восстанавливать :-( ) на встроенном FLASH на запись - наверное не стоит по любому.
3. ISP загрузчик сам через ISP (естественно без дозаписи 512 байтовыми страницами а сразу сектором) работает с абсолютно разной информацией и никаких проблем......



Ну например:
При чистом FLASH секторе т.е. где все 0xFF делаете так:
Организуете в RAM буфер скажем на 1024 байт (или 512 , это ничего не изменит )
Весь буфер заполняем 0xFF в конец только припишем по смещению 0x3F8 массив {0x0C, 0x00, 0x00, 0x00}
Записываем буфер (1024 байт) во FLASH по адресу 0x1FС00 используя IAP
Теперь обратно из FLASH по адресу 0x1FC00 считываем в буфер те же 1024 байта и дописываем в буфер по смещению 0x3FС массив {0xF0, 0xF0, 0xF0, 0xF0}
Снова записываем буфер во FLASH по адресу 0x1FС00 используя IAP
Теперь проверяем че там во FLASH записалось и видим по адресу 0x1FFFB байт 0x01
Попытки забить это байт 0-ем ни к чему не приведут.

Таких вариантов могу привести кучу. Эффект проявлялся как в конце сектора FLASH так и в начале и в разных секторах
zltigo
Цитата(AlexandrY @ Apr 29 2006, 19:41) *
Таких вариантов могу привести кучу.

Описано подробно. Проверить легко. Проэкспериментирую.

Цитата
Теперь обратно из FLASH по адресу 0x1FC00 считываем в буфер те же 1024 байта
...

Этот шаг явно ни причем...

Однако! Эксперимент провел. С дозаписью явные проблемы - у меня в результате обнулился
6 бит в 0x1FFF0. Результат другой, но от этого не меннее неприятный. Меня правда никогда не
тянуло дозаписывать во внутренний Flash и теперь уж точно не буду.
Спасибо за информацию.
AlexandrY
Выяснил проблему.
Оказывается Philips всех лоханул.
ECC то его работает на 128 битах, а в мануалах они везде пишут что шить можно по 4-е байта, а на самом деле надо по 16-ть.
На это повелся Keil и написал нерабочую файловую систему для LPC
А за ними и я.
Итак вывод: Во FLASH LPC надо писать блоками данных кратными 16-и байтам и повторно в эти блоки больше ничего записывать нельзя даже если там осталось много FF.
Отсюда видно, что файловую систему типа той что написал Keil в принципе нормально реализовать нельзя для LPC .
Romario
Цитата(AlexandrY @ May 5 2006, 16:44) *
Выяснил проблему.
Оказывается Philips всех лоханул.
ECC то его работает на 128 битах, а в мануалах они везде пишут что шить можно по 4-е байта, а на самом деле надо по 16-ть.
На это повелся Keil и написал нерабочую файловую систему для LPC
А за ними и я.
Итак вывод: Во FLASH LPC надо писать блоками данных кратными 16-и байтам и повторно в эти блоки больше ничего записывать нельзя даже если там осталось много FF.
Отсюда видно, что файловую систему типа той что написал Keil в принципе нормально реализовать нельзя для LPC .


опередили!:))) аккурат я об этом и хотел сегодня написать в этот топик.
вчера проводил экспериментsmile.gif)

p.s. т.к. что то уж смутно верилось в то, что филипок так облажался.
zltigo
Цитата(Romario @ May 5 2006, 18:18) *
p.s. т.к. что то уж смутно верилось в то, что филипок так облажался.

Ну насчет 'облажался' - разве они где-то написали, что можно писать поверх записанного блока???

Цитата
ECC то его работает на 128 битах, а в мануалах они везде пишут что шить можно по 4-е байта, а на самом деле надо по 16-ть.

Ну когда я читал в последний раз мануалы, там было 512 байт и далее кратно.....
В последних на 213x/4x 256 и кратно, так что на счет "везде пишут 4 байта" - нет такого.

Посему наибольшую лажу спорол Keil, родив 'файловую систему'.
AlexandrY
Цитата(zltigo @ May 5 2006, 19:04) *
Ну когда я читал в последний раз мануалы, там было 512 байт и далее кратно.....
В последних на 213x/4x 256 и кратно, так что на счет "везде пишут 4 байта" - нет такого.


Не, видать не поняли. В IAP - да, совать надо страницами по 512 и т.д. байт. Но для файловой системы важнее грануляция секторов на немодифицируемые в дальнейшем ячейки. Для обычных флешей можно модифицировать каждый байт забивая 1-цы нулями. Филипс утверждает что в его флеши это 4-е последовательных байта (смотрите внимательнее мануал где про FLASH) А на самом деле 16-ть и реверс ихнего IAP-а показывает, что за раз они шьют по 16-ть байт.
И была у меня своя линейная файловая система и черт дернул на халяву поиметь совместимую с С99 FS
amusin
Цитата(AlexandrY @ May 5 2006, 22:22) *
Не, видать не поняли. В IAP - да, совать надо страницами по 512 и т.д. байт. Но для файловой системы важнее грануляция секторов на немодифицируемые в дальнейшем ячейки. Для обычных флешей можно модифицировать каждый байт забивая 1-цы нулями. Филипс утверждает что в его флеши это 4-е последовательных байта (смотрите внимательнее мануал где про FLASH) А на самом деле 16-ть и реверс ихнего IAP-а показывает, что за раз они шьют по 16-ть байт.


Действительно, у них в мануале на LPC213x есть ошибка:
A byte of ECC corresponds to every consecutive 128 bits of the user
accessible Flash. Consequently, Flash bytes from 0x0000 0000 to 0x0000 0003 are
protected by the first ECC byte, Flash bytes from 0x0000 0004 to 0x0000 0007 are
protected by the second ECC byte, etc.
Пока все нормально: 4 слова = 16 байт = 128 бит.
Therefore, for the implemented ECC mechanism to perform properly, data must be written
into the Flash memory in groups of 4 bytes (or multiples of 4), aligned as described above.
А вот здесь они опечатались, т.к. described above 16 байт, а не 4.
Спасибо за информацию.
GetSmart
Скажите, кто-нибудь пробовал при программировании флэша в LPC2000 одновременно обрабатывать прерывания? Разумеется обработчик должен быть в ОЗУ. И ещё, я знаю, что есть какое-то недокументированное прерывание (в регистре VICIntEnable, да и в других подобных) для обработки флэша. Кто-нибудь знает какое? Просто я знаю, что все свободные биты в этом регистре (аналогично быту 1) можно использовать для эмуляции аппаратных прерываний. Так вот, мне это надо знать чтобы случайно не напороться на это самое прерывание.
zltigo
Цитата
Скажите, ....

Пишите свой:
http://water.cse.unsw.edu.au/esdk/lpc2/boot-loader.html

А зачем?
GetSmart
Но я не хочу писать ботлоадер. Меня интересует можно ли это сделать на встроенном. Просто, можно или нельзя обрабатывать прерывания?

Зачем? Есть устройство сбора данных. В нём много частотных входов (килогерцовых) и частотных выходов. Так как запись во флэш занимает несколько десятков мс, то это нарушит показания датчиков. Во флэше нужно хранить журнал с показаниями. Такую систему можно сделать на двух последовательно соединённых LPC-шках. А меня интересует, можно ли сделать на одной?
zltigo
Цитата(GetSmart @ May 14 2006, 07:49) *
Но я не хочу писать ботлоадер. Меня интересует можно ли это сделать на встроенном. Просто, можно или нельзя обрабатывать прерывания?

Ну официально, как Вы уже поняли, нельзя. Если "очень хочется" - либо пишите свой(вдруг получится), либо разбирайтесь с родным (вдруг когда "можно"). Для этого и ссылка была дана.
Цитата
Во флэше нужно хранить журнал с показаниями. Такую систему можно сделать на двух последовательно соединённых LPC-шках. А меня интересует, можно ли сделать на одной?

Для этого просто вешается последовательная FLASH/EEPROM на I2C или SPI (можно съемную) а отнюдь не второй контроллер. Заодно и ресурс контроллера не выработаете.....
amusin
Цитата(GetSmart @ May 14 2006, 10:49) *
Просто, можно или нельзя обрабатывать прерывания?


Можно, читаем даташит (у меня на LPC213x)

Interrupts during IAP
The on-chip flash memory is not accessible during erase/write operations. When the user
application code starts executing the interrupt vectors from the user flash area are active.
The user should either disable interrupts, or ensure that user interrupt vectors are active in
RAM and that the interrupt handlers reside in RAM, before making a flash erase/write IAP
call. The IAP code does not use or disable interrupts.
zltigo
Цитата(amusin @ May 16 2006, 07:51) *
Можно, читаем даташит (у меня на LPC213x)

Если это называть 'можно', то что тогда такое 'нельзя' :-(((
GetSmart
Только что проверял прерывания когда обработчик в RAM. Не работает ни стирание сектора, ни запись. Виснет постоянно. Если бы не предыдущее сообщение, то так и забросил бы всё. Однако, я ступил вот в чём. Забыл таблицу векторов разместить в RAM! Какой же я дурак. Щас проверим.

Кто-нибудь, подскажите как разместить вектора в RAM? Как переключить вектора в RAM я знаю. Но как их там заполнить?

Не понял как вставить сюда файл, но только имя. Чтобы скачивать его уже с форума.
GetSmart
Проверил стирание и запись флэш. Ха! Работает! На 100 кГц прерываниях ни одного не потерял!

zltigo, не буду больше Вас слушать!
zltigo
Цитата(GetSmart @ May 16 2006, 11:01) *
zltigo, не буду больше Вас слушать!

Просто я не извращенец. Можете продолжать в своем вкусе.
GetSmart
Цитата
Просто я не извращенец. Можете продолжать в своем вкусе.


Да ладно вам! Это не извращение. Вполне нормальный ход. Тем более не моя идея, а начальник требует всё-всё засунуть в один чип. Я вот до сих пор не могу понять как в IAR 4.2 нормальным методом сделать автоматическое размещение векторов прерываний в ОЗУ. То есть чтобы он их сам из флэша скопировал в ОЗУ. Например чтобы компилятор скопировал процедуру в ОЗУ нужно у неё в заголовке написать __ramfunc. А что написать и где для векторов прерываний? Сгодятся любые предложения! Вообще, у меня вектора прерываний оформлены в отдельном ASM-файле.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.