Открыть список
Как стать автором
Обновить

Комментарии 35

А кто инициализирует память? например если это ддр то нужно же ей установить настройки в регистры типа таймингов и т.д., или это Вы без внешней памяти пример привели?
В данном случае, вероятно имеется в виду, что действие происходит во внутренней SRAM, инициализировать которую не требуется по определению. В случае же с внешней ddr данный код необходим, да.
Действительно, если есть внешняя память, то сначала надо инициализировать источник тактовой частоты и внешнюю память. Он этим обычно занимается загрузчик.
Считайте, что я описал пример самого простого загрузчика, которому хватит внутренней SRAM
В общем интересно, если можно еще раскажите о Загрузчиках для ARM :) и о JTAG поподробнее.
Выходы есть почти на каждом роуторе, кпк (распаять надо)
Хочется поиграться с кпк, но вот надо jtag USB (com валяется, через переходник плохо работает, разбираться нету время)
Старт программы с адреса 0x0 это лишь один из вариантов загрузки который предлагает bootrom зашитый производителем (если речь идет о микроконтроллерах на ARM), ведь если нет JTAGа вам же придется как-то залить код через UART, SPI или нечто подобное.
А вообще представленный вами код в том или ином виде содержится в startup.s предоставляемый производителем чипа, не вижу смысла переписывать его заново, достаточно размеры стеков подправить под свои нужды, и обработчики вставить если это необходимо.
А вообще представленный вами код в том или ином виде содержится в startup.s предоставляемый производителем чипа, не вижу смысла переписывать его заново
Вы, видимо, забыли, что это ознакомительная статья, для того, чтобы показать, как и что загружается, а не написание своей реализации загрузчика.

Автор, спасибо, было интересно прочитать. С нетерпением жду продолжения.
Ну процессор стартует с адреса 0x0. Что там находится — зависит уже от производителя и конфигурации процессора. Там может быть как bootrom, так и flash, можно туда замапить и RAM. Например, AT91SAM7X512 поддерживает все три варианта: изначально туда мапится bootrom, после перепрошивки мапится Flash, а с помощью Мemmory Controller можно замапить туда RAM (например что бы менять адреса обработчиков исключений в рантайме).
Код действительно повторяет startup.s, Но мне однажды пришлось очень хорошо разобраться, как этот код работает. Думаю, будет интересно не мне одному.
А можно какие-то принципиальные схемы, как все подсоединять, и что из этого можно получить…
Допустим, сделать какую-то простую схемку с парой диодов, и написать программку что они моргали…
Было бы интересно сделать самому, своими руками =)
Заранее благодарю!
Купите комплект разработчика(KIT) там уже все припаяли и собрали. В комплекте будет документация, среда разработки, компилятор и JTAG-отладчик. Цена вопроса от 5-6 тысяч. Правда софт скорее всего будет с ограничениями и под винду.

Краткая инструкция для желающих себя попробовать:
1. Выбираете МК.
2. Ищите киты на сайте производителя.
3. Ищите на efind.ru и ему подобных этот кит.
Кстати да. Я вот не могу понять, почему народ носится с Arduino, если можно купить демо-плату и получить как минимум те же возможности, а обычно — намного больше.
Arduino конечно проще, да. Но с KIT'ами поставляется документация и примеры. Разобраться в них — не сильно сложнее. А сделать можно больше интересных вещей
НЛО прилетело и опубликовало эту надпись здесь
Да, было бы интересно
Спасибо, толком ничего не знаю о ARM7TDMI

если кому интерестно то современный ARM Cortex M3 инициализируется проще и на С
Эм… насколько я понял из документации — он инициализируется точно так же.
Всё же кто-то должен прописать вектора обработчиков, инициализировать стеки и память. При желании это наверное можно сделать на C… Но выглядеть будет странно :)
Кстати, надо будет попробовать, спасибо за идею :)
А вообще вся периферия ARM7TDMI тоже инициализируеися на C.
В этой статье я просто описывал, что надо сделать, что бы C заработал.

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

__attribute__ ((section(".isr_vector")))
void (* const g_pfnVectors[])(void) =
{
(void (*)(void))((unsigned long)pulStack + sizeof(pulStack)),
// The initial stack pointer
ResetISR, // The reset handler
NmiSR, // The NMI handler
FaultISR, // The hard fault handler
FaultISR, // The MPU fault handler
FaultISR, // The bus fault handler
FaultISR, // The usage fault handler
0, // Reserved
0, // Reserved
0, // Reserved
0, // Reserved
IntDefaultHandler, // SVCall handler
IntDefaultHandler, // Debug monitor handler
0, // Reserved
PendSV_ISR, // The PendSV handler
SysTickTimer_ISR, // The SysTick handler

нужно еще в ResetISR скопировать данные в RAM, тоже вполне реализуемо на С

еще на каждый перефирийный девайс в Cortex M3 отдельное прерывание.
это я так понял пока отличия между архитектурами

Ух ты, буду знать. Спасибо :)
А как настроить стеки в других режимах?
другой режим всего один.
есть два стека SP_main и SP_process

