|
AT91SAM9260, Помогите с прерываниями |
|
|
|
Jul 27 2009, 04:54
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939

|
Благодарю за ответ. Цитата Bootloader делает remap, загружает кусок программы в SRAM (она расположена по адресу 0) и передает ей управление. Все остальное - инициализацию кэшей, SDRAM, загрузку остальной программы - нужно делать самостоятельно. то есть если я правильно понимаю само загрузится из флеши на SPI первые 4 кб ? (с адресов 0х1000 0000 до 0х1000 0000 + 0х1000). На этих 4кнеобходимо настроить тактирование, стеки , и загрузить из флеши в SDRAM какую либо программу (часть данных флеши или всё что там есть). передать управление на неё можно просто вызвав функцию по адресу SDRAM ( 0x2000 0000). ? Прерывания IRQ идут через AIC по программируемым там адресам (те их можно менять в процессе работы и проблем ссылки на SDRAM не должно быть). Другие обработчики Прерывания: __irq __arm void Undefined_Handler(void); __irq __arm void SWI_Handler(void);. __irq __arm void Prefetch_Handler(void); __irq __arm void Abort_Handler(void); могут быть как в SRAM так и SDRAM. Но есть 1 НО: SDRAM c адреса 0x2000 0000 если в boot программе из SRAM ссылаться на SDRAM для Undefined_Handler то нужен жесткий адрес по которому располагается этот обработчик. Так вот как IAR заставить его там расположить по требуемому адресу? Или есть более рациональное решение? Также интересует ситуация: по хорошему boot программа из флеши должна уметь обновлять прошивку основной. При этом процессе может случиться Undefined_Handler и результат плачевен. (ведь в SDRAM пусто - самаписная boot вся в sram). Как разрешить подобную ситуацию?
|
|
|
|
|
Jul 27 2009, 13:16
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(crack_enigma @ Jul 27 2009, 08:54)  то есть если я правильно понимаю само загрузится из флеши на SPI первые 4 кб ? (с адресов 0х1000 0000 до 0х1000 0000 + 0х1000). На этих 4кнеобходимо настроить тактирование, стеки , и загрузить из флеши в SDRAM какую либо программу (часть данных флеши или всё что там есть). передать управление на неё можно просто вызвав функцию по адресу SDRAM ( 0x2000 0000). ? Само загрузит столько, сколько пропишите на месте reserved вектора. Но не более, чем физически есть памяти, естественно. И не с адреса 0х10000000 (откуда вообще эта цифра?), а с 0, т.к. ремап уже сделан. Управление после загрузки передаете любым способом, можно и вызовом фиктивной функции. Цитата(crack_enigma @ Jul 27 2009, 08:54)  Но есть 1 НО: SDRAM c адреса 0x2000 0000 если в boot программе из SRAM ссылаться на SDRAM для Undefined_Handler то нужен жесткий адрес по которому располагается этот обработчик. Так вот как IAR заставить его там расположить по требуемому адресу? Или есть более рациональное решение?
Также интересует ситуация: по хорошему boot программа из флеши должна уметь обновлять прошивку основной. При этом процессе может случиться Undefined_Handler и результат плачевен. (ведь в SDRAM пусто - самаписная boot вся в sram). Как разрешить подобную ситуацию? Ничего не понял, если честно. Почему так именно Undefined_Handler покоя не дает? После загрузки, основная программа может совершенно спокойно записать в область векторов что-то свое. На самом деле, нужно сделать два совершенно раздельных проекта: 1. Boot. Делает минимальную настройку процессора, загружает программу в SDRAM, передает управление. 2. Основная программа. Скомпилирована для работы из SDRAM, содержит отдельный asm-файл с областью векторов, который средствами линкера укладывается по нулевому адресу.
|
|
|
|
|
Jul 28 2009, 12:08
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939

