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

 
 
> GCC и C++ для Cortex-M3
Pavel V.
сообщение Feb 6 2012, 12:20
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Пытаюсь собрать следующий код:

CODE
#include "LPC17xx.h"

typedef enum
{
ePort0,
ePort1,
ePort2,
ePort3,
ePort4
} LPCPort;

typedef enum
{
eHigh,
eLow
} LPCActive;

typedef enum
{
eInput,
eOutput
} LPCDirection;

template<LPCPort port, uint8_t pin, LPCActive activestate = eHigh> struct Pin;

template<LPCPort port, uint8_t pin, LPCActive activestate>
struct Pin
{
static const uint32_t mask = 1UL << pin;
LPC_GPIO_TypeDef* GetPointer()
{
return (port == ePort0 ? LPC_GPIO0 :
port == ePort1 ? LPC_GPIO1 :
port == ePort2 ? LPC_GPIO2 :
port == ePort3 ? LPC_GPIO3 :
LPC_GPIO4);
}
void On()
{
activestate == eHigh ?
GetPointer()->FIOSET = mask :
GetPointer()->FIOCLR = mask;
}
void Off()
{
activestate == eHigh ?
GetPointer()->FIOCLR = mask :
GetPointer()->FIOSET = mask;
}
void Mode(LPCDirection dir)
{
dir == eOutput ?
GetPointer()->FIODIR |= mask :
GetPointer()->FIODIR &= ~mask;
}
uint32_t IsActive()
{
uint32_t ret = GetPointer()->FIOPIN & mask;
if (activestate == eHigh)
{
return ret > 0 ? 1 : 0;
}
else
{
return ret > 0 ? 0 : 1;
}
}
};


CODE
class IOutput
{
public:
IOutput()
{
}
virtual ~IOutput()
{
}

virtual void Set(uint32_t state) = 0;
virtual uint32_t Get() = 0;
};

template<LPCPort port, uint8_t pin, LPCActive activestate>
class Output: public Pin<port, pin, activestate> , IOutput
{
public:

Output()
{
_pin.Off();
_pin.Mode(eOutput);
}

virtual ~Output()
{
}

virtual void Set(uint32_t state)
{
state ? _pin.On() : _pin.Off();
}

virtual uint32_t Get()
{
return _pin.IsActive();
}
private:
Pin<port, pin, activestate> _pin;
};


Если собирать вот такой main.cpp:

Код
Pin<ePort4, 29, eHigh> g_testPin;

int main(void)
{
    while (1) {
        g_testPin.On();
        g_testPin.Off();
    }
}


Все ОК, выходной файл 800 байт.

Но если попробовать вот такой main.cpp:

Код
Output<ePort4, 29, eHigh> g_testPin;

int main(void)
{
    while (1) {
        g_testPin.Set(1);
        g_testPin.Set(0);
    }
}


Линкер начинает ругаться:

Код
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-abort.o): In function `abort':
abort.c:(.text.abort+0xa): undefined reference to `_exit'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0xc): undefined reference to `_sbrk'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-signalr.o): In function `_kill_r':
signalr.c:(.text._kill_r+0xe): undefined reference to `_kill'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-signalr.o): In function `_getpid_r':
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x10): undefined reference to `_write'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0xc): undefined reference to `_close'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
/opt/arm-kgp-eabi/lib/gcc/arm-kgp-eabi/4.7.0/../../../../arm-kgp-eabi/lib/thumb/cortex-m3/libc.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text._read_r+0x10): undefined reference to `_read'
collect2: error: ld returned 1 exit status
make: *** [Test2.elf] Error 1


Пытался подсунуть заглушки системных функций, тогда собирается, но размер выходного файла больше 40 Кб sm.gif

Если для класса Output убрать наследование от абстрактного класса IOutput, линкер требует только функцию _sbrk, хотя тоже непонятно почему, ведь в программе нигде не используется динамическое выделение памяти..

Тулчейны пробовал разные - эффект сохраняется.

Ключи компиляции и сборки:

Код
Оптимизация -O2

# GCC
GCFLAGS = -O$(OPTIMIZATION) -gdwarf-2 -mcpu=cortex-m3 -mthumb -mthumb-interwork -mlong-calls -ffunction-sections -fdata-sections -Wall -Wextra --std=gnu99 -DTNKERNEL_PORT_CORTEXM3
GCFLAGS += $(patsubst %,-I%,$(INCDIRS)) -I.

# G++
GPFLAGS = -O$(OPTIMIZATION) -gdwarf-2 -mcpu=cortex-m3 -mthumb -mthumb-interwork -mlong-calls -ffunction-sections -fdata-sections -Wall -Wextra -fno-rtti -fno-exceptions -DTNKERNEL_PORT_CORTEXM3
GPFLAGS += $(patsubst %,-I%,$(INCDIRS)) -I.

# Assembler
ASFLAGS = $(LISTING) -mcpu=cortex-m3 -mthumb -x assembler-with-cpp
ASFLAGS += $(patsubst %,-I%,$(INCDIRS)) -I.

# Linker
LDFLAGS = -T$(LSCRIPT) -mcpu=cortex-m3 -mthumb -O$(OPTIMIZATION) -Wl,-Map=$(PROJECT).map,--cref -nostartfiles -fno-exceptions -fno-rtti -Wl,--gc-sections


Что я неправильно делаю? smile3046.gif

Сообщение отредактировал IgorKossak - Feb 6 2012, 19:48
Причина редактирования: [codebox]


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Pavel V.   GCC и C++ для Cortex-M3   Feb 6 2012, 12:20
- - neiver   Деструкторы надо выкинуть, они всё равно никогда н...   Feb 6 2012, 14:33
|- - Pavel V.   Цитата(neiver @ Feb 6 2012, 18:33) Дестру...   Feb 6 2012, 15:43
|- - AHTOXA   Это только до тех пор, пока вы не используете Get(...   Feb 6 2012, 18:01
|- - Pavel V.   Цитата(AHTOXA @ Feb 6 2012, 22:01) Это то...   Feb 7 2012, 05:51
|- - AHTOXA   Цитата(Pavel V. @ Feb 7 2012, 11:51) Убра...   Feb 7 2012, 08:10
|- - Pavel V.   Цитата(AHTOXA @ Feb 7 2012, 12:10) Ух ты,...   Feb 7 2012, 09:38
- - alx2   Цитата(Pavel V. @ Feb 6 2012, 17:20) Если...   Feb 7 2012, 05:25
- - neiver   Да, кстати, а зачем делать абстрактные интерфейсы ...   Feb 7 2012, 09:45
|- - ReAl   Цитата(neiver @ Feb 7 2012, 11:45) Еще мн...   Feb 7 2012, 11:21
|- - Pavel V.   neiver Спасибо за ссылки, буду изучать По коду не...   Feb 7 2012, 12:39
- - Pavel V.   Кстати, заметил еще одну особенность - при уровне ...   Feb 9 2012, 07:00
- - Brain13   Чтобы не плодить новые темы пишу здесь. Здравству...   Jan 16 2013, 06:50
- - Сергей Борщ   QUOTE (Brain13 @ Jan 16 2013, 08:50) Разв...   Jan 16 2013, 08:22
- - dxp   QUOTE (Brain13 @ Jan 16 2013, 13:50) Все ...   Jan 16 2013, 08:37
- - Brain13   Цитата(dxp @ Jan 16 2013, 11:37) 1. Что т...   Jan 18 2013, 05:48
- - dxp   QUOTE (Brain13 @ Jan 18 2013, 12:48) Абст...   Jan 18 2013, 12:01


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

 


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


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