|
SAM7S64 - запись flash и прерывания, как писать flash, не запрещая прерывания? |
|
|
|
Nov 7 2007, 07:37
|
Группа: Участник
Сообщений: 13
Регистрация: 9-06-06
Пользователь №: 17 933

|
Вроде прочитал всё, что касается записи во флэш (по форумам и в доках). Все приведённые примеры с запретом прерываний. Мне же надо записывать порядка 10 страниц и при этом обрабатывать прерывания таймера 0,25 мс. С запретом прерываний запись работает, убираю запрет - вываливается в Prefetch Abort. В документации фраз о необходимости запрета прерываний не нашёл - либо ткните носом, почему низя прерывания пользовать (тада внешнюю память навешивать буду), либо подскажите, чего мона придумать........ Может обработчик таймера в RAM?.... или нельзя так?....... первый проект на арме - не знаю чего и придумать...
|
|
|
|
|
 |
Ответов
(1 - 9)
|
Nov 7 2007, 08:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Shum1 @ Nov 7 2007, 09:37)  либо ткните носом, почему низя прерывания пользовать (тада внешнюю память навешивать буду), либо подскажите, чего мона придумать........ Может обработчик таймера в RAM?.... Именно переносить обработчик в RAM. И вектора тоже. Внешняя память не нужна, внутреннее ОЗУ подходит. А причина проста - во время записи флеш недоступна, и если приходит прерывание - процессор не может считать код команды по вектору. Возможно вас спасет такое решение: разрешать прерывания между записями страниц. Получится джиттер, но возможно он вас устроит.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 7 2007, 13:51
|
Группа: Участник
Сообщений: 13
Регистрация: 9-06-06
Пользователь №: 17 933

|
не работает((( если я правильно понял, то нужно изменить диапазон для всех сегментов кода (поменять ROMSTART на 0х100000 и ROMEND на 0х10ffff), добавить в *.xcl строчки -Z(CODE)INTVEC_I=00200000-00203FFF -QINTVEC=INTVEC_I Потом объявить обработчики разрешённых во время записи флэш прерываний __ramfunc. Ну и в low_init вставить кусок кода, который копирует таблицу прерываний из флэш в ОЗУ и делает ремап на ОЗУ. Так вот, в режиме отладки IAR виснет на programming flash((( Если при этом выдернуть шнурок USB из SAM-ICE, то в окне лога читаем Цитата Wed Nov 07 16:39:35 2007: Loaded macro file: E:\Shumilov\Programms\IAR\iar_arm_440a\ARM\config\flashloader\Atmel\FlashAT91SAM7Sx.mac Wed Nov 07 16:39:35 2007: ---------------------------------------- FLASH Download V1.3 Wed Nov 07 16:39:35 2007: ---------------------------------------- 14/November/2005 Wed Nov 07 16:39:36 2007: ---------------------------------------- PLL Enable Wed Nov 07 16:39:36 2007: -------------------------------Set CPSR ---------------------------------- Wed Nov 07 16:39:36 2007: CPSR 000000D3 Wed Nov 07 16:39:36 2007: ---------------------------------------- PLL Enable Wed Nov 07 16:39:36 2007: ------------------------------- The Remap is done ---------------------------------------- Wed Nov 07 16:39:36 2007: ---------------------------------------- Chip ID 0x27090540 Wed Nov 07 16:39:36 2007: ---------------------------------------- Extention 0x00000000 Wed Nov 07 16:39:36 2007: ---------------------------------------- Flash Version 0x00000110 Wed Nov 07 16:39:36 2007: -------------------------------Set PC ---------------------------------------- Wed Nov 07 16:39:36 2007: J-Link firmware: V1.20 (J-Link compiled Sep 28 2006 10:05:22 ARM Rev.5) Wed Nov 07 16:39:36 2007: JTAG speed is initially set to: 32 kHz Wed Nov 07 16:39:36 2007: Failed to halt CPU core after Reset (BP@0), using default reset strategy. Wed Nov 07 16:39:36 2007: Resetting target using RESET pin Wed Nov 07 16:39:36 2007: Hardware reset with strategy 1 was performed Wed Nov 07 16:39:36 2007: Initial reset was performed Wed Nov 07 16:39:36 2007: J-Link found 1 JTAG device. ARM core Id: 3F0F0F0F(ARM7) Wed Nov 07 16:39:36 2007: Device at TAP0 selected Wed Nov 07 16:39:36 2007: Auto JTAG speed: 8000 kHz Wed Nov 07 16:39:36 2007: Auto JTAG speed: 8000 kHz Wed Nov 07 16:39:37 2007: 4931 bytes downloaded and verified (3.62 Kbytes/sec) Wed Nov 07 16:39:37 2007: Loaded debugee: E:\Shumilov\Programms\IAR\iar_arm_440a\ARM\config\flashloader\Atmel\FlashAT91SAM7Sx.d79 Wed Nov 07 16:39:37 2007: Target reset Wed Nov 07 16:39:38 2007: Downloader Version 1.3 14-NOV-2005 Wed Nov 07 16:39:38 2007: Download1: AT91SAM7Sx At: 0x100000 Wed Nov 07 16:39:38 2007: Download: AT91SAM7Sx Version: 0x110 Wed Nov 07 16:39:38 2007: Download:page 0 Wed Nov 07 16:39:38 2007: Download:page 8192 Wed Nov 07 16:39:38 2007: Download:page 8193 Wed Nov 07 16:39:38 2007: Download:page 8194 Wed Nov 07 16:39:43 2007: USB communication error: No USB connection opened ! Could not transfer JTAG data. Wed Nov 07 16:39:44 2007: Non-zero or missing exit code. Wed Nov 07 16:39:45 2007: Code still contains old breakpoints Я так понял, что loader пытается писать с 0x100000 и со смещением 8192 страниц (0x100000/128байт) и далее........ loader стоит по умолчанию Если в xcl вернуть диапазон ROM в первоначальное состояние 0-ffff, то отладка начинается, но после ремапа на ОЗУ вылетает в exception дата аборт или андефайнед инстракшн..... что и понятно О! Стоп....... отладку запустил - оказывается в настройках лоадера надо указывать все 4 байта адреса))) - то есть не 0x100000, а 0x00100000 - вот ведь))
Сообщение отредактировал Shum1 - Nov 7 2007, 14:10
|
|
|
|
|
Nov 7 2007, 15:01
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Shum1 @ Nov 7 2007, 15:51)  если я правильно понял, то нужно изменить диапазон для всех сегментов кода (поменять ROMSTART на 0х100000 и ROMEND на 0х10ffff), добавить в *.xcl строчки -Z(CODE)INTVEC_I=00200000-00203FFF -QINTVEC=INTVEC_I Потом объявить обработчики разрешённых во время записи флэш прерываний __ramfunc.
Ну и в low_init вставить кусок кода, который копирует таблицу прерываний из флэш в ОЗУ и делает ремап на ОЗУ. Да, так. Цитата(Shum1 @ Nov 7 2007, 15:51)  О! Стоп....... отладку запустил - оказывается в настройках лоадера надо указывать все 4 байта адреса))) - то есть не 0x100000, а 0x00100000 - вот ведь)) О! А я flashloader правил. Надо будет попробовать ваш вариант.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 13 2007, 09:09
|
Группа: Участник
Сообщений: 13
Регистрация: 9-06-06
Пользователь №: 17 933