SP_main используется всегда в режиме обработчика прерываний, туда же сохраняются вложенные прерывания такого наверно в ARM7TDMI нет.

SP_process может использоватся (а может и нет) в обычном режиме

msr psp, r0
Хм, вижу ARMv7 намного совершенней в этом плане, чем ARMv5.

Вложенные прерывания в ARM7TDMI организовать можно, но вручную: в общем обработчике прерываний сохраняем адрес возврата на стеке, разрешаем прерывания, вызываем настоящий обработчик. Что бы сделать стек прерываний небольшим — можно выполнять настоящий обработчик в основном режиме работы, там стек обычно большой.
Затем, если придет более высокоприоритетное прерывание (за этим следит AIC) — оно сможет выполнится точно таким же образом.
НЛО прилетело и опубликовало эту надпись здесь
Ну там можно ожидать Линукс, я думаю :)
Или WinCE.
Для таких ARM-ов, Линукс — вполне себе хорошее решение, насколько мне кажется. Во всяком случае там уже есть все драйвера и много софта.
Если уж очень хочется своё, то можно взять бесплатную realtime os, даташиты на процессор, всю периферию что стоит в ноуте, и писать, писать, писать :)
Только сначала надо будет получить доступ к памяти программ. Самый популярный способ — через JTAG, если производитель ноута не предоставит каких-нить стандартных способов перешивки.
НЛО прилетело и опубликовало эту надпись здесь
Разбирать и изучать — это к сожалению единственный способ.
Но самое поганое не это. Некоторые производители жлобятся выкладывать подробные даташиты по своим продуктам в открытый доступ.
Хотя, думаю в дешевых китайских нетбуках стоят такие же дешевые комплектующие, документации по которым вагон :)
НЛО прилетело и опубликовало эту надпись здесь
Ну насколько я знаю — стереть прошивку совсем и залить что-то своё можно всегда. Защиты обычно не дают скачивать/изменять существующую прошивку.
Попробуйте beagleboard.
Спасибо, очень интересно. Единственный недостаток, не имение под рукой arm'а, хотя это не ваша вина.

Хотелось бы попробовать сделать собственную плату, с микропроцессором/контроллером, но руки ни как не дойдут. Стоит ли начинать сразу с arm или лучше начать со всем известных атмелов? Не дадите ли ссылку на магазин где такое добро можно купить, за хорошую цену?
Ну AVRки (вы же о них?) разве что паять удобно (ибо бывают в больших корпусах). А в остальном — разницы между серией AT91SAM и AVR в плане разводки и сборки — немного. Единственное, что у ARM множество входов питания. И часть ножек — системные, они должны быть подтянуты к земле или питанию.
Если покупать демо-плату — то разницы вообще нет, ибо там уже всё разведено и припаяно.
Где купить в розницу — не подскажу, ибо мы процессоры покупаем тысячами сразу :)
Попробуйте Cypress PSoC3(ядро i8051), а с него относительно безболезненно можно перейти на PSoC5 (ядро ARM Cortex-M3).
Что получите в отличие от Атмел. Наличие реконструируемых цифровых и аналоговых блоков, за счёт чего можно обойтись от обвязки обработав сигнал прямо в кристалле.
Универсальный кит под три семейства (PSoC1, PSoC3, PSoC5) www.cypress.com/?rID=37464
Дешёвый вариант с акселерометром и поддержкой сенсорных кнопок и разъёмом для подключения безпроводного модуля www.cypress.com/?rID=38235
Спасибо огроменное! Всегда хотел узнать ARM по-ближе. Буду ждать новых статей.
Интересно посмотреть, как вы настроили окружение. Ну и sbrk() и прочие из newlib интересно.
Да, это я наверное опишу в следующей практической статье.
Господа, ну что вы в самом деле! Поиграться с железками можно при цене вопроса от $25!

starterkit.ru/html/index.php
www.evodbg.com/index.php?option=com_content&task=view&id=19&Itemid=46
Причем не только светодиодиками поморгать, но и маленький «аппаратный» web сервер сделать. У меня на таком сайт более 5000 часов крутился…
У меня на таком сайт более 5000 часов крутился


А потом что случилось, если не секрет?
Я имел ввиду что он был доступен из интернета, он и сейчас работает, но в домашней локалке, к нему подключен датчик температуры, я за погодой через web наблюдаю.

Вернее наблюдал, пока не написал скрипт на домашнем сервере, подтягивающий с него страничку, парсящий температуру и проговваривающий мне ее голосом (festival — синтезатор речи ) по утрам, пока я на работу собираюсь :D
Не советовал бы брать StarterKit'ы на сайте starterkit.ru. У меня есть печальный опыт работы с этими «мастерами»…

Лучше заказывать StarterKit от производителя.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.