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

 
 
> Не вызываються конструкторы глобальных классов
Владимир В. Р.
сообщение Nov 14 2008, 12:21
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 17-05-07
Пользователь №: 27 783



Добрый день... Начал пробовать программировать на С++, переделываю старый поект написанный на С и сталкнулся с проблемой, у классов обьявленных как глобальные не вызываються конструкторы. Есть предположение что это фишка IAR. В чём может быть проблема? Где можно почитать про использование C++ и в частности ООП для программирования контроллеров? Заранее благодарен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Владимир В. Р.
сообщение Nov 17 2008, 05:07
Сообщение #2





Группа: Новичок
Сообщений: 6
Регистрация: 17-05-07
Пользователь №: 27 783



Цитата(Сергей Борщ @ Nov 14 2008, 21:40) *
Для оформления исходников существует кнопка '#' на форме ввода. Читать неформатированный исходник очень трудно.
А попробуйе для эксперимента убрать этот файл из проекта. IAR подключит свой библиотечный файл, в котором точно вызываются конструкторы.Собственно между этими двумя кусками кода и должен быть вызов конструкторов. Вот эта информация может вам помочь:
Код
/*
*  Function: __call_ctors
*
*  Description: Call each constructor for each global object defined
*               in the application.
*
*               The constructors are placed in a segment named DIFUNCT.
*               This function is assumed to be called from the cstartup
*               assembler routine using code similar to:
*                   MOV   SFB DIFUNCT, <first argument register>
*                   MOV   SFE DIFUNCT, <second argument register>
*/
void __call_ctors(__difunct_ptr start0, __difunct_ptr end_plus_one)


отключил свой astartup.s79, сstartup_sam7.c и переписал вектор прерываний как:

NAME __vector_table:

EXTERN __program_start
EXTERN OS_CPU_IRQ_ISR
EXTERN OS_CPU_FIQ_ISR

Код
  
  
  CODE32
  
  COMMON  INTVEC:CODE:ROOT

  org 0x00
    ldr pc,[pc,#24]; Absolute jump can reach 4 GByte
  org 0x04
    ldr pc,[pc,#24]; Branch to undef_handler
  org 0x08
    ldr pc,[pc,#24]; Branch to swi_handler
  org 0x0c
    ldr pc,[pc,#24]; Branch to prefetch_handler
  org 0x10
    ldr pc,[pc,#24]; Branch to data_handler
  org 0x18
    ldr pc,[pc,#24]; Branch to irq_handler
  org 0x1c
    ldr pc,[pc,#24]; Branch to fiq_handler
; Constant table entries (for ldr pc) will be placed at 0x20
   ; Exception vectors can be specified in C code by #pragma vector or by filling
   ; in the vectors below. The vector address is the ARM vector number + 0x20.
  org 0x20
        dc32  __program_start
  org 0x24
        dc32  ?call_exit
  org 0x28
        dc32  ?call_exit
  org 0x2c
        dc32  ?call_exit
  org 0x30
        dc32  ?call_exit
  org 0x38
        dc32  OS_CPU_IRQ_ISR
  org 0x3c
        dc32  OS_CPU_FIQ_ISR

;------------------------------------------------------------------------------
;- Loop for ever
;------------------------------------------------------------------------------
;- End of application. Normally, never occur.
;- Could jump on Software Reset ( B 0x0 ).
;------------------------------------------------------------------------------
?call_exit:
  End
    b       End


  END


Помогло, конструкторы вызываються, хотя смущает что выдаёт предупреждение, где он второй вектор нашёл?:

Warning[w52]: More than one definition for the byte at address 0 in common segment INTVEC. It is defined in module "?RESET" as well as in module "__vector_table"

P.S. Всем отписавшимся в теме спасибо!

P.S.S Сергею Борщу отдельное спасибо за '#'
Go to the top of the page
 
+Quote Post



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

 


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


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