|
Устойчивой работы добился следующим образом: в *.xcl запретил пользовать кусок RAM размером равным коду Cstartup.s79 (у меня 0x100 байт). И потом в main() вставил ремап и копирование всего кода Cstartup.s79 в RAM. То есть все обработчики исключений положил в RAM. Иначе все вызовы обработчиков приводят к ошибкам (там переход смещением адреса прописан, а надо бы на абсолютный адрес во флэш прыгать) По-моему такой способ кривой. При изменениях Cstartup.s79 придётся менять xcl и размер копируемой области. Но переделывать Cstartup.s79 сейчас не буду - так как он взят готовый, а в ассемблере разбираться пока нет времени.
|
|
|
|
|
Nov 13 2007, 12:54
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Shum1 @ Nov 13 2007, 11:09)  (там переход смещением адреса прописан, а надо бы на абсолютный адрес во флэш прыгать) .... Но переделывать Cstartup.s79 сейчас не буду - так как он взят готовый, а в ассемблере разбираться пока нет времени. Я вообще не подключаю Cstartup, линкуется библиотечный, вектора прописываю вручную в отдельтном файле: Код extern SW_Switcher CODE32 COMMON INTVEC:CODE:ROOT org 0x00000004 UNDEF_Trap B UNDEF_Trap
org 0x00000008 LDR PC, SWI_Switcher_Adr ; Branch to swi_handler
org 0x0000000C Prefetch_Trap B Prefetch_Trap
org 0x00000010 Data_Trap B Data_Trap
org 0x00000018 LDR PC, AT91C_AIC_IVR ; void (*AT91C_AIC_IVR)()
org 0x0000001C FIQ_Trap B FIQ_Trap org 0x00000028 SWI_Switcher_Adr: DC32 SWI_Switcher В .xcl резервирую место только под вектора (0x40 байт): Код -DRAMSTART=00200040 -DRAMEND=00203FFF и только область векторов и копирую.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 24 2007, 14:00
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Waso @ Nov 24 2007, 15:45)  А можно поподробнее о библиотечном аналоге Cstartup? Как его слинковать, откуда взять, какие функции он выполняет? Ато первый раз про такой слышу. Просто не полключать CStartup явно, и он подлинкуется из библиотеки сам. Функции выполняет те же, что и ваш, идущий с примерами. Цитата(Waso @ Nov 24 2007, 15:45)  В два раза больше места это на случай что все они будут грузить в PC абсолютный адрес? Да, именно так. К тому же у LPC ремапятся как раз 0x40 байт на область векторов.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|