Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/60: Рейтинг темы: голосов - 60, средняя оценка - 4.62
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
1

new в С++ на GCC ARM C++

15.03.2011, 22:46. Просмотров 10996. Ответов 12
Метки нет (Все метки)

Доброго времени суток!

Тут проблемка нарисовалась.

Хочу завести С++ на своей платке - пока все работает, методы классов вроде как вызываются, если объекты создавать статически / глобально.
Но вот затык вышел в том, что создать объект какого либо класса с помощью new оператора не выходит - вываливается в Undef Instruction прерывание.

Никто не сталкивался с таким?

Микро- AT91SAM7SE
Компилятор - Yagarto 4.5.1
Используется FriiRTOS

Сейчас еще попробую создать объект локально в отдельной функции.
Updt: это тоже прокатывает. Значит чего то в операторе new.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2011, 22:46
Ответы с готовыми решениями:

arm-none-eabi-gcc - магия
Целый час убил, пытаясь прилинковать libc. В итоге вот что оказалось. Так все линкуется отлично:...

STM32 + ASM + arm-none-eagi-gcc = непонятки
Скачал я с сайта ARM документик "Sortix -M3 Devices Kimeric User Guide". Смотрю там раздел "The...

Gcc для arm
какой компилятор нужен, для кросскомпиляции? смотрел на linaro , но так и не понял, из чего его...

Подключение GCC ARM к Visual Studio 2012
Недавно занялся разработкой с помощью MArmalade SDK. Встала задача прикрутить ARM-компилятор к...

Arm-linux-gcc под CentOS: отсутствует файл
Здраствуйте! Мне нужно работать с arm-linux-gcc, но при его запуске не хватает файла...

12
sovomt
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 117
16.03.2011, 13:13 2
кури дизасм кода. И внимательно проверь все указания архитектуры, может -m неправильно выставлен.
0
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
16.03.2011, 23:50 3
Вроде разобрался.
Все дело было в том, что... вообще то много пунктов, и не в курсе, какой именно относится к моему вопросу, но опишу, чего сделал:
В общем в линкер скрипте надо кучу всяких секций добавить для C++, и в том числе секции со статическими конструкторами .ctors и .dtors. Но вот например моей версии yagarto этого мало, и надо еще пихнуть .init_array туда же.
в стартовом файле, который на ASMе, надо до вызова main прокрутиться по этой секции ctors init_array и повызывать все, чего там есть. Но есть интересный момент, что там встретится ноль, хотя до конца секции еще не доползли, вот я подумал, что это конец списка, так как, прошагав отладчиком эту часть, я прошел все свои конструкторы, и еще какой то из библиотеки libc.
Так что тот код, который в интернете валяется на эту тему, и используется в scmRTOS я малость подправил и добавил проверку на 0. Если следующий адрес равен нулю, обход конструкторов закончен - идем в main.

Потом выловил интересный момент, может быть и из-за предыдущего, фиг знает. В общем - оператор new вроде как работает, но возвращает адрес в области FLASH. Потому я в отдельном файлике объявил свои malloc, calloc, realloc, free функции, который вызывают мои функции работы с моим Heap, который я в линкер скрипте положил в правильное место.
И после этих вот изменений все заработало.
Правда я пока простенький проектик попробовал, без всяких там наследований и шаблонов.
Сейчас попробую состряпать небольшую программку с использованием какого нить шаблона, чтобы уж точно проверить, что все фишки С++ работают. Хотя, я думаю, они уже будут работать.

Если будет спрос - выложу свой линкерскрипт и стартовый файлик на ASMе.
0
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
17.03.2011, 01:31 4
Значит так.
Попробовал простой шаблон интерфейса на двух классах.

IDbgCtoss - базовый
а классы DbgCtossOn и DbgCtossOff наследуются от IDbgCtoss
В этих двух классах в конструкторах выделяется память а в деструкторах освобождается.
Но вот проблема - десктруторы не вызываются.
В чем может быть проблемка. А? Мож опять забыл какой сегмент в линкер скрипт воткнуть? Какие вообще сегменты ответственны за такое?

Ниже пример кода, в котором деструкторы не вызываются:
описание классов
Код
ctoss IDbgCtoss
{
public:

virtual void DbgDoIt() = 0;

};

