реклама на сайте
подробности

 
 
> SAM7S64 - запись flash и прерывания, как писать flash, не запрещая прерывания?
Shum1
сообщение Nov 7 2007, 07:37
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 9-06-06
Пользователь №: 17 933



Вроде прочитал всё, что касается записи во флэш (по форумам и в доках). Все приведённые примеры с запретом прерываний. Мне же надо записывать порядка 10 страниц и при этом обрабатывать прерывания таймера 0,25 мс. С запретом прерываний запись работает, убираю запрет - вываливается в Prefetch Abort. В документации фраз о необходимости запрета прерываний не нашёл - либо ткните носом, почему низя прерывания пользовать (тада внешнюю память навешивать буду), либо подскажите, чего мона придумать........ Может обработчик таймера в RAM?.... или нельзя так?....... первый проект на арме - не знаю чего и придумать...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
Сергей Борщ
сообщение Nov 7 2007, 08:32
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
_dem
сообщение Nov 7 2007, 11:07
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



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

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

естественно, если используется ОС, блокировать шедулер
Go to the top of the page
 
+Quote Post
Shum1
сообщение Nov 7 2007, 13:51
Сообщение #4





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 7 2007, 15:01
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Shum1
сообщение Nov 13 2007, 09:09
Сообщение #6





Группа: Участник
Сообщений: 13
Регистрация: 9-06-06
Пользователь №: 17 933



Устойчивой работы добился следующим образом:
в *.xcl запретил пользовать кусок RAM размером равным коду Cstartup.s79 (у меня 0x100 байт).
И потом в main() вставил ремап и копирование всего кода Cstartup.s79 в RAM. То есть все обработчики исключений положил в RAM. Иначе все вызовы обработчиков приводят к ошибкам (там переход смещением адреса прописан, а надо бы на абсолютный адрес во флэш прыгать) По-моему такой способ кривой. При изменениях Cstartup.s79 придётся менять xcl и размер копируемой области. Но переделывать Cstartup.s79 сейчас не буду - так как он взят готовый, а в ассемблере разбираться пока нет времени.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 13 2007, 12:54
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 14 2007, 07:47
Сообщение #8


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Shum1 @ Nov 13 2007, 12:09) *
Устойчивой работы добился следующим образом:

Даже, если у Вас все будет работать, я не уверен, что это хорошо. Теоретически опровергнуть не могу, но это не правильно. sad.gif
PS. Считайте это - брюзжанием консерватора. biggrin.gif
Go to the top of the page
 
+Quote Post
Waso
сообщение Nov 24 2007, 13:45
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470



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

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

Извиняюсь что так много вопросов.... laughing.gif smile3046.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 24 2007, 14:00
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 02:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01445 секунд с 7
ELECTRONIX ©2004-2016