Перейти к содержанию
    

at91sam7x256 + Keil. Спецы - ВЫРУЧАЙТЕ

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

 

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

 

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

 

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

 

Заране благодарен

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прерывания на момент активации записи во флеш запрещены?

процедура записи исполняется из RAM?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

прерывания на момент активации записи во флеш запрещены?

процедура записи исполняется из RAM?

 

Да прерывания отключены (с помошью асмововой функции на уровне ядра)

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

т.е. по идее функция исполняется из RAM

 

Если нужно могу выложить фрагменты кода

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в регистре 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тут внимательно посмотрел в дизассемблере , оказывается, у меня функции записи лежат во флэше (адреса, начиная с 0x100000). Я же вроде в свойствах их файла указывал, что надо их помещать в IRAM1, который у меня начинается с 0x200000?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем, я подменил user mode на supervisor. Биты I и F стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться?

Ну вообще supervisor используется для SWI (software interrupt), поэтому если вы их используете то оставаться в нем нельзя.

Если вы разрешаете прерывания уже после выхода из супервизора, то логичнее переключаться и остваваться в system mode - это тот же user только флагами можно управлять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну вообще supervisor используется для SWI (software interrupt), поэтому если вы их используете то оставаться в нем нельзя.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

На процессорах класса 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Если кому надо тестовый проект, обращайтесь

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем, я подменил user mode на supervisor. Биты I и F стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться?

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

 

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

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

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

 

Работает не зависимо от режима.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в регистре 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 всё ещё находится в нерабочем что ли состоянии -- понять сложно, но валится

чаще в разные аборты). При исправлении этого значения на положенное сбоев нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

свои пять копеек :)

 

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

 

SAM7X256/S256

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...