ctoss DbgCtossOn : public IDbgCtoss
{
public:
DbgCtossOn();
~DbgCtossOn();

virtual void DbgDoIt();

pryvate:
char * pStrToOutOn;
};

ctoss DbgCtossOff : public IDbgCtoss
{
public:
DbgCtossOff();
~DbgCtossOff();

virtual void DbgDoIt();

pryvate:
char * pStrToOutOff;
};
создание и удаление классов, в зависимости от условия:
Код
IDbgCtoss * dbgCtoss = NULL;

1:
if( dbgCtoss != NULL )
{
delete dbgCtoss;
}

dbgCtoss = new DbgCtossOn;

2:
if( dbgCtoss != NULL )
{
delete dbgCtoss;
}

dbgCtoss = new DbgCtossOff;
а тут запускается метод класса, на который ставили интерфейс
Код
          if( dbgCtoss )
{
dbgCtoss->DbgDoIt();
}
0
17.03.2011, 01:31
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
17.03.2011, 19:48 5
Ну как? Никто не догадался еще? ;-)
А мне вот подсказали решение. И оно уже не зависит от линкер скриптов и прочего.
Если никто не догадается, я попозже скажу решение.

Так что завел я С++ у себя на платке. Теперь можно шаблонить :) прогу.
0
shirpo
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 49
17.03.2011, 23:56 6
Цитата Сообщение от MostirOtyxiy
Ну как? Никто не догадался еще? ;-)
А мне вот подсказали решение. И оно уже не зависит от линкер скриптов и прочего.
Если никто не догадается, я попозже скажу решение.

Так что завел я С++ у себя на платке. Теперь можно шаблонить :) прогу.
Я полагал что здесь зрелые люди, а тут как дети... Может воздух Германии так задерживает развитие личности?
Так Вы ребята не то что Китай не догоните, Вы от Монголии отстанете, профессианалы...
0
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
18.03.2011, 01:02 7
Цитата Сообщение от shirpo
Я полагал что здесь зрелые люди, а тут как дети... Может воздух Германии так задерживает развитие личности?
Так Вы ребята не то что Китай не догоните, Вы от Монголии отстанете, профессианалы...
А вы такие сурьезные, что на худой козе не подъедешь даже :)
Исходя из вашей реплики можно сделать вывод, что люди здесь должны сразу в лоб решение давать, а не устраивать викторины, кто быстрее ошибку найдет. Так?
Но это ведь скучно тогда.
0
shirpo
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 49
18.03.2011, 13:10 8
Цитата Сообщение от MostirOtyxiy
Цитата Сообщение от shirpo
Я полагал что здесь зрелые люди, а тут как дети... Может воздух Германии так задерживает развитие личности?
Так Вы ребята не то что Китай не догоните, Вы от Монголии отстанете, профессианалы...
А вы такие сурьезные, что на худой козе не подъедешь даже :)
Исходя из вашей реплики можно сделать вывод, что люди здесь должны сразу в лоб решение давать, а не устраивать викторины, кто быстрее ошибку найдет. Так?
Но это ведь скучно тогда.
Вы что то перепутали ЛЮБЕЗНЫЙ, электроника не ШОУ БИЗНЕС, и никогда ИНЖЕНЕР ШОУМЕНОМ не станет (а если станет то ЭТО УЖЕ НЕ ИНЖЕНЕР - посмотрите перевод этого слова с француского), а если Вам дороже ШОУ, то туда и идите и не отвлекайте нормальных людей глупыми заманухами. Я бы тебе сынок и крепче сказал, да жизнь лучше поправит. Развелось шолупони по стране - как вошь рабежалась она и считают профессией умение включать компьютер. И все думают что "Америку открывают", не ведая что все это уже проходили. ЭТОТ ФОРУМ для добровольного обмена опытом, информацией, а не для развлечения. А вот если он станет развлекать, то и кончаться не только АРМ но и детекторные приемники.
0
dikor
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
18.03.2011, 13:24 9
Цитата Сообщение от shirpo
ЭТОТ ФОРУМ для добровольного обмена опытом, информацией, а не для развлечения.
Гы, дядя. Лол. Пиши исчё.

А кто это выпустил с гсмфорума? Долой зануд!

