реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Опять про загрузчик..., Не получается передать управление.
EXeGLuMATOR
сообщение Apr 9 2008, 07:05
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Перечитал все что нашел, по этой теме - так и не дошло в чем проблема.
Итак. Написан загрузчик - все пишется, все обновляется, но не получается передать управление на основную программу. Ремаплю-передаю вот так:
Код
    MEMMAP = 2;                    //Map vector table from RAM
        // Copy vectors table
    src = (unsigned long *)START_ADDR;
    dst = (unsigned long *)0x00000000;
        size = 0x40 / sizeof(*dst);
        do  { *dst++ = *src++; } while (--size);

    //Reset controller
    ((void(*)(void))(0x00000000))();


Смотрю в симуляторе, все ремапится, но после перехода на 0 получаю вот это:
*** error 65: access violation at 0x00000000 : no 'execute/read' permission

Загрузчик линкуется вот так:
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00000000 0x00020000  {   ; load region size_region
  ER_IROM1 0x00000000 0x00020000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x40000040 0x0000FFC0  { ; RW data
   .ANY (+RW +ZI)
  }
}


Основной модуль вот так:
Код
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x00006000 0x0001A000  {   ; load region size_region
  ER_IROM1 0x00006000 0x0001A000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x40000000 0x00010000  { ; RW data
   .ANY (+RW +ZI)
  }
}


В связи с этим вопросы:
1. Что не так делаю?
2. Как надо компилить-линковать основной модуль и загрузчик по расположению в памяти?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 9 2008, 07:24
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Не знаю, как оформлены вектора в основной программе, но такой простой перенос не заработает, если reset вектор сделан как relative branch.
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Apr 9 2008, 07:28
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Цитата(aaarrr @ Apr 9 2008, 11:24) *
Не знаю, как оформлены вектора в основной программе, но такой простой перенос не заработает, если reset вектор сделан как relative branch.

Да никак особо не оформлял. Стартап по умолчанию, который Кейл предлагает.
если передавать управление на основной модуль - в данном случае на 0х6000, то в симуляторе все работает и без ремапа. Но вот на железе - нет.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 9 2008, 07:41
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(EXeGLuMATOR @ Apr 9 2008, 11:28) *
Стартап по умолчанию, который Кейл предлагает.

Стартап по умолчанию скорее всего выглядит примерно так:
Код
    b        reset  ; Reset
    b        xxx    ; Undefined instruction
    b        xxx    ; Software interrupt
    b        xxx    ; Prefetch abort
    b        xxx    ; Data abort
    DCD      xxx    ; reserved
    b        xxx    ; IRQ
    b        xxx    ; FIQ

reset
        ...

После копирования векторов из 0x6000 в 0x00 команда b reset будет посылать процессор оч. далеко.
Пишите свой стартап.
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Apr 9 2008, 07:51
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Цитата(aaarrr @ Apr 9 2008, 11:41) *
После копирования векторов из 0x6000 в 0x00 команда b reset будет посылать процессор оч. далеко.
Пишите свой стартап.


Стартап вот такой:
Код
; Area Definition and Entry Point
;  Startup Code must be linked first at Address at which it expects to run.

                AREA    RESET, CODE, READONLY
                ARM


; Exception Vectors
;  Mapped to Address 0.
;  Absolute addressing mode must be used.
;  Dummy Handlers are implemented as infinite loops which can be modified.

