niger 0 5 января, 2008 Опубликовано 5 января, 2008 · Жалоба Всем доброго времени суток! Проблема в следующем: Сделал проектик под Кейлом 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 0 5 января, 2008 Опубликовано 5 января, 2008 · Жалоба прерывания на момент активации записи во флеш запрещены? процедура записи исполняется из RAM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niger 0 5 января, 2008 Опубликовано 5 января, 2008 · Жалоба прерывания на момент активации записи во флеш запрещены? процедура записи исполняется из RAM? Да прерывания отключены (с помошью асмововой функции на уровне ядра) Функция записи во флеш находится в отдельном файле который кладется в ОЗУ т.е. по идее функция исполняется из RAM Если нужно могу выложить фрагменты кода Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dimentius 0 5 января, 2008 Опубликовано 5 января, 2008 · Жалоба в регистре 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 0 5 января, 2008 Опубликовано 5 января, 2008 · Жалоба Тут внимательно посмотрел в дизассемблере , оказывается, у меня функции записи лежат во флэше (адреса, начиная с 0x100000). Я же вроде в свойствах их файла указывал, что надо их помещать в IRAM1, который у меня начинается с 0x200000? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niger 0 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Разобрался я, как писать/читать флэш. Но теперь встал другой вопрос. Как правильно отключить прерывания на уровне ядра? Люди добрые, скиньте, плиз рабочий асмовый файл с этим кодом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Разобрался я, как писать/читать флэш. Но теперь встал другой вопрос. Как правильно отключить прерывания на уровне ядра? Люди добрые, скиньте, плиз рабочий асмовый файл с этим кодом Установить биты I и F в CSPR регистре если на асме писать, то командами msr mrs. Только из USER mode нельзя, надо или сразу в супервизоре разрешать или потом переключаться в system например. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
niger 0 10 января, 2008 Опубликовано 10 января, 2008 (изменено) · Жалоба 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 стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться? Изменено 10 января, 2008 пользователем Niger Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба В общем, я подменил user mode на supervisor. Биты I и F стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться? Ну вообще supervisor используется для SWI (software interrupt), поэтому если вы их используете то оставаться в нем нельзя. Если вы разрешаете прерывания уже после выхода из супервизора, то логичнее переключаться и остваваться в system mode - это тот же user только флагами можно управлять. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 64 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Ну вообще supervisor используется для SWI (software interrupt), поэтому если вы их используете то оставаться в нем нельзя. Почему это нельзя? На процессорах класса SAM7 использовать отличные от supervisor режимы смысла не имеет, так как защита отсутствует в принципе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 10 января, 2008 Опубликовано 10 января, 2008 · Жалоба Почему это нельзя? На процессорах класса 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 0 23 января, 2008 Опубликовано 23 января, 2008 · Жалоба Все, работает!!! Всем спасибо. Если кому надо тестовый проект, обращайтесь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 7 февраля, 2008 Опубликовано 7 февраля, 2008 · Жалоба В общем, я подменил user mode на supervisor. Биты I и F стали управляемыим. Вопрос. В принципе, в этом режиме можно и остаться? Можно замаскировать все прерывания через AIC: unsigned long iMask = pAIC->AIC_IMR; pAIC->AIC_IDCR = 0xFFFFFFFF; ..... тут прерывания запрещены pAIC->AIC_IECR = iMask; .. тут восстановлены. Работает не зависимо от режима. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
fk0 0 8 февраля, 2008 Опубликовано 8 февраля, 2008 · Жалоба в регистре 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 0 8 февраля, 2008 Опубликовано 8 февраля, 2008 · Жалоба свои пять копеек :) При неправильной установке FMCN проявлялись редкие баги с записью в флеш - в одном случае из 10-ти проц после обновления прошивки (удаленной, по сети) не поднимался. Иногда падал при старте, диагноз - испорченная нулевая страница SAM7X256/S256 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться