Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: at91sam7x256 + Keil. Спецы - ВЫРУЧАЙТЕ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Niger
Всем доброго времени суток!

Проблема в следующем:

Сделал проектик под Кейлом v3.50, в котором происходит заполнение массива из 256 байт (от 0x00 до 0xFF), а затем запись его в страницу внутренней флэш камня.
Брал пример с этого форума, сделанный в IAR, переделал его под кейл...наступил на грабли...

после записи страницы

for (i = 0; i < EFC_PAGE_SIZE_UINT; i++)
*(pflash + i ) = *(pbuf + i);

идут две волшебные строчки:

Строчка1 AT91C_BASE_MC->MC_FCR = (0x5A << 24) | (page << 8 ) |AT91C_MC_FCMD_START_PROG;

Строчка 2 while (!(AT91C_BASE_MC->MC_FSR & AT91C_MC_FRDY));

Так вот, если в отладке ставлю брекпоинт на строчке 2, то страница пишется, а после запуска Run программа нормально выполняется. Если же убираю этот брекпоинт, то выполнение строчки 2 не происходит, и программа вываливается в DAbt_Handler. Без эмулятора, похоже, программа также зависает в этом же месте.
Эмулятор от Segger, устройство - пока на 7X-EK

Кто нить ловил такой глюк?

Заране благодарен
Dimentius
прерывания на момент активации записи во флеш запрещены?
процедура записи исполняется из RAM?
Niger
Цитата(Dimentius @ Jan 5 2008, 12:57) *
прерывания на момент активации записи во флеш запрещены?
процедура записи исполняется из RAM?


Да прерывания отключены (с помошью асмововой функции на уровне ядра)
Функция записи во флеш находится в отдельном файле который кладется в ОЗУ
т.е. по идее функция исполняется из RAM

Если нужно могу выложить фрагменты кода
Dimentius
в регистре MC_FMR поле FMCN правильно задано?

When writing the rest of the Flash, this field defines the number of Master Clock cycles in 1.5 microseconds. This number
must be rounded up.
Niger
Тут внимательно посмотрел в дизассемблере , оказывается, у меня функции записи лежат во флэше (адреса, начиная с 0x100000). Я же вроде в свойствах их файла указывал, что надо их помещать в IRAM1, который у меня начинается с 0x200000?
Niger
Разобрался я, как писать/читать флэш.

Но теперь встал другой вопрос. Как правильно отключить прерывания на уровне ядра?

Люди добрые, скиньте, плиз рабочий асмовый файл с этим кодом
KRS
Цитата(Niger @ Jan 10 2008, 11:53) *
Разобрался я, как писать/читать флэш.

Но теперь встал другой вопрос. Как правильно отключить прерывания на уровне ядра?

Люди добрые, скиньте, плиз рабочий асмовый файл с этим кодом

Установить биты I и F в CSPR регистре если на асме писать, то командами msr mrs. Только из USER mode нельзя, надо или сразу в супервизоре разрешать или потом переключаться в system например.
Niger
KRS, последовал Вашему примеру

Вот кусок файла sam7.s

; Enter User Mode and set its Stack Pointer
;MSR CPSR_c, #Mode_USR
MSR CPSR_c, #Mode_SVC
MOV SP, R0
;SUB SL, SP, #USR_Stack_Size
SUB SL, SP, #SVC_Stack_Size

В общем, я подменил user mode на supervisor. Биты I и F стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться?
KRS
Цитата(Niger @ Jan 10 2008, 16:50) *
В общем, я подменил user mode на supervisor. Биты I и F стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться?

Ну вообще supervisor используется для SWI (software interrupt), поэтому если вы их используете то оставаться в нем нельзя.
Если вы разрешаете прерывания уже после выхода из супервизора, то логичнее переключаться и остваваться в system mode - это тот же user только флагами можно управлять.
aaarrr
Цитата(KRS @ Jan 10 2008, 18:02) *
Ну вообще supervisor используется для SWI (software interrupt), поэтому если вы их используете то оставаться в нем нельзя.

Почему это нельзя?

На процессорах класса SAM7 использовать отличные от supervisor режимы смысла не имеет, так как защита отсутствует в принципе.
KRS
Цитата(aaarrr @ Jan 10 2008, 18:32) *
Почему это нельзя?

На процессорах класса SAM7 использовать отличные от supervisor режимы смысла не имеет, так как защита отсутствует в принципе.


Потому что если используется SWI то
R14_svc = address of next instruction after the SWI instruction
SPSR_svc = CPSR
CPSR[4:0] = 0b10011 /* Enter Supervisor mode */
CPSR[5] = 0 /* Execute in ARM state */
/* CPSR[6] is unchanged */
CPSR[7] = 1 /* Disable normal interrupts */
if high vectors configured then
PC = 0xFFFF0008
else
PC = 0x00000008

соответсвенно LR у вас испортится т.к. проц уже в supervisor mode

Поэтому имеет смысл переключаться и оставаться в system mode
Niger
Все, работает!!!

Всем спасибо.

Если кому надо тестовый проект, обращайтесь
defunct
Цитата(Niger @ Jan 10 2008, 15:50) *
В общем, я подменил user mode на supervisor. Биты I и F стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться?

Можно замаскировать все прерывания через AIC:

Код
unsigned long iMask = pAIC->AIC_IMR;
pAIC->AIC_IDCR = 0xFFFFFFFF;

..... тут прерывания запрещены

pAIC->AIC_IECR = iMask;
.. тут восстановлены.


Работает не зависимо от режима.
Kirill Frolov
Цитата(Dimentius @ Jan 5 2008, 14:45) *
в регистре MC_FMR поле FMCN правильно задано?
When writing the rest of the Flash, this field defines the number of Master Clock cycles in 1.5 microseconds. This number
must be rounded up.


Кстати да. При неправильном задании глюки незабываемые (ввиду того, что к моменту завершения записи
и установки флага FLASH всё ещё находится в нерабочем что ли состоянии -- понять сложно, но валится
чаще в разные аборты). При исправлении этого значения на положенное сбоев нет.
_dem
свои пять копеек smile.gif

При неправильной установке FMCN проявлялись редкие баги с записью в флеш - в одном случае из 10-ти проц после обновления прошивки (удаленной, по сети) не поднимался. Иногда падал при старте, диагноз - испорченная нулевая страница

SAM7X256/S256
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.