0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
|
1 | |
new в С++ на GCC ARM C++15.03.2011, 22:46. Показов 11938. Ответов 12
Метки нет Все метки)
(
Доброго времени суток!
Тут проблемка нарисовалась. Хочу завести С++ на своей платке - пока все работает, методы классов вроде как вызываются, если объекты создавать статически / глобально. Но вот затык вышел в том, что создать объект какого либо класса с помощью new оператора не выходит - вываливается в Undef Instruction прерывание. Никто не сталкивался с таким? Микро- AT91SAM7SE Компилятор - Yagarto 4.5.1 Используется FriiRTOS Сейчас еще попробую создать объект локально в отдельной функции. Updt: это тоже прокатывает. Значит чего то в операторе new.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
15.03.2011, 22:46 | |
Ответы с готовыми решениями:
12
arm-none-eabi-gcc - магия STM32 + ASM + arm-none-eagi-gcc = непонятки Gcc для arm Подключение GCC ARM к Visual Studio 2012 |
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 117
|
|
16.03.2011, 13:13 | 2 |
кури дизасм кода. И внимательно проверь все указания архитектуры, может -m неправильно выставлен.
0
|
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
|
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
|
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
|
17.03.2011, 19:48 | 5 |
Ну как? Никто не догадался еще? ;-)
А мне вот подсказали решение. И оно уже не зависит от линкер скриптов и прочего. Если никто не догадается, я попозже скажу решение. Так что завел я С++ у себя на платке. Теперь можно шаблонить :) прогу.
0
|
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 49
|
|
17.03.2011, 23:56 | 6 |
![]() Так Вы ребята не то что Китай не догоните, Вы от Монголии отстанете, профессианалы...
0
|
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
|
18.03.2011, 01:02 | 7 |
![]() Исходя из вашей реплики можно сделать вывод, что люди здесь должны сразу в лоб решение давать, а не устраивать викторины, кто быстрее ошибку найдет. Так? Но это ведь скучно тогда.
0
|
0 / 0 / 0
Регистрация: 13.01.2011
Сообщений: 49
|
|
18.03.2011, 13:10 | 8 |
![]() Исходя из вашей реплики можно сделать вывод, что люди здесь должны сразу в лоб решение давать, а не устраивать викторины, кто быстрее ошибку найдет. Так? Но это ведь скучно тогда. Вы что то перепутали ЛЮБЕЗНЫЙ, электроника не ШОУ БИЗНЕС, и никогда ИНЖЕНЕР ШОУМЕНОМ не станет (а если станет то ЭТО УЖЕ НЕ ИНЖЕНЕР - посмотрите перевод этого слова с француского), а если Вам дороже ШОУ, то туда и идите и не отвлекайте нормальных людей глупыми заманухами. Я бы тебе сынок и крепче сказал, да жизнь лучше поправит. Развелось шолупони по стране - как вошь рабежалась она и считают профессией умение включать компьютер. И все думают что "Америку открывают", не ведая что все это уже проходили. ЭТОТ ФОРУМ для добровольного обмена опытом, информацией, а не для развлечения. А вот если он станет развлекать, то и кончаться не только АРМ но и детекторные приемники.
0
|
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
|
|
18.03.2011, 13:24 | 9 |
![]() А кто это выпустил с гсмфорума? Долой зануд! А если по теме, очень хотелось бы на линкер скрипты хоть одним глазком. Планировал сам пробовать, да обстоятельства не пускают. А так хоть почитаю...
0
|
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
|
18.03.2011, 15:17 | 10 |
![]() Напомню вам цитатку: "Барон Мюнхгаузен (Олег Янковский) – Серьезное лицо - еще не признак ума, господа. Все глупости на земле делаются именно с этим выражением лица. Улыбайтесь, господа, улыбайтесь! "Тот самый Мюнхгаузен"". Кстати, если вы решили что этот форум ![]() Не порядок! :) Будьте проще. Веселитесь чаще. И, прошу заметить, под словом веселитесь я подразумеваю совсем не то, что обычно подразумевают многие (надеюсь не ходящие на этот форум) - напиться и забыться, а я имею ввиду - находите веселое и интересное в обыденных вещах. А для этого нужно развивать фантазию. С серьезным лицом ни о какой фантазии речи быть не может. Ну т.д. И потом, еще один мааааленький камень в огород серьезности: Книжка такая есть 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
|
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
|
18.03.2011, 15:26 | 11 |
![]() Код
/* ---------------------------------------------------------------------------- * 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
|
0 / 0 / 0
Регистрация: 24.02.2010
Сообщений: 804
|
|
18.03.2011, 15:28 | 12 |
Так вот по примеру вверху - в той конфигурации, что вверху, деструкторы производных классов не будут вызываться, так как они в описании класса не определены как virtual.
Добавляем это ключевое слово к описанию класса - и они начинают вызываться. :)
0
|
0 / 0 / 0
Регистрация: 26.01.2010
Сообщений: 117
|
|
20.03.2011, 18:51 | 13 |
MostirOtyxiy - Стандартный прикол... Но поскольку на плюсах практически не пишу, запамятовал.
для тех кто нихрена не понял: delete вызывается для типа IDbgCtoss, который знать не знает о том, что у его потомка есть деструктор и удаляет его как экземпляр IDbgCtoss.
0
|
20.03.2011, 18:51 | |
Помогаю со студенческими работами здесь
13
Arm-linux-gcc под CentOS: отсутствует файл Linux + Code::Blocks IDE + arm-none-eabi-gcc + openocd
Ассемблер ARM Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |