Перейти к содержанию
    

Непонятки в ИАРе

Проц 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. Я же не делаю нигде явно эти вызовы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос такой - Какие могут быть принципиальные отличия при выполнении программы двумя вышеописанными способами?
При отладке ИАРом могут исполняться макросы из .mac - файла, если он подключен в Project->options->Debugger.
Откуда вызываются csturtup и __low_level_init. Я же не делаю нигде явно эти вызовы...
Вектор reset сегмента INTVEC передает управление cstartup, cstartup вызывает __low_level_init(), инитит при необходимости ОЗУ и вызывает main(). Порсмотрите еще эту ветку, может поможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При отладке ИАРом могут исполняться макросы из .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овским дебагером, делаю из него ресет - программа пошла заново - но теперь все нормально!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Такое ощущение, что я не переписываю вектор data abort'a по 0x10 и как-будто остается старый, от romboot'а. Но я тупо printfом вывожу содержимое вектора в начале маина - там МОЙ вектор..., а обработчик вызыватся romboot'а,
Не работал с romboot (и 9200 ;) ), но давайте попробуем по шагам.

1)В какие адреса копируете вектор?

2)почему только один вектор, а не все?

3)Делаете ремап?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не работал с 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... все... Иногда, очень редко вызывался мой обработчик (если не отключать питание платы, а сделать ресет - и сразу залить прогу через ромбут - видимо, оставались правильные вектора после отладки из ИАРа).

 

А не может ли ромбут как-нибудь блокировать запись в свои вектора...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В ее начале - вектора. Вот они:

  21F00018  E51FFF20  LDR          PC, [PC, #-3872]; [0x21EFF100] =0x21F0085C

Смущает это место. Здесь идет обращение к ячейке, адрес которой указан отностительно положения этой команды до ремапа, а после ремапа команда будет находиться в других адресах и обращаться к совсем другой ячейке. Первое же прерывание порушит все. Вам надо этот вектор переписать в таком же виде как и вектора Reset и DataAbort.
А в нулевом адресе - вектора ромбута. Вот они:
Обратите внимание, что описан вектор FIQ. Вам надо или повесить свой обработчик, или запрерить FIQ или внимательно следить, чтобы не затереть их обработчик (а что он может натворить - неизвестно), я бы пока запретил FIQ глобально или явно запрограммировал весь AIC, чтобы FIQ точно не вызывалось.
Кстати, окошко дизасемблера ИАРа показывает старый контент (???) - нужно смотреть в память.
Да. Только не забывайте, что вы не вызывали romboot, он не настраивал по-своему AIC и не разрешил прерывания.

 

Но если бинарник загрузить во флешку, откуда его romboot переписывает в 0x21f00000 и запускает - то ничего не работает....
Думаю дело в прерываниях. Попробуйте сначала организовать правильный вектор на свой обработчик, перед настройкой AIC запретить прерывания, а разрешать их после ремапа.
А не может ли ромбут как-нибудь блокировать запись в свои вектора...
Ну, у Daermon по ссылке выше не блокировал. Да и как это физически реализовать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин! Два дня искал причину! Поправил все вектора, чтоб они указывали на корректные адреса после их рамапа в 0. Перестроил AIC - запретил и очистил все, что только можно! - Все равно вылезал старый обработчик. Ну бред, не бывает так....он явно где-то кэшировался, этот старый адрес. Потом сделал такую вещь:

 

                mov r0, #0
                mcr p15, 0,  r0, c1, c0, 0

 

Записал в CP15 нули. Отключил кеш инструкций в том числе. Все заработало Вообще странно. Я его использовал, но включал позже, после всех ремапов...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...