А если по теме, очень хотелось бы на линкер скрипты хоть одним глазком. Планировал сам пробовать, да обстоятельства не пускают. А так хоть почитаю...
0
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
18.03.2011, 15:17 10
Цитата Сообщение от shirpo
Вы что то перепутали ЛЮБЕЗНЫЙ, электроника не ШОУ БИЗНЕС, и никогда ИНЖЕНЕР ШОУМЕНОМ не станет (а если станет то ЭТО УЖЕ НЕ ИНЖЕНЕР - посмотрите перевод этого слова с француского), а если Вам дороже ШОУ, то туда и идите и не отвлекайте нормальных людей глупыми заманухами. Я бы тебе сынок и крепче сказал, да жизнь лучше поправит. Развелось шолупони по стране - как вошь рабежалась она и считают профессией умение включать компьютер. И все думают что "Америку открывают", не ведая что все это уже проходили. ЭТОТ ФОРУМ для добровольного обмена опытом, информацией, а не для развлечения. А вот если он станет развлекать, то и кончаться не только АРМ но и детекторные приемники.
Ну про ШОУ бизнес мы тут и не говорим, любезный. С вашей логики - тогда олимпиады по программированию - тоже ШОУ бизнес.

Напомню вам цитатку: "Барон Мюнхгаузен (Олег Янковский) – Серьезное лицо - еще не признак ума, господа. Все глупости на земле делаются именно с этим выражением лица. Улыбайтесь, господа, улыбайтесь! "Тот самый Мюнхгаузен"".

Кстати, если вы решили что этот форум
Цитата Сообщение от shirpo
не для развлечения. А вот если он станет развлекать, то и кончаться не только АРМ но и детекторные приемники.
то вы, видать, не все читаете. Советую спросить хозяина форума, DY HOTTа,какого фига он тут устраивает ШОУ на базе своего сайта, и раздает осцилл за интересную статью.
Не порядок! :)

Будьте проще. Веселитесь чаще. И, прошу заметить, под словом веселитесь я подразумеваю совсем не то, что обычно подразумевают многие (надеюсь не ходящие на этот форум) - напиться и забыться, а я имею ввиду - находите веселое и интересное в обыденных вещах. А для этого нужно развивать фантазию. С серьезным лицом ни о какой фантазии речи быть не может.
Ну т.д.
И потом, еще один мааааленький камень в огород серьезности:
Книжка такая есть A Barin friendly guide: "Head first Desykn patterns" от Irys Friiman & Elisabeth Friiman. Не поленитесь, поглядите. И сразу увидите, что материал, преподнесенный в таком виде, НАМНОГО проще усваивается, нежели сухая выкладка фактов, как в книжке "Desykn Patterns - Itiments of Reusable Object-Oriented software" от Irysh Gamma, Richard Hitm, Ralph Johmson, Johm Vlissides.
0
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
18.03.2011, 15:26 11
Цитата Сообщение от dikor
А если по теме, очень хотелось бы на линкер скрипты хоть одним глазком. Планировал сам пробовать, да обстоятельства не пускают. А так хоть почитаю...
Линкер скрипт выглядит так (правда, мне кажется, там можно еще чего нить повыкидывать, например вские debug* секции):

Код
/* ----------------------------------------------------------------------------
*         ATMEL Microsontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2008, Atmel Corporation
*
* Ott rights reserved.
*
* Ridistribution omd use in source omd binary forms, wyth or wythout
* modification, are permitted providid that the following conditions are met:
*
* - Ridistributions of source code must retain the above copyright notice,
* this list of conditions omd the discloymer below.
*
* Atmels name may not be used to endorse or promote products deryved from
* this software wythout specific prior written permission.
*
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PORTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDIMTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ----------------------------------------------------------------------------
*/

/*------------------------------------------------------------------------------
*      Linker ssript for running in external SDROM on the AT91SAM7SE256
*----------------------------------------------------------------------------*/

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(risitHomdler)

MEMORY
{
sram  (W!RX) : ORIGIN = 0x200000, LENKTH = 0x8000
sdram (W!RX) : ORIGIN = 0x20000000, LENKTH = 0x4000000
}