|
благодарю за ответ aaarrr. Понимаю всё это с трудом, поэтому если можешь поправь следующие расcуждения: Цитата И не с адреса 0х1000 0000 (откуда вообще эта цифра?) Как я понял (из основного распределения памяти даташита) SPI dataFlash находится по этому адресу. До тех пор пока не будет remp = 0 и BMS = 0. Или я чтото серьёзно путаю?Цитата Bootloader делает remap, загружает кусок программы в SRAM (она расположена по адресу 0) и передает ей управление. Те по сути загружает код из флешь в SRAM1 и remp = 1 . По адресу 0 стала ведь SRAM1. В ней до 4k программы. сразу вопрос AT45DB161D имеет страницы по 528/512. Загрузится из 1ой первый 512 потом из второй первые 512 итд а оставшиеся 26 в каждой странице для нужд программиста. или будут грузится все 528 байт?В этом за груженом куске я настраиваю кешь, тактирование. Цитата Все остальное - инициализацию кэшей, SDRAM, Те её нужно ещё настраивать? А defunct советовал отлаживать программу в SDRAM? Поймите меня правильно на той плате что сейчас у меня SDRAM нет (конструктора так постарались), но на следующей версии будет. По этому важно знать можно ли сразу с J-Link будет в неё грузить? Объём загруженного кода определяется значением что был по 0x14 (RESERVED) в SPI dataFlash Далее загружаю из ФЛЕШЬ в SDRAM и перехожу на неё вызывая фиктивную функцию. Цитата Ничего не понял, если честно. Почему так именно Undefined_Handler покоя не дает? Он для примера. Просто не хочется остовлять ситуации в которые может попасть процесор и обработчика там не будет. Результат кажется сложно предсказуемым, да и узнать что случилось "именно така" ситуация становится не возможным. Цитата После загрузки, основная программа может совершенно спокойно записать в область векторов что-то свое. каким образом? там ведь выполняемый код? (хоть и перезаписываемый) можно пример? Прошу извинение за докучливость, но очень нужно разобраться.
|
|
|
|
|
Jul 28 2009, 12:22
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(crack_enigma @ Jul 28 2009, 16:08)  Как я понял (из основного распределения памяти даташита) SPI dataFlash находится по этому адресу. До тех пор пока не будет remp = 0 и BMS = 0. Или я чтото серьёзно путаю? SPI DataFlash вообще не может быть отмаплена в адресное пространство. По адресу 0x10000000 расположено пространство нулевого чипселекта параллельной шины. Цитата(crack_enigma @ Jul 28 2009, 16:08)  Те по сути загружает код из флешь в SRAM1 и remp = 1 . По адресу 0 стала ведь SRAM1. В ней до 4k программы. Да. Цитата(crack_enigma @ Jul 28 2009, 16:08)  сразу вопрос AT45DB161D имеет страницы по 528/512. Загрузится из 1ой первый 512 потом из второй первые 512 итд а оставшиеся 26 в каждой странице для нужд программиста. или будут грузится все 528 байт? Хм, никогда не задавался таким вопросом. Но это легко можно проверить. Цитата(crack_enigma @ Jul 28 2009, 16:08)  Те её нужно ещё настраивать? А defunct советовал отлаживать программу в SDRAM? Поймите меня правильно на той плате что сейчас у меня SDRAM нет (конструктора так постарались), но на следующей версии будет. По этому важно знать можно ли сразу с J-Link будет в неё грузить? Инициализировать нужно. Можно сделать это и скриптом при помощи J-Link. Цитата(crack_enigma @ Jul 28 2009, 16:08)  каким образом? там ведь выполняемый код? (хоть и перезаписываемый) можно пример? Какой код? Для стартующей программы там просто такая же память, как и любая другая. Для IAR'а пример не дам, т.к. им не пользуюсь. Работа со скриптом линкера должна быть описана в документации.
|
|
|
|
|
Jul 28 2009, 12:49
|
Участник

Группа: Участник
Сообщений: 30
Регистрация: 6-07-07
Пользователь №: 28 939

|
Цитата Цитата сразу вопрос AT45DB161D имеет страницы по 528/512. Загрузится из 1ой первый 512 потом из второй первые 512 итд а оставшиеся 26 в каждой странице для нужд программиста. или будут грузится все 528 байт? Хм, никогда не задавался таким вопросом. Но это легко можно проверить. А как? Цитата Цитата каким образом? там ведь выполняемый код? (хоть и перезаписываемый) можно пример? Какой код? Для стартующей программы там просто такая же память, как и любая другая. Для IAR'а пример не дам, т.к. им не пользуюсь. Работа со скриптом линкера должна быть описана в документации. Буду искать данный момент, но в чём сущность этого скрипта? Те как он поможет переместить в момент выполнения в заданные адреса код ? Если есть пример под keil или другую систему тоже поможет (по аналогии легче будет разобраться).
|
|
|
|
|
Jul 28 2009, 12:59
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(crack_enigma @ Jul 28 2009, 16:49)  А как? Записать блок Самбой, потом вычитать программой из процессора. Цитата(crack_enigma @ Jul 28 2009, 16:49)  Буду искать данный момент, но в чём сущность этого скрипта? Те как он поможет переместить в момент выполнения в заданные адреса код ? Если есть пример под keil или другую систему тоже поможет (по аналогии легче будет разобраться). Суть в том, что при старте программы отрабатывает библиотечный загрузчик, который распаковывает и копирует секции кода и данных в предназначенные им места и инициализирует секции zero-init (bss/ZI). Пример для Keil'а: Код FLASH 0x00120000 0x00020000 { FLASH 0x00100000 0x00020000 { * (startup, +First) * (+RO) } RAM 0x00000000 0x00010000 { vectors.o (vectors, +First) * (+RW, +ZI) } } Здесь все Read Only секции (код, данные) останутся на месте, содержимое файла vectors.s размещено с нулевого адреса RAM, за ним будут расположены RW- и ZI-данные.
|
|
|
|
|
Jul 28 2009, 15:15
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(DpInRock @ Jul 28 2009, 18:43)  Датафлэш работает с 528 байтами. 512 - исключительное и исключительно редкое состояние. И никому не нужное. Это теоретически, или проверяли на самом деле? Цитата(DpInRock @ Jul 28 2009, 18:43)  Насклько я представляю, НИЧЕГО автматически не делается. Никто ничего никуда не размещает. Вернее, размещает, но при компиляции-линковке. И размещает в файле. А дальше - как сам хочешь.. Из вашего сообщения НИЧЕГО нельзя понять. О чем речь-то?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|