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

 
 
> Проблема с константами в классе., В iar всё работает а в GCC нет...
inco
сообщение May 19 2010, 11:57
Сообщение #1


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

Группа: Свой
Сообщений: 161
Регистрация: 26-08-05
Из: Российская Империя
Пользователь №: 7 984



Есть некий базовый класс:

class uart {
protected:
const uint8_t num;
const uint8_t channel;
volatile uint32_t time;
uint8_t rxCount;
uint8_t echoMode;
__uartState state;
uint32_t tx_pointer;
uint32_t rx_pointer;
uint32_t size;
uint32_t txSize;
uint8_t rxEchoSize;
uint8_t error[2];
uint16_t crc;
public:
uart(const uint8_t n, const uint8_t c) : num(n), channel( c) { // Конструктор
time = tx_pointer = rx_pointer = size = 0;
error[0] = error[1] = 0;
};
...

есть от него наследник:

class mco_uart : public uart {
public:
uint8_t buf[2][MCO_BUFF_SIZE];
mco_uart(const uint8_t n, const uint8_t c) : uart (n, c) {}; // Конструктор
...

создаю экземпляры класса:

mco_uart extUart[EXTUART_NUM] = {
mco_uart(0, 4 << 4), mco_uart(0, 5 << 4), mco_uart(0, 6 << 4), mco_uart(0, 7 << 4),
mco_uart(1, 4 << 4), mco_uart(1, 5 << 4), mco_uart(1, 6 << 4), mco_uart(0, 1 << 4),
mco_uart(0, 2 << 4), mco_uart(0, 3 << 4), mco_uart(1, 0 << 4), mco_uart(1, 1 << 4),
mco_uart(1, 2 << 4), mco_uart(1, 3 << 4)
};

В результате переменные num и channel равны 0.
В иаре всё работает то есть значения переменным присваивается правильно, а в gcc присваивания нет.
Что я делаю не так? На плюсах пишу первый раз, до этого писал только на чистом C. Хочется перейти на gcc и не получается!
Компилятор от клёна kgp_arm_eabi_20100509
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
klen
сообщение May 19 2010, 14:36
Сообщение #2


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



Цитата(inco @ May 19 2010, 15:57) *
В результате переменные num и channel равны 0.
В иаре всё работает то есть значения переменным присваивается правильно, а в gcc присваивания нет.
Что я делаю не так? На плюсах пишу первый раз, до этого писал только на чистом C. Хочется перейти на gcc и не получается!
Компилятор от клёна kgp_arm_eabi_20100509


mco_uart extUart[EXTUART_NUM] глобальный объект или на стеке ?

конструкторы статических объектов вызываются?

давайте кусок кода который это воспроизведет, без лишних деталей.

я не телепат но скорее всего просто конструкторы статических глобальных объектов не вызываются.

чтобы это работало в скрипт линкера долны быть добавлены
Код
/* .ctors .dtors are used for c++ constructors/destructors */
.ctors :
{
    PROVIDE(__ctors_start__ = .);
    KEEP(*(SORT(.ctors.*)))
    KEEP(*(.ctors))
    PROVIDE(__ctors_end__ = .);
} >ROM
.dtors :
{
    PROVIDE(__dtors_start__ = .);
    KEEP(*(SORT(.dtors.*)))
    KEEP(*(.dtors))
    PROVIDE(__dtors_end__ = .);
} >ROM

в сило того что сами по себе в коде конструкторы статических глобальных объекто не вызываются линкер их нахрен выкидывает дкумая что это лишний код
чтоб работал С++ нада добавить вышеприведенную хрень в скрипт линкео, она говорит линкеру что функции конструкторы нужны и сувать их в отдельные секции, хотя вариантов может быть куча - это всеголиш так принято.
далее ктото должен вызвать эти конструкторы до вызова main. это обычно принято делать в crt коде.
вставте полсле инициализации данных в crt следующий код;
Код
DR R0, =__ctors_start__
    LDR R1, =__ctors_end__
ctor_loop:
    CMP R0, R1
    BEQ ctor_end
    LDR R2, [R0], #4
    STMFD SP!, {R0-R1}
    MOV LR, PC
    MOV PC, R2
    LDMFD SP!, {R0-R1}
    B ctor_loop
ctor_end:


a)g++ сгенерит табличку с адресами всех конструкторов глобальных статических объектов
cool.gif линкер положит ее в секцию .ctors
c) ну а уж crt код вызовет по таблице все конструкторы.
e) все работает и мы счастливы

в сдучае с иаром скорее всего это уже сделано зарание.

упражнение для закрепления материала: аналогичными рассуждениями проработать вопрос деструкторы
контрольный вопрос; почему на деструктоы можно забить большой болт с дюймовой резбой?

и еще, я уже если не изменяет память принимал участие в разжовывании этого. поиск рулит. если у Вас окажется другой косяг - тады извиняюсь, будем курить его.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение May 19 2010, 15:31
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(klen @ May 19 2010, 20:36) *
Код
/* .ctors .dtors are used for c++ constructors/destructors */
.ctors :
{
    PROVIDE(__ctors_start__ = .);
    KEEP(*(SORT(.ctors.*)))
    KEEP(*(.ctors))
    PROVIDE(__ctors_end__ = .);
} >ROM


Точняк! Только после перехода на eabi конструкторы хранятся в .init_array:
Код
        __ctors_start__ = .;
        KEEP(SORT(*)(.init_array))
        __ctors_end__ = .;

Вот так точно работает.

2 inco. Ещё у меня был вариант с ключом -fdata-sections. Многие примеры загрузочных скриптов, имеющиеся в интернете это не учитывали. Надо добавить *(.bss.*) в bss:
Код
    .bss :
    {
        . = ALIGN(4);
        _sbss = .;
         *(.bss)
         *(.bss.*)
...

Без этого глобальные объекты не инициализировались.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:32
Рейтинг@Mail.ru


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