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

 
 
 
Reply to this topicStart new topic
> at91sam7x256 + Keil. Спецы - ВЫРУЧАЙТЕ, Запись во внутреннюю FLASH -> проблемы
Niger
сообщение Jan 5 2008, 09:16
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810



Всем доброго времени суток!

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

Сделал проектик под Кейлом 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

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

Заране благодарен
Go to the top of the page
 
+Quote Post
Dimentius
сообщение Jan 5 2008, 09:57
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980



прерывания на момент активации записи во флеш запрещены?
процедура записи исполняется из RAM?
Go to the top of the page
 
+Quote Post
Niger
сообщение Jan 5 2008, 11:23
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810



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


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

Если нужно могу выложить фрагменты кода
Go to the top of the page
 
+Quote Post
Dimentius
сообщение Jan 5 2008, 11:45
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 32
Регистрация: 27-09-05
Пользователь №: 8 980



в регистре 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.
Go to the top of the page
 
+Quote Post
Niger
сообщение Jan 5 2008, 12:52
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810



Тут внимательно посмотрел в дизассемблере , оказывается, у меня функции записи лежат во флэше (адреса, начиная с 0x100000). Я же вроде в свойствах их файла указывал, что надо их помещать в IRAM1, который у меня начинается с 0x200000?
Go to the top of the page
 
+Quote Post
Niger
сообщение Jan 10 2008, 08:53
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810



Разобрался я, как писать/читать флэш.

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

Люди добрые, скиньте, плиз рабочий асмовый файл с этим кодом
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 10 2008, 09:23
Сообщение #7


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(Niger @ Jan 10 2008, 11:53) *
Разобрался я, как писать/читать флэш.

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

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

Установить биты I и F в CSPR регистре если на асме писать, то командами msr mrs. Только из USER mode нельзя, надо или сразу в супервизоре разрешать или потом переключаться в system например.
Go to the top of the page
 
+Quote Post
Niger
сообщение Jan 10 2008, 13:50
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810



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 стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться?

Сообщение отредактировал Niger - Jan 10 2008, 13:51
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 10 2008, 15:02
Сообщение #9


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



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

Ну вообще supervisor используется для SWI (software interrupt), поэтому если вы их используете то оставаться в нем нельзя.
Если вы разрешаете прерывания уже после выхода из супервизора, то логичнее переключаться и остваваться в system mode - это тот же user только флагами можно управлять.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jan 10 2008, 15:32
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(KRS @ Jan 10 2008, 18:02) *
Ну вообще supervisor используется для SWI (software interrupt), поэтому если вы их используете то оставаться в нем нельзя.

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

На процессорах класса SAM7 использовать отличные от supervisor режимы смысла не имеет, так как защита отсутствует в принципе.
Go to the top of the page
 
+Quote Post
KRS
сообщение Jan 10 2008, 16:17
Сообщение #11


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(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
Go to the top of the page
 
+Quote Post
Niger
сообщение Jan 23 2008, 14:12
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 29-09-06
Из: Зеленорад
Пользователь №: 20 810



Все, работает!!!

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

Если кому надо тестовый проект, обращайтесь
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 7 2008, 22:46
Сообщение #13


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(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;
.. тут восстановлены.


Работает не зависимо от режима.
Go to the top of the page
 
+Quote Post
Kirill Frolov
сообщение Feb 8 2008, 00:31
Сообщение #14


Частый гость
**

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



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


--------------------
[ZX]
Go to the top of the page
 
+Quote Post
_dem
сообщение Feb 8 2008, 15:04
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



свои пять копеек smile.gif

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

SAM7X256/S256
Go to the top of the page
 
+Quote Post

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

 


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


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