|
ARM, забегая вперёд... |
|
|
|
 |
Ответов
(15 - 29)
|
Nov 15 2010, 12:22
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 4-03-09
Из: Санкт-Петербург
Пользователь №: 45 656

|
возвращаясь к первому сообщению, кто-нибудь может объяснить толково как правильно залить программу в Dataflash чтобы она потом запустилась из внешней SDRAM? 1. если использую flashloader, то программа как-будто пишется, но не стартует при подаче питания - SDRAM что ли не инициализировалась....не понятно 2. написала загрузчик, который с нужного адреса Dataflash копирует программу в SDRAM и перехожу на начало программы в SDRAM - без прерываний работают простенькие проги, с прерываниями - нет. В чем подвох может быть?
|
|
|
|
|
Nov 15 2010, 18:20
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 4-03-09
Из: Санкт-Петербург
Пользователь №: 45 656

|
Boot Program читан, FlashLoaderGuide перечитан, все легко и просто - прописал путь до загрузчика, подцепил mac файл, где инициализируется SDRAM и все должно работать... Но ведь не работает! В надежде, что не я первая стою на этих граблях, надеюсь на помощь )
Что касается векторов прерываний, то они как были в SRAM, так и лежат там себе... Первое прерывание (работаю с touch screen) обрабатывается, но из него не выходит программа, то есть прерывание не сбрасывается? но при загрузке проги напрямую в SDRAM обработка прерываний идет нормально
|
|
|
|
|
Nov 15 2010, 18:40
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(radistka @ Nov 15 2010, 21:20)  Boot Program читан, FlashLoaderGuide перечитан, все легко и просто - прописал путь до загрузчика, подцепил mac файл, где инициализируется SDRAM и все должно работать... Но ведь не работает! В надежде, что не я первая стою на этих граблях, надеюсь на помощь )
Что касается векторов прерываний, то они как были в SRAM, так и лежат там себе... Первое прерывание (работаю с touch screen) обрабатывается, но из него не выходит программа, то есть прерывание не сбрасывается? но при загрузке проги напрямую в SDRAM обработка прерываний идет нормально присоединяюсь... только про mac-файл бы узнать подробнее)
|
|
|
|
|
Nov 15 2010, 20:20
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Если читан и перечитан, то какие могут быть "вроде"? Научитесь для начала в SRAM программы запускать. Потом, если надо будет SDRAM - Программа из датафлэш грузится в SRAM, переписывает настоящую программу, написанную и откомпилированную для SDRAM (предварительно инициализировав оную). Переписывает вектора прерываний на нужное место (на самом деле проще всего всунуть в стартап команду выборки прямо из AIC адреса - тогда вектора подойдут от отстатков загузчика) .
После чего уже джамп на начало SDRAM. Естественно, никакой инициализации SDRAM после этого. И вообще - никакой инициализации. Все - в первоначальном загрузчике делать. --- По жизни вот так делать.
1. Пишем программы для SRAM и тренируемся их запускать. 2. Компилируем программу для SDRAM и с помощью одной из уже написанный программок засовываем ея в датафлэш куда-нибудь в серединку. 3. После чего грузим в SDRAM программку, которая токо и умеет, что инициализировать PLL+SDRAM? копировать программу из п.2 в SDRAM и запускать оную 4. После удачи, программку из пункта 3 обзываем загрузчиком и запихиваем ее в датафлэш уже с нулевого адреса.
Все.
Сообщение отредактировал DpInRock - Nov 15 2010, 20:29
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Nov 16 2010, 06:08
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 4-03-09
Из: Санкт-Петербург
Пользователь №: 45 656

|
ну черт знает, так и делаю, но когда в SDRAMном проекте есть прерывания, программа зависает. А так - я тоже домозговала до этих 4 пунктов Zelepuk, дергайте же уже ногами =) AT91C_BASE_PIOA->PIO_PER = (AT91C_PIO_PA28); //PIO Enable Register AT91C_BASE_PIOA->PIO_PPUDR = (AT91C_PIO_PA28); //Pull-up Disable Register AT91C_BASE_PIOA->PIO_SODR = (1 << 28); //Set Output Data Register AT91C_BASE_PIOA->PIO_OER = (AT91C_PIO_PA28); //Output Enable Register AT91C_BASE_PIOA->PIO_SODR = (1 << 28); // 1 AT91C_BASE_PIOA->PIO_CODR = (1 << 28); // 0 Цитата(DpInRock @ Nov 15 2010, 23:20)  Переписывает вектора прерываний на нужное место (на самом деле проще всего всунуть в стартап команду выборки прямо из AIC адреса - тогда вектора подойдут от отстатков загузчика) . а не могли бы вы подробнее рассказать про всовывание команды выборки из AIC в стартап? как совать? ) заранее благодарю!
|
|
|
|
|
Nov 16 2010, 13:57
|

developer
   
Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032

|
Цитата(DpInRock @ Nov 16 2010, 09:17)  (В этом случае вы оформляете прерывание как __arm __irq и его адрес пишете напрямую в аик -- Процедура обработки будет вызываться сразу, минуя все промежуточные этапы, которые любят использовать в примерах). В примерах это делается для организации вложенных прерываний. Если вложенность не требуется, то тогда как вы говорите реакция на прерывание действительно будет быстрее. Блин, почему книжки никто не читает. Тревор Мартин не плохо все это описывает.
--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
|
|
|
|
|
Nov 16 2010, 14:30
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Цитата В примерах это делается для организации вложенных прерываний Вовсе нет. Организация вложенности делается совершенно по-другому. Хуже того, насколько я помню, в примерах вложенные прерывания нигде не применяются. Для вложенности требуется во первых разрешать прерывания изнутри обработчика. Это как минимум. (Я не говорю о манипуляциях с аик (просто точно не помню, а лезть неохота). А для этого применяют волшебное слово __nested
--------------------
On the road again (Canned Heat)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|