Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SAM7S64 - запись flash и прерывания
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Shum1
Вроде прочитал всё, что касается записи во флэш (по форумам и в доках). Все приведённые примеры с запретом прерываний. Мне же надо записывать порядка 10 страниц и при этом обрабатывать прерывания таймера 0,25 мс. С запретом прерываний запись работает, убираю запрет - вываливается в Prefetch Abort. В документации фраз о необходимости запрета прерываний не нашёл - либо ткните носом, почему низя прерывания пользовать (тада внешнюю память навешивать буду), либо подскажите, чего мона придумать........ Может обработчик таймера в RAM?.... или нельзя так?....... первый проект на арме - не знаю чего и придумать...
Сергей Борщ
Цитата(Shum1 @ Nov 7 2007, 09:37) *
либо ткните носом, почему низя прерывания пользовать (тада внешнюю память навешивать буду), либо подскажите, чего мона придумать........ Может обработчик таймера в RAM?....
Именно переносить обработчик в RAM. И вектора тоже. Внешняя память не нужна, внутреннее ОЗУ подходит. А причина проста - во время записи флеш недоступна, и если приходит прерывание - процессор не может считать код команды по вектору. Возможно вас спасет такое решение: разрешать прерывания между записями страниц. Получится джиттер, но возможно он вас устроит.
_dem
и, естественно, делать REMAP
(для переноса векторов в ОЗУ)

выносить обработчики для прерываний, которые должны быть разрешены, в ОЗУ

естественно, если используется ОС, блокировать шедулер
Shum1
не работает(((
если я правильно понял, то нужно изменить диапазон для всех сегментов кода (поменять 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, 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 правил. Надо будет попробовать ваш вариант.
Shum1
Устойчивой работы добился следующим образом:
в *.xcl запретил пользовать кусок RAM размером равным коду Cstartup.s79 (у меня 0x100 байт).
И потом в main() вставил ремап и копирование всего кода Cstartup.s79 в RAM. То есть все обработчики исключений положил в RAM. Иначе все вызовы обработчиков приводят к ошибкам (там переход смещением адреса прописан, а надо бы на абсолютный адрес во флэш прыгать) По-моему такой способ кривой. При изменениях Cstartup.s79 придётся менять xcl и размер копируемой области. Но переделывать Cstartup.s79 сейчас не буду - так как он взят готовый, а в ассемблере разбираться пока нет времени.
Сергей Борщ
Цитата(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
и только область векторов и копирую.
alexander55
Цитата(Shum1 @ Nov 13 2007, 12:09) *
Устойчивой работы добился следующим образом:

Даже, если у Вас все будет работать, я не уверен, что это хорошо. Теоретически опровергнуть не могу, но это не правильно. sad.gif
PS. Считайте это - брюзжанием консерватора. biggrin.gif
Waso
Цитата(Сергей Борщ @ Nov 13 2007, 19:54) *
Я вообще не подключаю Cstartup, линкуется библиотечный..
А можно поподробнее о библиотечном аналоге Cstartup? Как его слинковать, откуда взять, какие функции он выполняет? Ато первый раз про такой слышу. unsure.gif

И еще. Резервировать 0x40 байт под вектора не много ли? Всего там 8 4-х байтных векторов, правильно? Это 0х20. В два раза больше места это на случай что все они будут грузить в PC абсолютный адрес? Или там есть чтото еще?

Извиняюсь что так много вопросов.... laughing.gif smile3046.gif
Сергей Борщ
Цитата(Waso @ Nov 24 2007, 15:45) *
А можно поподробнее о библиотечном аналоге Cstartup? Как его слинковать, откуда взять, какие функции он выполняет? Ато первый раз про такой слышу.
Просто не полключать CStartup явно, и он подлинкуется из библиотеки сам. Функции выполняет те же, что и ваш, идущий с примерами.
Цитата(Waso @ Nov 24 2007, 15:45) *
В два раза больше места это на случай что все они будут грузить в PC абсолютный адрес?
Да, именно так. К тому же у LPC ремапятся как раз 0x40 байт на область векторов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.