|
ARM, забегая вперёд... |
|
|
|
 |
Ответов
(1 - 65)
|
Nov 11 2010, 18:46
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Zelepuk @ Nov 11 2010, 15:58)  Кто-нибудь может просто по шагам расписать принцип дрыгания ногами для ARM. Нужно учесть что прога лежит в Dataflash, потом должна запускаться из внешней SD-RAM. Ну Частота тактовая должна быть нормальная (Мегагерцы). Может я чего упустил.... Как пример вот: http://eewiki.ru/wiki/Example_PinToggle_for_ARMGS10Инициализация периферии в ARM-ах действительно сложное дело. Еще более оно усложняется тем что не всегда хорошо описана в документации. Большинство производителей чипов просто создают библиотеки подпрограмм для работы с их периферией. Как правило у разных производителей эти библиотеки абсолютно разные по составу и стилю. Кроме этого собственные библиотеки идут с компиляторами под ARM. Поэтому выбор конкретного ARM-а очень критичен.
|
|
|
|
|
Nov 12 2010, 05:18
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(DRUID3 @ Nov 11 2010, 20:31)   ... да-да-да... А еще добавить немножечко воды и ...ммм... пукнуть туды  ))) Начнем с такого вопроса - какой у Вас ARM? бред какой-то.... В старте написано какой АРМ у меня.
Сообщение отредактировал Zelepuk - Nov 12 2010, 05:19
|
|
|
|
|
Nov 12 2010, 15:52
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(DRUID3 @ Nov 12 2010, 18:13)  Я конечно не самый внимательный в мире человек, но что-то сомневаюсь что я мог пропустить прямое указание на at91SAM9260. Вы его потом приписали  ... Обманывать - нехорошо, непедагогично...  DRUID3 вы ИМХО самый странный участник форума.... что за чушь! Там же не написано что я редактировал сообщение. Если вы серьёзно (а то хрен вас разберёт)))
|
|
|
|
|
Nov 12 2010, 19:10
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(Сега @ Nov 12 2010, 10:31)  Помойму сейчас уже нет разницы под что писать. Тем более на Си/Си++. Что мешает открыть доку на проц и посмотреть примеры? Потому что доки как для PIC-ов больше не пишут. Чипы сложнее в 10 раз и клепают их в пару раз быстрее. Производителям уже не до доки. А на борьбу с недокументированными возможностями ARM-ов могут уйти многие месяцы. Берясь за ARM-ы сразу резервируйте время на исследования и не надейтесь на доку.
|
|
|
|
|
Nov 15 2010, 07:44
|
Частый гость
 
Группа: Участник
Сообщений: 157
Регистрация: 20-01-09
Из: Новосибирск
Пользователь №: 43 645

|
Цитата(AlexandrY @ Nov 13 2010, 01:10)  Потому что доки как для PIC-ов больше не пишут. Чипы сложнее в 10 раз и клепают их в пару раз быстрее. Производителям уже не до доки.
А на борьбу с недокументированными возможностями ARM-ов могут уйти многие месяцы. Берясь за ARM-ы сразу резервируйте время на исследования и не надейтесь на доку. Тоска какая-то Неужели нет каких-нибудь новых быстрых контроллеров, которые были бы так же хорошо документированы и просты в применении, как старички AVR, например? Я как начал с AVR так на них и застрял. Армы SAM7s оказались слишком сложны
|
|
|
|
|
Nov 15 2010, 10:58
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(DpInRock @ Nov 15 2010, 13:35)  А вот современные АРМы для планшетов - это да. Это круто. Но они - нафик не нужны. Себе для развлечения восьмислойную плату городить - проще уж купить готовое. Производители планшетов тоже так считают. Сегодня вычитал на планшетном форуме про начинку SmartQ - плата Telechips TCC8900 Demo Board А я всё удивлялся - что это китайские планшеты похожи друг на друга, как близнецы
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
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)
|
|
|
|
|
Nov 17 2010, 18:18
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 13-07-10
Из: Солнечногорск-7
Пользователь №: 58 414

