Gemm 0 22 ноября, 2007 Опубликовано 22 ноября, 2007 · Жалоба Проц AT91RM9200. IAR 4.41. JTAG SAM-ICE. SPI флешка AT45DB642D Отлаживаюсь, загружая программу в SDRAM. Все отладил, все из под IAR работает. Из IAR, я так понимаю, нет возможности загрузить прогу сразу во флеш, тк нет загрузчика (General options -> Debugger -> Download -> use flashloader). Не стал писать свой загрузчик - взял romboot от Атмел (им, вообще, uboot грузят...) и гружу через UART. Этот ромбут полезная вещь - инициализирует SDRAM, умеет работать с моей флешкой - загружает программу по адресу 0x21f00000 и запускает ее. Бинарник для загрузки - raw binary в настройках линкера. В cstartup делаю ремап на 0x200000, на внутреннюю память. И меняю вектор data abort'a, чтоб мой обработчик исполнялся, а не обработчик этого romboot. Так вот если из под IAR - он действительно меняется и выполняется, а если запускаю программу, загруженную через romboot - ни хрена. Но если приаттачиться в ИАРе к работающей программе - опять мой обработчик работает. Вопрос такой - Какие могут быть принципиальные отличия при выполнении программы двумя вышеописанными способами? Откуда вызываются csturtup и __low_level_init. Я же не делаю нигде явно эти вызовы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 22 ноября, 2007 Опубликовано 22 ноября, 2007 · Жалоба Вопрос такой - Какие могут быть принципиальные отличия при выполнении программы двумя вышеописанными способами?При отладке ИАРом могут исполняться макросы из .mac - файла, если он подключен в Project->options->Debugger.Откуда вызываются csturtup и __low_level_init. Я же не делаю нигде явно эти вызовы...Вектор reset сегмента INTVEC передает управление cstartup, cstartup вызывает __low_level_init(), инитит при необходимости ОЗУ и вызывает main(). Порсмотрите еще эту ветку, может поможет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gemm 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба При отладке ИАРом могут исполняться макросы из .mac - файла, если он подключен в Project->options->Debugger.Вектор reset сегмента INTVEC передает управление cstartup, cstartup вызывает __low_level_init(), инитит при необходимости ОЗУ и вызывает main(). Порсмотрите еще эту ветку, может поможет. mac файл я отключил - перенес ремап из него в cstartup. В low_level_init у меня только настройка PLL, SDRAM инитит загрузчик romboot. Такое ощущение, что я не переписываю вектор data abort'a по 0x10 и как-будто остается старый, от romboot'а. Но я тупо printfом вывожу содержимое вектора в начале маина - там МОЙ вектор..., а обработчик вызыватся romboot'а, старый. Бред! Это при запуске без участия IAR'a. Тутже, к этому же коду аттачусь IARовским дебагером, делаю из него ресет - программа пошла заново - но теперь все нормально!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Такое ощущение, что я не переписываю вектор data abort'a по 0x10 и как-будто остается старый, от romboot'а. Но я тупо printfом вывожу содержимое вектора в начале маина - там МОЙ вектор..., а обработчик вызыватся romboot'а,Не работал с romboot (и 9200 ;) ), но давайте попробуем по шагам. 1)В какие адреса копируете вектор? 2)почему только один вектор, а не все? 3)Делаете ремап? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gemm 0 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба Не работал с romboot (и 9200 ;) ), но давайте попробуем по шагам. 1)В какие адреса копируете вектор? 2)почему только один вектор, а не все? 3)Делаете ремап? Спасибо :) Давайте... Программа из ИАРа грузится в SDRAM по адресу 0x21F00000. Сконфигурил линкер на такой адрес, потому что romboot тоже туда грузит. Т.е., после загрузки ИАРом и romboot'ом программа лежит по этому адресу. В ее начале - вектора. Вот они: __program_start: 21F00000 E59FF018 LDR PC, [PC, #+24] ; [0x21F00020] =?cstartup (0x21F00074) 21F00004 00000000 ANDEQ R0, R0, R0 21F00008 00000000 ANDEQ R0, R0, R0 21F0000C 00000000 ANDEQ R0, R0, R0 ldr pc,[pc,#24]; Branch to data_handler 21F00010 E59FF018 LDR PC, [PC, #+24] ; [0x21F00030] =?data_abort (0x21F0003C) 21F00014 0841A006 STMEQDA R1, {R1,R2,SP,PC}^ ldr PC,[PC,#-0xF20] 21F00018 E51FFF20 LDR PC, [PC, #-3872] ; [0x21EFF100] =0x21F0085C 21F0001C 00000000 ANDEQ R0, R0, R0 21F00020 21F00074 MVNCSS R0, R4, ROR R0 21F00024 00000000 ANDEQ R0, R0, R0 21F00028 00000000 ANDEQ R0, R0, R0 21F0002C 00000000 ANDEQ R0, R0, R0 21F00030 21F0003C MVNCSS R0, R12, LSR R0 21F00034 00000000 ANDEQ R0, R0, R0 21F00038 00000000 ANDEQ R0, R0, R0 А в нулевом адресе - вектора ромбута. Вот они: 00000000 EA000006 B 0x000020 ; RESET 00000004 EA08006D B 0x2001C0 ; UND 00000008 EAFFFFFE B 0x000008 ; SWI 0000000C EA08005F B 0x200190 ; P ABT 00000010 EA080053 B 0x200164 ; D ABT 00000014 0841A018 STMEQDA R1, {R3,R4,SP,PC}^ 00000018 E51FFF20 LDR PC, [PC, #-3872] ; IRQ [AIC_IVR (0xFFFFF100)] =0x20012C 0000001C EA080071 B 0x2001E8 ; FIQ 00000020 E3A00981 MOV R0, #0x204000 ; 0x204028 00000024 E321F0D1 MSR CPSR_c, #0xD1 00000028 E1A0D000 MOV SP, R0 0000002C E2400004 SUB R0, R0, #0x4 00000030 E321F0D2 MSR CPSR_c, #0xD2 00000034 E1A0D000 MOV SP, R0 00000038 E2400010 SUB R0, R0, #0x10 В самом начале cstartup, до ремапа, беру их и копирую в начало ОЗУ - в 0x200000 (сейчас копирую все, а не один, как раньше, но особо ничего не поменялось). Далее делаю ремап, если нужно. Вот после этого, по идее, я перетер все ромбутовские вектора. Ну никак его обработчики не должны вызываться! Кстати, окошко дизасемблера ИАРа показывает старый контент (???) - нужно смотреть в память. Все дальше работает замечательно. Далее искусственно вызываю data abort *((int*)0x01) = 1; - попадаю в свой (0x21F0003C) обработчик. Но если бинарник загрузить во флешку, откуда его romboot переписывает в 0x21f00000 и запускает - то ничего не работает.... запускается ромбутовский обработчик -F- Data Abort detected... все... Иногда, очень редко вызывался мой обработчик (если не отключать питание платы, а сделать ресет - и сразу залить прогу через ромбут - видимо, оставались правильные вектора после отладки из ИАРа). А не может ли ромбут как-нибудь блокировать запись в свои вектора... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 23 ноября, 2007 Опубликовано 23 ноября, 2007 · Жалоба В ее начале - вектора. Вот они: 21F00018 E51FFF20 LDR PC, [PC, #-3872]; [0x21EFF100] =0x21F0085C Смущает это место. Здесь идет обращение к ячейке, адрес которой указан отностительно положения этой команды до ремапа, а после ремапа команда будет находиться в других адресах и обращаться к совсем другой ячейке. Первое же прерывание порушит все. Вам надо этот вектор переписать в таком же виде как и вектора Reset и DataAbort.А в нулевом адресе - вектора ромбута. Вот они:Обратите внимание, что описан вектор FIQ. Вам надо или повесить свой обработчик, или запрерить FIQ или внимательно следить, чтобы не затереть их обработчик (а что он может натворить - неизвестно), я бы пока запретил FIQ глобально или явно запрограммировал весь AIC, чтобы FIQ точно не вызывалось.Кстати, окошко дизасемблера ИАРа показывает старый контент (???) - нужно смотреть в память.Да. Только не забывайте, что вы не вызывали romboot, он не настраивал по-своему AIC и не разрешил прерывания. Но если бинарник загрузить во флешку, откуда его romboot переписывает в 0x21f00000 и запускает - то ничего не работает....Думаю дело в прерываниях. Попробуйте сначала организовать правильный вектор на свой обработчик, перед настройкой AIC запретить прерывания, а разрешать их после ремапа.А не может ли ромбут как-нибудь блокировать запись в свои вектора...Ну, у Daermon по ссылке выше не блокировал. Да и как это физически реализовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gemm 0 26 ноября, 2007 Опубликовано 26 ноября, 2007 · Жалоба Блин! Два дня искал причину! Поправил все вектора, чтоб они указывали на корректные адреса после их рамапа в 0. Перестроил AIC - запретил и очистил все, что только можно! - Все равно вылезал старый обработчик. Ну бред, не бывает так....он явно где-то кэшировался, этот старый адрес. Потом сделал такую вещь: mov r0, #0 mcr p15, 0, r0, c1, c0, 0 Записал в CP15 нули. Отключил кеш инструкций в том числе. Все заработало Вообще странно. Я его использовал, но включал позже, после всех ремапов... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться