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

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

|
Всем привет.
Разбираюсь с прерываниями мк AT91SAM9260 IRQ1 и IRQ2. Прошу просто пример кода где они настраиваются и разрешаются. Среда IAR. Язык С.
|
|
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 39)
|
Jul 1 2009, 12:01
|
Участник

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

|
Профи, ну помогите!!!!ниже код (в обработчики прерывания не попадаю) CODE void DefInt(); //обработчик прерываний - один на всех пока
extern "C" __irq __arm void IRQ_Handler(void); extern "C" __irq __arm void FIQ_Handler(void);
int main() { //тактирование //...
//настройка PIO AT91S_PIO * PIOC = AT91C_BASE_PIOC; PIOC->PIO_PPUDR = 0xFFFFFFFF; PIOC->PIO_BSR = bit14|bit15; //IRQ1 IRQ2 PIOC->PIO_PDR = bit14|bit15;
//конфигурирование прерываний AT91S_AIC * aic_reg = AT91C_BASE_AIC; //регитсры прерываний AT91_REG * handler = aic_reg->AIC_SVR; //обработчики AT91_REG * mode = aic_reg->AIC_SMR; //режим работы AT91_REG * rgIDCR = &(aic_reg->AIC_IDCR); //регистр запрета прерываний AT91_REG * rgIECR = &(aic_reg->AIC_IECR); //регистр разрешения прерываний AT91_REG * rgICCR = &(aic_reg->AIC_ICCR); //регистр очистки флага прерываний AT91_REG * rgISCR = &(aic_reg->AIC_ISCR); // Регистр установки прерываний *rgIDCR = 0xFFFFFFFF; *rgICCR = 0xFFFFFFFF; *rgISCR = 0xFFFFFFFF; for(int i = 0; i<32; i++){handler[i]= (unsigned int)DefInt;} *rgIECR = 0xFFFFFFFF;// AIC_IECR
__enable_interrupt(); //разрешить прерывания //импульсы на входе порта за счёт подтягивающих резисторов while(1) { AT91C_BASE_PIOC-> PIO_PPUER = 0xC000; for(int i =0; i<100000; i++); AT91C_BASE_PIOC-> PIO_PPUDR = 0xC000; for(int i =0; i<100000; i++); }
return 0; }
__irq __arm void IRQ_Handler(void) { while(1); } __irq __arm void FIQ_Handler(void) { while(1); }
void DefInt() { while(1); }
|
|
|
|
|
Jul 1 2009, 12:15
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата импульсы на входе порта за счёт подтягивающих резисторов Вы уверены, что они физически есть? Pull-down снаружи присутствует? Цитата *rgIECR = 0xFFFFFFFF;// AIC_IECR Не стоит включать все подряд. И способ несколько странный - вместо использования многочисленных указателей можно просто написать *AT91C_AIC_IECR = (1UL << AT91C_ID_IRQ1) | (1UL << AT91C_ID_IRQ2); Далее - куда Вы хотите попасть, и что написано в стартапе?
|
|
|
|
|
Jul 1 2009, 12:26
|
Участник

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