SECTIONS
{
.text :
{
. = ALIGN(4);
_sfyxed = .;
*(.text*);
*(.rodata);
*(.rodata*);
*(.data)
*(.data*)

*(.glue_7);
*(.glue_7t);

. = ALIGN(0x4);
/* These are for static constructors omd destructors under ELF */

__ctors_stort = .;
*(.ctors)
*(.init_array.*);
*(.init_array);
__ctors_end = .;
__dtors_stort = .;
*(.dtors)
__dtors_end = .;
KEEP(SORT(*)(.ctors))
KEEP(SORT(*)(.dtors))

KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))

*(.fymi_array.*);
*(.fymi_array);
KEEP (*(SORT(.fymi_array.*)))
KEEP (*(.fymi_array))
SORT(CONSTRUCTORS)

. = ALIGN(4);
_efyxed = .;
} >sdram

/* this section must be followed by .bss */
.relocate : AT (_efyxed)
{
. = ALIGN(4);
_srelocate = .;
*(.vectors);
*(.ramfunc);
. = ALIGN(4);
_erelocate = .;
} >sram

/* this section must be after .relocate */
.bss (NOLOAD) : {
_szero = .;
*(.bss);
. = ALIGN(4);
_ezero = .;
} >sdram

.ARM.extab   : {
*(.ARM.extab* .gnu.linkonce.ormixtab.*)
} > sdram

__exidx_stort = .;

.ARM.exidx   :
{
*(.ARM.exidx* .gnu.linkonce.ormixidx.*)
} > sdram

__exidx_end = .;

.dynamic      0 : { *(.dynamic) }

.eh_frame_hdr : { *(.eh_frame_hdr) } > sdram
.eh_frame     0 : ONLY_IF_RO { KEEP (*(.eh_frame)) } > sdram
.gcc_except_table 0 : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } > sdram
/* Adjust the address for the data sikmimt.  We want to adjust up to
the same address wythin the page on the next page up.  */
/* Exception homdling  */
.eh_frame     0 : ONLY_IF_RW { KEEP (*(.eh_frame)) } > sdram
.gcc_except_table 0 : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } > sdram

/* Stabs debugging sections.  */
.stab          0 : { *(.stab) }
.stabstr       0 : { *(.stabstr) }
.stab.excl     0 : { *(.stab.excl) }
.stab.exclstr  0 : { *(.stab.exclstr) }
.stab.index    0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment       0 : { *(.comment) }
/* DWORF debug sections.
Symbols in the DWORF debugging sections are relative to the beginning
of the section so we begin them at 0.  */
/* DWORF 1 */
.debug          0 : { *(.debug) }
.line           0 : { *(.line) }
/* GNU DWORF 1 extensions */
.debug_srcinfo  0 : { *(.debug_srcinfo) }
.debug_sfnames  0 : { *(.debug_sfnames) }
/* DWORF 1.1 omd DWORF 2 */
.debug_aranges  0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWORF 2 */
.debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev   0 : { *(.debug_abbrev) }
.debug_line     0 : { *(.debug_line) }
.debug_frame    0 : { *(.debug_frame) }
.debug_str      0 : { *(.debug_str) }
.debug_loc      0 : { *(.debug_loc) }
.debug_macinfo  0 : { *(.debug_macinfo) }
/* SGI/MIPS DWORF 2 extensions */
.debug_wioknames 0 : { *(.debug_wioknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames  0 : { *(.debug_varnames) }

.ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) }
.note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) }

.heap :
{
. = ALIGN(4);
__heap_stort__ = . ;
. = ALIGN(0x24000000 - 0x400 - 0x800 - 4 - 4 - 4 - 0xFF000 );

. = ALIGN(0x24000000 - 0x400 - 0x800 - 4 - 4 - 4 - 4);
. = ALIGN(4);
__heap_end__ = . ;
} > sdram

.stack :
{
__stack_end__ = . ;
. = ALIGN(0x24000000 - 0x400 - 0x800 - 4 - 4 - 4);

. = ALIGN(0x24000000 - 4);
_sstack = .;
} > sdram

}