Vectors         LDR     PC, Reset_Addr        
                LDR     PC, Undef_Addr
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                           ; Reserved Vector
;               LDR     PC, IRQ_Addr
                LDR     PC, [PC, #-0x0FF0]    ; Vector from VicVectAddr
                LDR     PC, FIQ_Addr

Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SWI_Handler
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                DCD     0                     ; Reserved Address
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

Undef_Handler   B       Undef_Handler
SWI_Handler     B       SWI_Handler
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
IRQ_Handler     B       IRQ_Handler
FIQ_Handler     B       FIQ_Handler


; Reset Handler

                EXPORT  Reset_Handler
Reset_Handler


Знать-бы еще как его написать. 05.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 9 2008, 08:00
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(EXeGLuMATOR @ Apr 9 2008, 11:51) *
Стартап вот такой...

С таким должно работать. В симуляторе вектора правильно копируются?
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Apr 9 2008, 08:26
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



То что лежит в 64 байтах от адреса 0х6000 переносится идентично на 0х00000000.
Т.е. после MEMMAP=2 на адресах от 0 стоят 0, потом все заполняется.
А после ((void(*)(void))(0x00000000))();
получаю:
*** error 65: access violation at 0x00000000 : no 'execute/read' permission
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 9 2008, 08:32
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(EXeGLuMATOR @ Apr 9 2008, 12:26) *
получаю:
*** error 65: access violation at 0x00000000 : no 'execute/read' permission

Если все происходит так, как Вы описываете, то никакого криминала при переходе на 0 быть не должно. Симулятор шибко умный у Keil'а.
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Apr 9 2008, 09:21
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Может что не так скомпилировано? Не по тем адресам? Да, еще глянул память что у загрузчика, что у основной программы первые 32 байта векторов идентичные. Разница начинается только с +0х20 адресов. разве так и должно быть?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 9 2008, 09:28
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(EXeGLuMATOR @ Apr 9 2008, 13:21) *
Может что не так скомпилировано? Не по тем адресам?

Не похоже.

Цитата(EXeGLuMATOR @ Apr 9 2008, 13:21) *
Да, еще глянул память что у загрузчика, что у основной программы первые 32 байта векторов идентичные. Разница начинается только с +0х20 адресов. разве так и должно быть?

Да. Различаться они должны начинать отсюда:
Код
Reset_Addr      DCD     Reset_Handler
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Apr 9 2008, 10:01
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Тогда не понятно в чем проблема. sad.gif Ладно-бы симулятор просто не работал - в железе тоже не работает. При передаче управления на 0х6000 в симуляторе все ок. Работает как ни в чем не бывало. На железе опять-же - ничего.
А что может блокировать доступ? Чтобы такая ошибка вылезала? Может быть не тот режим процессора? Тогда какой должен быть и как проверить/переключить?
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Apr 11 2008, 07:51
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



Глас вопиющего в пустыне.
Все делают подобные проекты и никто не знает.
Как скомпилировать исполняемый модуль, чтобы он работал в нужных адресах? Особенно вектора прерываний?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 11 2008, 09:56
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(EXeGLuMATOR @ Apr 11 2008, 10:51) *
Все делают подобные проекты и никто не знает.
Я бы попытался помочь вам, но я работаю с ИАРом и с GCC. Как это делается в кейле - без понятия. Предлагаю вам обратить внимание на последовательность передачи управления. Вы сначала ремапите в область векторов ОЗУ с мусором, потом заполняете ее, а если в это время произойдет прерывание?. Вы копируйте вектора не в нулевые адреса, а в начало ОЗУ, а уже после этого делайте ремап. Это первое. Второе. Если у вас LPC, то у него ремапится только область векторов и это замечание его не касается. У SAM7 ремапится все ОЗУ, и если программа исполняется в нулевых адресах, то после ремапа команды начинают выбираться из этих же адресов из ОЗУ, а там находятся вовсе не команды.
Чем смог...


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
amw
сообщение Apr 11 2008, 10:50
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(EXeGLuMATOR @ Apr 11 2008, 10:51) *
Глас вопиющего в пустыне.
Все делают подобные проекты и никто не знает.
Как скомпилировать исполняемый модуль, чтобы он работал в нужных адресах? Особенно вектора прерываний?

Вот минимальный рабочий пример.
Это для LPC2378 для GCC. С Keil/IAR... не работаю.
Только что проверил в плате.
Прикрепленные файлы
Прикрепленный файл  boot.zip ( 14.91 килобайт ) Кол-во скачиваний: 174
 


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
EXeGLuMATOR
сообщение Apr 11 2008, 19:10
Сообщение #15


Частый гость
**

Группа: Свой
Сообщений: 182
Регистрация: 30-01-05
Из: Volgograd
Пользователь №: 2 305



да, сорри забыл сказать. камень LPC2106. Память и вектора ремапятся нормально. А передача управления не происходит поскольку стоят неправильные адреса на векторах. Вопрос собсно как скомпилировать программу, чтобы вектора были рассчитаны на работу с 0 адреса, а сама прога с другого. Бьюсь уже сколько времени - все никак. Все компилится либо с 0 либо с адреса - соотв вектора все направлены в космос. Что-то я туплю походу где-то.
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01523 секунд с 7
ELECTRONIX ©2004-2016