|
1. Подтягивающие резисторы в самом МК (смотрел осцилографом на выводе импульсы есть) 2. Включать отдельно тоже побывал эффект тод же. ПроСто пытался запустить и RTT и другие потому так и писал. 3. Стартап подпихивает сам IAR (С++ запускает из main). ASM код из отладчика вот __vector: __iar_init$$done: 00000000 E59FF018 LDR PC, [PC, #+24] ; RESET [0x20] =__iar_program_start (0x2B4) 00000004 E59FF018 LDR PC, [PC, #+24] ; UND [0x24] =Undefined_Handler (0x228) 00000008 E59FF018 LDR PC, [PC, #+24] ; SWI [0x28] =SWI_Handler (0x22C) 0000000C E59FF018 LDR PC, [PC, #+24] ; P ABT [0x2C] =Prefetch_Handler (0x230) 00000010 E59FF018 LDR PC, [PC, #+24] ; D ABT [0x30] =Abort_Handler (0x234) __vector_0x14: 00000014 00000000 ANDEQ R0, R0, R0 00000018 E59FF014 LDR PC, [PC, #+20] ; IRQ [0x34] =IRQ_Handler (0x238) 0000001C E59FF014 LDR PC, [PC, #+20] ; FIQ [0x38] =FIQ_Handler (0x23C)
PS: использую J-Link
|
|
|
|
|
Jul 2 2009, 04:27
|
Участник

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

|
изменил код на CODE //... *AT91C_AIC_IDCR = 0xFFFFFFFF; *AT91C_AIC_ICCR = 0xFFFFFFFF; for(int i = 0; i<32; i++){ AT91C_BASE_AIC->AIC_SVR[i] = (unsigned int)DefInt;} AT91C_BASE_AIC->AIC_SMR[AT91C_ID_IRQ1] = PRIOR_0|EXT_NEGATIVE_EDGE; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_IRQ2] = PRIOR_0|EXT_NEGATIVE_EDGE; *AT91C_AIC_IECR = (1UL << AT91C_ID_IRQ1) | (1UL << AT91C_ID_IRQ2); //... Цитата что у Вас в AIC_IPR и AIC_CISR в AIC_IPR 0x00000000 в AIC_CISR (NFIQ == 0 NIRQ == 0) Цитата убрать из окошка регистров AIC_IVR Как это можно cделать ? Цитата использовать Protect Mode Где его включить ?
Сообщение отредактировал crack_enigma - Jul 2 2009, 04:38
|
|
|
|
|
Jul 2 2009, 04:52
|

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

|
Поставьте вот это Код ldr PC, [PC,# -0xF20] ;AIC direct вместо вот этого в стартапе. Код 00000018 E59FF014 LDR PC, [PC, #+20]; IRQ [0x34] =IRQ_Handler (0x238)
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Jul 2 2009, 05:38
|
Участник

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

|
Цитата Поставьте вот это
Код ldr PC, [PC,# -0xF20] ;AIC direct А где стартап то лежит? примеры его видел. Но к C++ проекту он подрубается сам.
|
|
|
|
|
Jul 2 2009, 09:11
|
Участник

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

|
Цитата В окошке проекта слева. *.s В проекте при этом ФАЙЛА стартап вообще НЕТ. Вот и вопрос где он если править то его. Вообще, как я понял, проект С++ IAR 5.20 САМ подпихивает стартап. Для работы энтих векторов достаточно писать: extern "C" __irq __arm void IRQ_Handler(void);и потом его реализовать. Скажем при обращении в память за нужный диапазон в __irq __arm void Abort_Handler(void) { }замечательно заходит. Как устроены стартапы тоже смотрел и разбирался. Ну а для большей понятности ставил точку останова на самом векторе 0x18 и там то он не оказывается.
|
|
|
|
|
Jul 2 2009, 10:49
|

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

|
Так включите. Extern C - не знаю что это. Включите в проект вот этот стартап. Он берет вектора прерываний прямо из AIC. Убедитесь, что в линкерном файле достаточно стека под все прерывания. Этот стартап работает исключительно при загрузке в память с адреса 30 0000. Т.е. в неремапленную срам. И сам ее ремапит. Т.е. из флэшки этот стартап запускать нельзя.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Jul 3 2009, 05:58
|
Участник

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

|
за стартап H1818_Startup.zip благодарю. Возник наивный вопрос: ldr PC,IRQ_Addr ; IRQ ldr PC, [PC,# -0xF20] ;AIC directно тамто должен быть FIQ ? А проблема решена применением следующего CODE __irq __arm void IRQ_Handler(void) { uint IVR = * AT91C_AIC_IVR; uint SPU = * AT91C_AIC_SPU; if(IVR!=SPU){ void (*interrupt_task)(); interrupt_task = (void(*)())IVR; (*interrupt_task)(); } * AT91C_AIC_EOICR = 0xFFFF; } При этом в панели регистров лучше не открывать AIC. А можно -ли как-то исключить из боковой AIC_IVR те я повторяю вопрос оставленый aaarrr без ответа: Цитата Цитата убрать из окошка регистров AIC_IVR Как это можно cделать ? Цитата Цитата использовать Protect Mode Где его включить ?
|
|
|
|
|
Jul 3 2009, 07:46
|
Участник

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

|
Да а слона( ; ) то я не заметил. Цитата Так работают прерывания с этим стартапом или работают с любым? Или вообще без оного? Работают без него. Просто AIC_IVR считывается отладчиком а в EOICR при этом не чего IAR не пишет. Я понял это так. Вот и вопрос как IAR заставить не считывать энтот регистр.
Сообщение отредактировал crack_enigma - Jul 3 2009, 07:46
|
|
|
|
|
Jul 3 2009, 10:05
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(crack_enigma @ Jul 2 2009, 08:27)  Как это можно cделать ? Почитайте хелп ИАР'а. Цитата(crack_enigma @ Jul 2 2009, 08:27)  Где его включить ? Открыть даташит, нажать Ctrl+F, ввести "Protect Mode" и читать. В общем, читать, читать и еще раз читать. Без этого никак, поверьте.
|
|
|
|
|
Jul 6 2009, 06:33
|
Участник

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

|
Благодарю DpInRock. Перенапраление прерывания с помощью AIC это действительно очень удобно. Что касается ответа aaarrr Цитата Почитайте хелп ИАР'а. и Открыть дата шит, нажать Ctrl+F, ввести "Protect Mode"... то можно сказать только следующие: Всё как в анекдоте про ремонтника где тот берёт 1 фунт за удар молотком а 99 за то что знал куда ударить. По моему профессионал отличается тем что может ткнуть конкретно человека носом "делай вот так" а уже сам человек разберётся спросит уточнит. Ведь не лень писать "Читай ХЕЛП по иару" всесто AAA->BBB->CCC ?
|
|
|
|
|
Jul 6 2009, 10:30
|
Участник

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

|
Во первых я ни кого не хочу обидеть, а просто пытаюсь разобраться. Цитата Видите ли, объяснять то, что человек не понял - нормально. А объяснять то, что человек НЕ ЗНАЕТ - бесполезно. Во вторых про защищёны режим вполне мог бы помочь примерчик: CODE void main() { //... *AT91C_AIC_DCR = bit0; //Установить защищёный режим //... } //обработчик прерывания при перенаправлении с AIC (ldr PC, [PC,# -0xF20]; в стартапе) __irq __arm void US0() { * AT91C_AIC_IVR = 0xFFFF; //!!! даём знать что это прерывание а не опрос отладчика //.... * AT91C_AIC_EOICR = 0xFFFF; //конец прерывания }
|
|
|
|
|
Jul 6 2009, 12:54
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(crack_enigma @ Jul 6 2009, 14:30)  Во первых я ни кого не хочу обидеть, а просто пытаюсь разобраться. Чтобы разобраться, достаточно даташита и словосочетания "Protect Mode", не находите? Цитата(crack_enigma @ Jul 6 2009, 14:30)  Во вторых про защищёны режим вполне мог бы помочь примерчик: Ну вот, осилили ведь. А при получении такого "примерчика" со стороны все равно пришлось бы читать даташит.
|
|
|
|
|
Jul 8 2009, 07:52
|
Участник

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

|
Не знаю конечно, правда у каждого своя. Цитата Ну вот, осилили ведь. А при получении такого "примерчика" со стороны все равно пришлось бы читать даташит. А что легче и быстрее идти от рабочего к пониманию или от понимания к реализации? Цитата убрать из окошка регистров AIC_IVR... Почитайте хелп ИАР'а. Чётка ссылка что и где искать. Он ну очень маленький. Походу дела возник ещё 1 вопрос: При использование простого деления в режиме Thumb например: int A = 123; A/=12;вываливатся в SWI_Handel() А в режиме ARM всё корректно работает В чем дело?
|
|
|
|
|
Jul 8 2009, 11:56
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(crack_enigma @ Jul 8 2009, 11:52)  А что легче и быстрее идти от рабочего к пониманию или от понимания к реализации? От понимания к реализации. И только так. Цитата(crack_enigma @ Jul 8 2009, 11:52)  Чётка ссылка что и где искать. Он ну очень маленький. "Четкие ссылки" спросите у "пацанов на раёне".
|
|
|
|
|
Jul 9 2009, 04:56
|
Участник

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

|
Цитата "Четкие ссылки" спросите у "пацанов на раёне". Неужели у вас был на столько горький опыт в жизни? И хорошо вам всё объяснили? Опять ведь лень было просто написать: В момент запущенной отладки в IAR : Tools>Options > Register Filter Там можно настроить отображаемые регистры. А теперь задайте себе вопрос что более информативно приведённый ранее мною примерчик и этот ответ или мысли высказанные вами? Мы всё таки технари по образованию. Если теперь знаю ответ то смог коротко его сформулировать. У меня есть вопрос, но догадываюсь что ответа на него не последует. Всё же задам: У AT91SAM9260 есть BootMemory и ROM (32 кб).Возможно ли программу разместить в ROM т.е. не используя внешнею flash, если да то как это реализовать. BMS =1 настройки *.icf что имеются у меня : define symbol __ICFEDIT_region_ROM_start__ = 0x80; (побывал 0x100000) define symbol __ICFEDIT_region_ROM_end__ = 0x107FFF; define symbol __ICFEDIT_region_RAM_start__ = 0x300000; define symbol __ICFEDIT_region_RAM_end__ = 0x300FFF; После сброса питания становится очевидно что программа была в энергозависимой памяти мк. PS: от туда и ошибка с делением (подрубался лишний код(доб библиотеки IAR), и вылезали за кеш кода в результате младшие адреса с векторами становились не верными.
|
|
|
|
|
Jul 9 2009, 12:16
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(crack_enigma @ Jul 9 2009, 08:56)  Опять ведь лень было просто написать Нет, это вам было просто лень разобраться. Когда в Ворде нужно панельки инструментов настроить - тоже задаете вопросы на форумах? Цитата(crack_enigma @ Jul 9 2009, 08:56)  У меня есть вопрос, но догадываюсь что ответа на него не последует. Всё же задам: У AT91SAM9260 есть BootMemory и ROM (32 кб).Возможно ли программу разместить в ROM т.е. не используя внешнею flash, если да то как это реализовать. Возможно. Другое дело, что для этого придется купить у Атмела кристаллов на много-много K$ и попросить их записать в ROM ваш код.
|
|
|
|
|
Jul 13 2009, 09:02
|
Участник

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

|
Цитата Возможно. Другое дело, что для этого придется купить у Атмела кристаллов на много-много K$ и попросить их записать в ROM ваш код. Логично. Благодарю.  Смотрел модели со встроенной флешкой в частности AT91SAM9XE512. Сразу возник вопрос: J-Link + IAR сумеет записать программу сразу в flash и запустить на отладку? Если да то следующий конфиг верен? REMAP = 0 GPNVMBit[3] = 1 define symbol __ICFEDIT_intvec_start__ = 0x20 0000; define symbol __ICFEDIT_region_ROM_start__ = 0x20 0080; define symbol __ICFEDIT_region_ROM_end__ = 0x20 7FFF; define symbol __ICFEDIT_region_RAM_start__ = 0x300000; define symbol __ICFEDIT_region_RAM_end__ = 0x307FFF;
|
|
|
|
|
Jul 17 2009, 10:27
|
Участник

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

|
АУУ!!! Люди!!! Уже 4 дня миновало. Может кто нибудь ответит?
|
|
|
|
|
Jul 17 2009, 22:12
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(crack_enigma @ Jul 13 2009, 12:02)  Смотрел модели со встроенной флешкой в частности AT91SAM9XE512. Сразу возник вопрос: J-Link + IAR сумеет записать программу сразу в flash и запустить на отладку? Думаю без проблем. Цитата Если да то следующий конфиг верен? Адреса выглядят верно, а больше по конфигу ничего сказать не могу.. с IAR'ом не работаю. В Keil'е загрузка и отладка из флеш на XE512 + J-Link работает прекрасно. Но, не советую так делать. Когда есть SDRAM лучше грузить и отлаживать в нем. Флеш жалко, уж больно скудный его ресурс, всего 10К перезаписей...
|
|
|
|
|
Jul 24 2009, 12:24
|
Участник

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

|
Благодарю за ответ. Цитата Когда есть SDRAM лучше грузить и отлаживать в нем. Идея очень хорошая. Сразу навела на мысль SDARAM + AT91SAM9260 тогда ведь можно и загрузить в неё? И отлаживать в ней? Относительно мк AT91SAM9260: И очень интересует вопрос принципа выполнения программы а именно: при использовании внешней плешки (по SPI) нужен REMAP. 1 раз он делается мк при старте. Далее код проецируется в память. Куда не совсем понял толь на область ROM толь в КЕШ кода. Ну а вот когда этот кусочек программы закончится следующий погрузится сам или это делать приходится программным путём?
|
|
|
|
|
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)  Насклько я представляю, НИЧЕГО автматически не делается. Никто ничего никуда не размещает. Вернее, размещает, но при компиляции-линковке. И размещает в файле. А дальше - как сам хочешь.. Из вашего сообщения НИЧЕГО нельзя понять. О чем речь-то?
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|