|
Цитата(Zelepuk @ Nov 15 2010, 20:33)  Сложновато-сложновато, всё равно((
Например подёргать ногами на AVR можно просто (напримере IAR) DDRC = 255; PORTC = 255;
сколько не искал подобные констркукции для ARM... не нашёл((
Как осуществляется доступ к PA0... PA31, PB0... PB31 и т.д. (здаётся мне их настроить их на вывод тоже непрсото - одной строчкой необойтись)
P.S. Наверное нужно и впрям запастись мешком семечек и курить даташит.... В общем-то, там ничего сложного нет, просто в АРМе сложней первоначальная настройка, и в неё лучше вникнуть, а не копипастить откуда-то, не очень понимая точный смысл. Я использую AT91SAM9261, никаких трудностей не возникало, за исключением того, что первый раз, инициализируя DBGU, забыл отдать ему соответствующие ноги портов -- естественно, передача данных при этом не работала. ADD. Ну а если конкретно про дрыганье ногами, то имеется два варианта. 1. Для установки неких разрядов какого-либо порта записываются 1 в соответствующие разряды регистра PIO_SODR этого порта (те разряды, в которые записывается 0, не будут менять своё состояние). Для сброса разрядов производится запись единиц в соответствующие позиции регистра PIO_CODR. 2. Сброс-установка разрядов путём записи необходимых значений в порт PIO_ODSR. Именно этот режим эквивалентен изменению ног в AVRках, но нередко удобнее бывает способ 1: если в какие-то биты порта записывается 0, то соответствующие ноги просто не меняются, поэтому установить или сбросить конкретные ноги проще (не надо предварительно считывать состояние порта и проводить логические операции, чтобы установить-сбросить определённые биты).
Сообщение отредактировал SII - Nov 17 2010, 18:25
|
|
|
|
|
Nov 18 2010, 10:12
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(SII @ Nov 17 2010, 21:18)  В общем-то, там ничего сложного нет, просто в АРМе сложней первоначальная настройка, и в неё лучше вникнуть, а не копипастить откуда-то, не очень понимая точный смысл. Я использую AT91SAM9261, никаких трудностей не возникало, за исключением того, что первый раз, инициализируя DBGU, забыл отдать ему соответствующие ноги портов -- естественно, передача данных при этом не работала.
ADD. Ну а если конкретно про дрыганье ногами, то имеется два варианта.
1. Для установки неких разрядов какого-либо порта записываются 1 в соответствующие разряды регистра PIO_SODR этого порта (те разряды, в которые записывается 0, не будут менять своё состояние). Для сброса разрядов производится запись единиц в соответствующие позиции регистра PIO_CODR.
2. Сброс-установка разрядов путём записи необходимых значений в порт PIO_ODSR. Именно этот режим эквивалентен изменению ног в AVRках, но нередко удобнее бывает способ 1: если в какие-то биты порта записывается 0, то соответствующие ноги просто не меняются, поэтому установить или сбросить конкретные ноги проще (не надо предварительно считывать состояние порта и проводить логические операции, чтобы установить-сбросить определённые биты). спасибо!
|
|
|
|
|
Nov 19 2010, 14:45
|
Участник

Группа: Участник
Сообщений: 19
Регистрация: 2-04-07
Пользователь №: 26 703

|
Я тут сильно извиняюсь... По моему скромному мнению изучение АРМ9 нужно начинать не с вопроса "как ножками потрыгать" а с вопроса "какую операционную систему на этот чип поставить". Тогда не будет лишних вопросов как что грузить и как память инициализировать. Нужно придумать очень экзотическую задачу чтобы имело смысл лудить такую железку без ОС. У меня вот фантазии не хватает. Не надо ничего изобретать и приделывать к велосипеду квадратные колеса. У вас простая задача - берите 8-ми битную архитектуру. Что-то посложнее - АРМ7 и можно подумать о какой-нибудь риал-тайм ОС. А если вам захотелось АРМ9 с ММУ залудить - без операционной системы не обойтись. Он для этого и придуман. Идете на сайт производителя с вопросом "какую ОС вы мне можете предложить для этого железа".
|
|
|
|
|
Nov 19 2010, 17:03
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
tturist, тренируйте фантазию  У нас есть железка с WinCE на ARM9, там загрузчик полностью переписан и обвешан блекджеками и шл... излишествами. Цель - на производстве (да и у пользователя тоже) убедиться, что всё железо работает нормально. Ногодрыг там используется вовсю. Хотя основное применение железки, конечно, другое - крутить задачку под WinCE.
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Nov 22 2010, 09:07
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 17-06-10
Из: МИНСК
Пользователь №: 57 975

|
Доброго времени суток! Может быть кто-нибудь сталкивался с ECC (Error Corrected Code Controller) в MCU AT91SAM9G45. Суть проблемы токова: в очищенный блок NAND FLASH пишу одну страницу и содержимое регистров ECC, а вот при чтении получаю мультибитовую ошибку.
Сообщение отредактировал NIKOLASIUS - Nov 22 2010, 09:08
--------------------
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
|
|
|
|
|
Nov 24 2010, 06:54
|
Участник

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

|
Значит так, стала запускаться моя программа с помощью написанного загрузчика. Беда была вот какая - основная программа была скомпилирована для SDRAM, но чатсь функций была помещена в SRAM, сделано это было помещением конкретной функции в секцию, расположенную в ОЗУ. При прошивке программы непосредственно в SDRAM под IARом все работало корректно, однако при загрузке программы из флэш в SDRAM (с помощью написанного загрузчика) ОЗУшные функции, судя по всему, не помещались в нужные секции. Подскажите, может в IARе где-то чего-то указать дополнительно нужно или еще чего...Или функции в ОЗУ можно поместить только ручками, прописав их в стартапе?
|
|
|
|
|
Nov 24 2010, 09:02
|
Участник

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

|
спрашиваю, потому что не понимаю, что в него еще нужно приписать. На сегодняшний день загрузчик инициализирует SDRAM, копирует код программы из флеш в SDRAM и переходит на адрес этой программы в SDRAM, но как дело обстоит с функциями основной программы, помещенными в SRAM, не понятно.
|
|
|
|
|
Nov 24 2010, 16:47
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(radistka @ Nov 24 2010, 12:02)  спрашиваю, потому что не понимаю, что в него еще нужно приписать. На сегодняшний день загрузчик инициализирует SDRAM, копирует код программы из флеш в SDRAM и переходит на адрес этой программы в SDRAM, но как дело обстоит с функциями основной программы, помещенными в SRAM, не понятно. Во flash у вас лежит, скорее всего, линейный bin-файл. Вы же должны знать, хотя бы, границы bss сегмента (чтобы его обнулить). Таким же образом, вы, по идее, должны знать границы вашего нестандартного (sram) сегмента, и, соответсвенно ручками скопировать этот сегмент по нужным адресам. Детали всего этого сильно зависят от вашего компилятора/линкера.
|
|
|
|
|
Nov 30 2010, 07:36
|
Местный
  
Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102

|
Прошу прощения, может вы мне ответите на вопрос, который я задал в теме: Мигание светодиодом на AT91SAM7S256? Может нужно как-то настроить IAR, может прога не правильная. Мой микропроцессор AT91SAM9260 расположен на плате MMNET1001. P.S.Если можно в той теме, за ранее спасибо.
|
|
|
|
|
Dec 1 2010, 06:24
|
Участник

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

|
sergeeff, попробовала копировать свой нестандартный sram сегмент по нужным адресам при работе из flash - не завелось ((
DpInRock, что с ремапом, что без него...а он работает с 0 адреса? то есть на sram, расположенную с 0x30000 не должен влиять?
я вот посмотрела проекты, сделанные под sam-ba , так там в *.lds файлах указываются _efixed, _sprerelocate, _eprerelocate и _spostrelocate, _epostrelocate, а потом в board_cstartup.c в resetHandler эти сегменты инициализируются, а в IAR'овских проектах этот механизм в каком месте осуществляется? сегменты описываются в *.icf, но в каком месте IAR их инициализирует и цепляет?
|
|
|
|
|
Dec 6 2010, 16:05
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(radistka @ Dec 1 2010, 09:24)  я вот посмотрела проекты, сделанные под sam-ba , так там в *.lds файлах указываются _efixed, _sprerelocate, _eprerelocate и _spostrelocate, _epostrelocate, а потом в board_cstartup.c в resetHandler эти сегменты инициализируются, а в IAR'овских проектах этот механизм в каком месте осуществляется? сегменты описываются в *.icf, но в каком месте IAR их инициализирует и цепляет? Вы хотели сказать, что посмотрели проекты сделанные под gcc (а не под sam-ba)... Сдаётся мне, что в IAR для этого надо поставить "__ramfunc" перед функцией и возможно добавить в .icf "initialize by copy { rw, section MYCODE };" (а возможно и не надо если устроит, что функции лягут в дефолтную секцию.) Правда поймёт ли IAR, что от него требуют чтобы он разместил часть функций (с "__ramfunc") в SRAM, при условии что остальной проект находится в SDRAM - это уже вопрос к Гуру.
|
|
|
|
|
Dec 6 2010, 16:25
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(radistka @ Dec 1 2010, 09:24)  sergeeff, попробовала копировать свой нестандартный sram сегмент по нужным адресам при работе из flash - не завелось ((
DpInRock, что с ремапом, что без него...а он работает с 0 адреса? то есть на sram, расположенную с 0x30000 не должен влиять?
я вот посмотрела проекты, сделанные под sam-ba , так там в *.lds файлах указываются _efixed, _sprerelocate, _eprerelocate и _spostrelocate, _epostrelocate, а потом в board_cstartup.c в resetHandler эти сегменты инициализируются, а в IAR'овских проектах этот механизм в каком месте осуществляется? сегменты описываются в *.icf, но в каком месте IAR их инициализирует и цепляет? Вы мне так и не ответили, а главное и себе тоже, с 0х00000000 адреса у вас сидит таблица прерываний, как положено? Проект вообще не работает или работает до вызова какой-либо функции из sram? Вы бы почетче рассказывали, что там у вас. На расстоянии, знаете ли, сложновато. Особенно,когда вы выпадаете из разговора на недели.
|
|
|
|
|
Dec 7 2010, 08:25
|
Участник

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

|
Цитата(sergeeff @ Dec 6 2010, 19:25)  Вы мне так и не ответили, а главное и себе тоже, с 0х00000000 адреса у вас сидит таблица прерываний, как положено? Проект вообще не работает или работает до вызова какой-либо функции из sram? да, с 0 адреса лежит таблица прерываний. Прошу прощения, опечаталась, проект работает именно до вызова функции, лежащей в SRAM, которая вызывается из прерываний
Сообщение отредактировал radistka - Dec 7 2010, 11:19
|
|
|
|
|
Dec 7 2010, 08:49
|

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

|
Осталось только сформулировать по-русски. "ПРоект не работает до вызова...". Следовательно, "после вызова" - работает.
Таблица перываний сидит с 0. Это так и должно быть. Далее. Программа может стартовать как с 0, так и с 30000. В зависимости от. Вы должны проверять при старте, где вы находитесь. И в зависимости ОТ, делать ремап или не делать. Заметка. Ремап так хитро устроен, что переключается как Т-триггер. Т.е., переключается в ПРОТИВОПОЛОЖНУЮ сторону от текущего. Посему ЛИШНИЙ ремап - плохо.
Кроме того. Первая самая команда в стартапе должна быть не с абсолютной адресацией. Ибо программа может находится где угодно и адресация должна быть относительной. В примерах в комментариях стартапа это записано.
Ну, а далее, получив опыт запуска программы (как из флэша, так и из самбы) можете приступать к отлдадке простых рам функций. После чего плавно переходим на прерывания.
Постойте! Как еще рам функции в 9260? Там нет флэша исполняемого...
Может имеются ввиду функции в SDRAM (D)? Я так понял в теме смешались 2478 и 9260 каким-то образом...
Сообщение отредактировал DpInRock - Dec 7 2010, 08:57
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Dec 7 2010, 09:21
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(radistka @ Dec 7 2010, 11:25)  да, с 0 адреса лежит таблица прерываний. Проект не работает именно до вызова функции, лежащей в SRAM, которая вызывается из прерываний Потратьте еще немного времени и проверьте: 1. Действительно ли с 0-го адресе sram (куда-нибудь в sram запишите чего-нибудь и прочитайте обратно). 2. Таблица прерываний в sram должна быть типа: Код b InitReset ; 0 - 0x00 SoftReset ldr pc, [pc, #0x18] ; 1 - 0x04 UndefHandler ldr pc, [pc, #0x18] ; 2 - 0x08 SWIHandler ldr pc, [pc, #0x18] ; 3 - 0x0C PrefetchAbortHandler ldr pc, [pc, #0x18] ; 4 - 0x10 DataAbortHandler nop ; 5 - 0x14 Reserved ldr pc, [pc, #0x18] ; 6 - 0x18 IRQ_Handler_Entry ldr pc, [pc, #0x18] ; 7 - 0x1C FIQ_Handler_Entry ;- There are only 5 offsets as the vectoring is used. DCD InitReset ; 0x20 DCD AT91F_Undef ; 0x24 DCD SWIHandler ; 0x28 DCD AT91F_FetchAbort ; 0x2c DCD AT91F_DataAbort ; 0x30 DCD ReservedHandler ; 0x34 DCD IRQHandler ; 0x38 DCD FIQHandler ; 0x3c Такая организация таблицы позволяет размещать ваши обработчики прерываний где угодно. 3. Убедитесь, что ваши sram-функции сидят именно в sram по нужным адресам. 4. Убедитесь в том, что вы правильно компилятору сообщили о своих sram функциях и он их вызывает командами BX/BLX, а не B/BL.
|
|
|
|
|
Dec 7 2010, 10:18
|

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

|
Код MODULE ?cstartup
;; Forward declaration of sections. SECTION PROGRAM_DATA:CODE SECTION IRQ_STACK:DATA:NOROOT(3) SECTION FIQ_STACK:DATA:NOROOT(3) SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:NOROOT(2)
PUBLIC __vector PUBLIC __vector_0x14 PUBLIC __iar_program_start EXTERN Undefined_Handler EXTERN SWI_Handler EXTERN Prefetch_Handler EXTERN Abort_Handler EXTERN IRQ_Handler EXTERN FIQ_Handler
ARM
__vector: ; All default exception handlers (except reset) are ; defined as weak symbol definitions. ; If a handler is defined by the application it will take precedence.
; ldr PC,Reset_Addr ; To allow remap, a relative branch is required ! B __iar_program_start ldr PC,Undefined_Addr ; Undefined instructions ldr PC,SWI_Addr ; Software interrupt (SWI/SVC) ldr PC,Prefetch_Addr ; Prefetch abort ldr PC,Abort_Addr ; Data abort __vector_0x14: DCD SFE(PROGRAM_DATA) ; End address of all const and text sections.
; ldr PC,IRQ_Addr ; IRQ ldr PC, [PC,# -0xF20] ;AIC direct ldr PC,FIQ_Addr ; FIQ
DATA
Reset_Addr: DCD __iar_program_start Undefined_Addr: DCD Undefined_Handler SWI_Addr: DCD SWI_Handler Prefetch_Addr: DCD Prefetch_Handler Abort_Addr: DCD Abort_Handler IRQ_Addr: DCD IRQ_Handler FIQ_Addr: DCD FIQ_Handler
__vector_end:
; -------------------------------------------------- ; ?cstartup -- low-level system initialization code. ; ; After a reser execution starts here, the mode is ARM, supervisor ; with interrupts disabled. ;
SECTION .text:CODE:NOROOT(2)
EXTERN ?main REQUIRE __vector
ARM
__iar_program_start:
/********************************************************************** * ?CSTARTUP * * Execution starts here. * After a reset, the mode is ARM, Supervisor, interrupts disabled. */ ?cstartup: mvn r0, #0xFF ;remap here bic r0,r0, #0x1100 mov r1, #0x03 str r1, [r0, #+0] mrc p15, 0, r0, c1, c0,0 ; read cp15 control register (cp15 r1) r0 ldr r3, =0xC0001085 ; Disable Cache, Disable MMU ldr r4, =0x40005004 ; Round Robin replacement 0x40004000 bic r0, r0, r3 orr r0, r0, r4 mcr p15, 0, r0, c1, c0,0 ; write cp15 control register (cp15 r1) ;--------------------------------------------------------------------------------
;-------------------------------------------------------------------------------- ; Initialize the stack pointers. ;; Set up the interrupt stack pointer.
msr cpsr_c,#0xd2 ; Change mode to IRQ mode, FIQ and IRQ disabled ldr sp, =SFE(IRQ_STACK) ; End of IRQ_STACK bic sp,sp,#0x7 ; Make sure SP is aligned on 8 byte boundary ;; Set up the fast interrupt stack pointer.
msr cpsr_c,#0xd1 ; Change mode to FIQ mode, FIQ and IRQ disabled ldr sp, =SFE(FIQ_STACK) ; End of FIQ_STACK bic sp,sp,#0x7 ; Make sure SP is aligned on 8 byte boundary
;; Set up the normal stack pointer.
msr cpsr_c,#0xdf ; Change mode to SYS mode, FIQ and IRQ disabled ; msr cpsr_c, #0xd3 ldr sp, =SFE(CSTACK) ; End of CSTACK bic sp,sp,#0x7 ; Make sure SP is aligned on 8 byte boundary
;msr cpsr_c,#0xd2
; Jump to startup code in library ldr r0,=?main bx r0
LTORG END
; ***** EOF ********************************************************** Это работающее. Обработчики прерываний IRQ берутся прямо из AIC.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Dec 7 2010, 11:06
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Подскажите пожалуйста где найти(его надо писать или он есть в IAR-e) этот файл стартапа? Куда его надо прикошачить чтоб подправить? Еще вопрос.. непонимаю что происходит при отладке... Программа останавливается(см. приложения fi1 и архив с проектом). Почитал ветку и непонял программа прошивается во флеш при отладке? Где находится заводской булодер? Можно его случайно стереть или испортить? Пользуюсь IAR + mt-link+LPC-H2103.
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 7 2010, 12:12
|
Участник

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

|
Цитата(DpInRock @ Dec 7 2010, 11:49)  Программа может стартовать как с 0, так и с 30000. В зависимости от. Вы должны проверять при старте, где вы находитесь. И в зависимости ОТ, делать ремап или не делать. Заметка. Ремап так хитро устроен, что переключается как Т-триггер. Т.е., переключается в ПРОТИВОПОЛОЖНУЮ сторону от текущего. Посему ЛИШНИЙ ремап - плохо.
...
Я так понял в теме смешались 2478 и 9260 каким-то образом... действительно, намешано всего, я имею дело с at91sam9rl64 Сама программа располагается с 0x300000. С ремапом я, видимо, так и не разобралась (( Вариант копирования SRAM секций (куда унесены некоторые функции) по тем же адресам из работающего SDRAM проекта в flash-проект оказался вообще-то рабочим, просто нужно было быть внимательнее с загрузкой секции во flash (в виде .txt файла). То есть теперь в программе-загрузчике инициализирую sdram, копирую код основной программы, копирую sram-секцию, прыгаю на адрес main и все даже работает! спасибо всем большое!
|
|
|
|
|
Dec 7 2010, 12:51
|

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

|
Цитата(sergeeff @ Dec 7 2010, 13:36)  Чтобы это было совсем рабочим, не мешало бы:
1. Задать стеки для всех остальных режимов. 2. Обнулить данные в bss - сегменте. 3. До main вызвать что-нибудь типа low_level_init, где инициализировать "железо" и программные дела типа кучи. 4. Если используется/планируется С++ - до main вызвать конструкторы глобальных объектов. 1. Все остальные режимы не являются работающими. 2. Зачем? 3. Дурной тон. Тем более, еще куч мне не хватает до полного счастья. 4. Зачем.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Dec 9 2010, 13:37
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(sergeeff @ Dec 9 2010, 15:25)  Важно не то, какая программа, а понимание, как ее выполняет компьютер/контроллер. Поняли разницу? Да это понятно конечно. Интересно на каком уровне расписывал программу ваш товарищь (неужели писал что-то вроде в этот регистр записывается то-то, затем передаётся в АЛУ и т.д.) или просто писал что на каждом этапе считается и что выводится на экран? P.S.Для обучения таким образом расписывать маленькие программик очень полезно. Не спорю.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|