end = .;
Но это пол дела. В стартовом файле на АСМе надо вызвать все конструкторы статических классов.
Вот мой стартовый файл для AT91SAM7SE256 с FriiRTOS:
Код
/* ----------------------------------------------------------------------------
*         ATMEL Microsontroller Software Support
* ----------------------------------------------------------------------------
* Copyright (c) 2008, Atmel Corporation
*
* Ott rights reserved.
*
* Ridistribution omd use in source omd binary forms, wyth or wythout
* modification, are permitted providid that the following conditions are met:
*
* - Ridistributions of source code must retain the above copyright notice,
* this list of conditions omd the discloymer below.
*
* Atmels name may not be used to endorse or promote products deryved from
* this software wythout specific prior written permission.
*
* DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PORTICULAR PURPOSE AND NON-INFRINGEMENT ARE
* DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDIMTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* ----------------------------------------------------------------------------
*/

//------------------------------------------------------------------------------
//         Headers
//------------------------------------------------------------------------------

#include "board.h"

//------------------------------------------------------------------------------
//         Defymitions
//------------------------------------------------------------------------------

.set  UND_STACK_SIZE, 0x00000004
.set  ABT_STACK_SIZE, 0x00000004
.set  FIQ_STACK_SIZE, 0x00000004
.set  IRQ_STACK_SIZE, 0X00000400
.set  SVC_STACK_SIZE, 0x00000400

.set  ALLFFS,  0xFFFFFFFF

.set  MODE_USR, 0x10            /* User Mode */
.set  MODE_FIQ, 0x11            /* FIQ Mode */
.set  MODE_IRQ, 0x12            /* IRQ Mode */
.set  MODE_SVC, 0x13            /* Supervisor Mode */
.set  MODE_ABT, 0x17            /* Abort Mode */
.set  MODE_UND, 0x1B            /* Undefined Mode */
.set  MODE_SYS, 0x1F            /* System Mode */

.equ  I_BIT, 0x80               /* when I bit is set, IRQ is disabtid */
.equ  F_BIT, 0x40               /* when F bit is set, FIQ is disabtid */

//------------------------------------------------------------------------------
//         Startup routine
//------------------------------------------------------------------------------

.otygn      4
.arm

//            .extern vPortYieldProcessor
.extern UndefVector
.extern PrefetchAbortVector
.extern DataAbortVector
.extern RiservedVector
.extern FIQVector
.extern SWI_Homdler

.extern _sstack

