Shum1 0 7 ноября, 2007 Опубликовано 7 ноября, 2007 · Жалоба Вроде прочитал всё, что касается записи во флэш (по форумам и в доках). Все приведённые примеры с запретом прерываний. Мне же надо записывать порядка 10 страниц и при этом обрабатывать прерывания таймера 0,25 мс. С запретом прерываний запись работает, убираю запрет - вываливается в Prefetch Abort. В документации фраз о необходимости запрета прерываний не нашёл - либо ткните носом, почему низя прерывания пользовать (тада внешнюю память навешивать буду), либо подскажите, чего мона придумать........ Может обработчик таймера в RAM?.... или нельзя так?....... первый проект на арме - не знаю чего и придумать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 7 ноября, 2007 Опубликовано 7 ноября, 2007 · Жалоба либо ткните носом, почему низя прерывания пользовать (тада внешнюю память навешивать буду), либо подскажите, чего мона придумать........ Может обработчик таймера в RAM?....Именно переносить обработчик в RAM. И вектора тоже. Внешняя память не нужна, внутреннее ОЗУ подходит. А причина проста - во время записи флеш недоступна, и если приходит прерывание - процессор не может считать код команды по вектору. Возможно вас спасет такое решение: разрешать прерывания между записями страниц. Получится джиттер, но возможно он вас устроит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_dem 0 7 ноября, 2007 Опубликовано 7 ноября, 2007 · Жалоба и, естественно, делать REMAP (для переноса векторов в ОЗУ) выносить обработчики для прерываний, которые должны быть разрешены, в ОЗУ естественно, если используется ОС, блокировать шедулер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shum1 0 7 ноября, 2007 Опубликовано 7 ноября, 2007 (изменено) · Жалоба не работает((( если я правильно понял, то нужно изменить диапазон для всех сегментов кода (поменять 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 - вот ведь)) Изменено 7 ноября, 2007 пользователем Shum1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 7 ноября, 2007 Опубликовано 7 ноября, 2007 · Жалоба если я правильно понял, то нужно изменить диапазон для всех сегментов кода (поменять ROMSTART на 0х100000 и ROMEND на 0х10ffff), добавить в *.xcl строчки -Z(CODE)INTVEC_I=00200000-00203FFF -QINTVEC=INTVEC_I Потом объявить обработчики разрешённых во время записи флэш прерываний __ramfunc. Ну и в low_init вставить кусок кода, который копирует таблицу прерываний из флэш в ОЗУ и делает ремап на ОЗУ. Да, так.О! Стоп....... отладку запустил - оказывается в настройках лоадера надо указывать все 4 байта адреса))) - то есть не 0x100000, а 0x00100000 - вот ведь))О! А я flashloader правил. Надо будет попробовать ваш вариант. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shum1 0 13 ноября, 2007 Опубликовано 13 ноября, 2007 · Жалоба Устойчивой работы добился следующим образом: в *.xcl запретил пользовать кусок RAM размером равным коду Cstartup.s79 (у меня 0x100 байт). И потом в main() вставил ремап и копирование всего кода Cstartup.s79 в RAM. То есть все обработчики исключений положил в RAM. Иначе все вызовы обработчиков приводят к ошибкам (там переход смещением адреса прописан, а надо бы на абсолютный адрес во флэш прыгать) По-моему такой способ кривой. При изменениях Cstartup.s79 придётся менять xcl и размер копируемой области. Но переделывать Cstartup.s79 сейчас не буду - так как он взят готовый, а в ассемблере разбираться пока нет времени. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 13 ноября, 2007 Опубликовано 13 ноября, 2007 · Жалоба (там переход смещением адреса прописан, а надо бы на абсолютный адрес во флэш прыгать) .... Но переделывать 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 0 14 ноября, 2007 Опубликовано 14 ноября, 2007 · Жалоба Устойчивой работы добился следующим образом: Даже, если у Вас все будет работать, я не уверен, что это хорошо. Теоретически опровергнуть не могу, но это не правильно. :( PS. Считайте это - брюзжанием консерватора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Waso 1 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба Я вообще не подключаю Cstartup, линкуется библиотечный..А можно поподробнее о библиотечном аналоге Cstartup? Как его слинковать, откуда взять, какие функции он выполняет? Ато первый раз про такой слышу. :unsure: И еще. Резервировать 0x40 байт под вектора не много ли? Всего там 8 4-х байтных векторов, правильно? Это 0х20. В два раза больше места это на случай что все они будут грузить в PC абсолютный адрес? Или там есть чтото еще? Извиняюсь что так много вопросов.... :laughing: :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 134 24 ноября, 2007 Опубликовано 24 ноября, 2007 · Жалоба А можно поподробнее о библиотечном аналоге Cstartup? Как его слинковать, откуда взять, какие функции он выполняет? Ато первый раз про такой слышу.Просто не полключать CStartup явно, и он подлинкуется из библиотеки сам. Функции выполняет те же, что и ваш, идущий с примерами. В два раза больше места это на случай что все они будут грузить в PC абсолютный адрес?Да, именно так. К тому же у LPC ремапятся как раз 0x40 байт на область векторов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться