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

SAM7S64 - запись flash и прерывания

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

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


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

либо ткните носом, почему низя прерывания пользовать (тада внешнюю память навешивать буду), либо подскажите, чего мона придумать........ Может обработчик таймера в RAM?....
Именно переносить обработчик в RAM. И вектора тоже. Внешняя память не нужна, внутреннее ОЗУ подходит. А причина проста - во время записи флеш недоступна, и если приходит прерывание - процессор не может считать код команды по вектору. Возможно вас спасет такое решение: разрешать прерывания между записями страниц. Получится джиттер, но возможно он вас устроит.

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


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

и, естественно, делать REMAP

(для переноса векторов в ОЗУ)

 

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

 

естественно, если используется ОС, блокировать шедулер

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


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

не работает(((

если я правильно понял, то нужно изменить диапазон для всех сегментов кода (поменять 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

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


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

если я правильно понял, то нужно изменить диапазон для всех сегментов кода (поменять ROMSTART на 0х100000 и ROMEND на 0х10ffff), добавить в *.xcl строчки

-Z(CODE)INTVEC_I=00200000-00203FFF

-QINTVEC=INTVEC_I

Потом объявить обработчики разрешённых во время записи флэш прерываний __ramfunc.

 

Ну и в low_init вставить кусок кода, который копирует таблицу прерываний из флэш в ОЗУ и делает ремап на ОЗУ.

Да, так.
О! Стоп....... отладку запустил - оказывается в настройках лоадера надо указывать все 4 байта адреса))) - то есть не 0x100000, а 0x00100000 - вот ведь))
О! А я flashloader правил. Надо будет попробовать ваш вариант.

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


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

Устойчивой работы добился следующим образом:

в *.xcl запретил пользовать кусок RAM размером равным коду Cstartup.s79 (у меня 0x100 байт).

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

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


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

(там переход смещением адреса прописан, а надо бы на абсолютный адрес во флэш прыгать)

....

Но переделывать 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

и только область векторов и копирую.

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


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

Устойчивой работы добился следующим образом:

Даже, если у Вас все будет работать, я не уверен, что это хорошо. Теоретически опровергнуть не могу, но это не правильно. :(

PS. Считайте это - брюзжанием консерватора. :biggrin:

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


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

Я вообще не подключаю Cstartup, линкуется библиотечный..
А можно поподробнее о библиотечном аналоге Cstartup? Как его слинковать, откуда взять, какие функции он выполняет? Ато первый раз про такой слышу. :unsure:

 

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

 

Извиняюсь что так много вопросов.... :laughing: :smile3046:

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


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

А можно поподробнее о библиотечном аналоге Cstartup? Как его слинковать, откуда взять, какие функции он выполняет? Ато первый раз про такой слышу.
Просто не полключать CStartup явно, и он подлинкуется из библиотеки сам. Функции выполняет те же, что и ваш, идущий с примерами.

В два раза больше места это на случай что все они будут грузить в PC абсолютный адрес?
Да, именно так. К тому же у LPC ремапятся как раз 0x40 байт на область векторов.

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


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

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

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

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

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

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

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

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

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

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