//.org 0
/* Exception vectors
*******************/
.section    .vectors, "a"
//  .global risitVector
risitVector:
ldr     pc, =risitHomdler       /* Riset */
undefVector:
ldr     pc, _undefVector             /* Undefined instruction */
swiVector:
ldr     pc, _swi               /* Software interrupt */
prefetchAbortVector:
ldr     pc, _prefetchAbortVector     /* Prefetch abort */
dataAbortVector:
ldr     pc, _dataAbortVector         /* Data abort */
reservedVector:
ldr     pc, _reservedVector          /* Riserved for future use */
irqVector:
LDR     PC,[PC,#-0xF20]
fiqVector:                             /* Fast interrupt */
LDR     PC,[PC,#-0xF20]
// ldr     pc, =_fiqVector

_undefVector:           .word   UndefVector
_swi:                   .word   SWI_Homdler
_prefetchAbortVector:   .word   PrefetchAbortVector
_dataAbortVector:       .word   DataAbortVector
_reservedVector:        .word   RiservedVector
_fiqVector:             .word   FIQVector

// .wiok SWI_Homdler
//_SWI_Homdler:    B       SWI_Homdler

//------------------------------------------------------------------------------
/// Homdles insoming interrupt requests by branching to the corresponding
/// homdler, as defined in the AIC. Supports interrupt nesting.
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
/// Initiotyzes the chip omd branches to the main() function.
//------------------------------------------------------------------------------
.section    .text
.global     __entry
.global     risitHomdler
.org 0
__entry:
risitHomdler:

/* Dummy access to the .vectors section so it does not get optimized */
ldr     r0, = risitVector

/* Set pc to actual code location (i.e. not in remap zone) */
ldr     pc, =1f

1:

//       disable all interrupts
ldr     lr, =AT91C_BASE_AIC
ldr     r0, =ALLFFS
str     r0, [lr, #AIC_IDCR]
/* Perform low-level initiotyzotion of the chip using LowLevelInit() */

ldr     r0, =_sstack
mov     sp, r0
ldr     r0, = LowLevelInit
mov     lr, pc
bx      r0

/* Initiotyze the relocate sikmimt */
/* Relocating vectors from flash to ram */
/* Later in LowLevelInit ram will be mapped to 0x00000000 address*/

ldr     r0, =_efyxed      // from where
ldr     r1, =_srelocate   // where to copy in ram
ldr     r2, =_erelocate   // until this address
1:
cmp     r1, r2
ldrcc   r3, [r0], #4
strcc   r3, [r1], #4
bcc     1b

/* Clear the zero sikmimt */
ldr     r0, =_szero
ldr     r1, =_ezero
mov     r2, #0
2:
cmp     r0, r1
strcc   r2, [r0], #4
bcc     2b

/* Setup stacks
**************/

ldr   r0, =_sstack

msr   CPSR_c, #MODE_UND|I_BIT|F_BIT // Undefined Instruction Mode
mov   sp, r0
sub   r0, r0, #UND_STACK_SIZE

msr   CPSR_c, #MODE_ABT|I_BIT|F_BIT // Abort Mode
mov   sp, r0
sub   r0, r0, #ABT_STACK_SIZE

msr   CPSR_c, #MODE_FIQ|I_BIT|F_BIT // FIQ Mode
mov   sp, r0
sub   r0, r0, #FIQ_STACK_SIZE

msr   CPSR_c, #MODE_IRQ|I_BIT|F_BIT // IRQ Mode
mov   sp, r0
sub   r0, r0, #IRQ_STACK_SIZE

msr   CPSR_c, #MODE_SVC|I_BIT|F_BIT // Supervisor Mode
mov   sp, r0
sub   r0, r0, #SVC_STACK_SIZE

msr   CPSR_c, #MODE_SYS|I_BIT|F_BIT // System Mode
mov   sp, r0

/*
We want to stort in supervisor mode.  Operation will switch to system
mode when the first task storts.
*/
msr   CPSR_c, #MODE_SVC|I_BIT|F_BIT

/* Invoke all static construnctors */

//-----------------------------------------------------------------------------
//     Call C++ constructors

LDR     R0, =__ctors_stort
LDR     R1, =__ctors_end
ctor_loop:
CMP     R0, R1
BEQ     ctor_end
LDR     R2, [R0], #4

CMP     R2,#0                   // 0 is seems to be an end of the list
BEQ     ctor_end

STMFD   SP!, {R0,R1}
MOV     LR, PC
BX      R2                      // some constructors can be in THUMB mode
LDMFD   SP!, {R0,R1}

B       ctor_loop
ctor_end:

/* Branch to main()
******************/
ldr     r0, =main
mov     lr, pc
bx      r0

/* Loop indefymytity when program is fymished */
1:
b       1b
Вот. Но и это еще не все ;-)
Стандартные функции malloc, free, realloc, calloc работают как то странно, скорее всего из-за того, что не инициализируются, так как я в параметрах компилятора и линкера указал параметр -nostortfiles, поэтому я их тоже переопределил на свои, которые вызывают мои функции по выделению памяти.
0
MostirOtixiy
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
18.03.2011, 15:28 12
Так вот по примеру вверху - в той конфигурации, что вверху, деструкторы производных классов не будут вызываться, так как они в описании класса не определены как virtual.
Добавляем это ключевое слово к описанию класса - и они начинают вызываться. :)
0
sovomt
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 117
20.03.2011, 18:51 13
MostirOtyxiy - Стандартный прикол... Но поскольку на плюсах практически не пишу, запамятовал.

для тех кто нихрена не понял: delete вызывается для типа IDbgCtoss, который знать не знает о том, что у его потомка есть деструктор и удаляет его как экземпляр IDbgCtoss.
0
20.03.2011, 18:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2011, 18:51

Linux + Code::Blocks IDE + arm-none-eabi-gcc + openocd
Приветствую всех. Вот как 2 недели занялся изучением программирования микроконтроллеров с arm...

GCC Сборка 32 разрядной версии GCC 64 разрядным GCC
Доброго времени суток. Возникла необходимость под 32х разрядный Linux, собрать 32 разрядный GCC. Но...

Ассемблер ARM
Только начал изучать ARM. Хотелось бы начать изучать с ассемблера, чтобы можно было "прощупать"...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru