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

 
 
 
Closed TopicStart new topic
> Не собирается проект на v5.00 + stm32tpl под IAR 7.30, линкер выдаёт Error[Li005]: no definition for "Pin<...>::GPI
SergNK
сообщение Apr 12 2016, 09:27
Сообщение #1


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

Группа: Свой
Сообщений: 139
Регистрация: 30-03-11
Из: Фаниполь (Минск)
Пользователь №: 63 991



Суть проблемы.

В проекте подключил библиотеку stm32tpl (крайняя версия) и объявил согласно инструкции:

в main.cpp:
Код
typedef Pin<'E',  1, 'H', PIN_SPEED_VERY_LOW> PIN_BL;

...

void main()
{
    RCC->AHB2ENR |= RCC_AHB2ENR_GPIOEEN;    // AHB1, 50 MHz
    PIN_BL::Mode(OUTPUT);

    OS::run();
}


линкер ругается:

Error[Li005]: no definition for "Pin<(char)69, (int)1, (char)72, (PinSpeed)0>::GPIOx" [referenced from D:\prj\scm_3\iar\Debug\Obj\main.o]

Методом возгонки и последующей абсорбции выделил следующее:

в шаблоне структуры не создаётся указатель на GPIOx, который используется в дальнейшем функциями структуры.

Код
template<char port, int pin_no, char activestate, PinSpeed speed>
struct Pin
{
    static const uint32_t pin = pin_no;
    static const uint32_t port_no = port-'A';
    static const uint32_t shift = pin;
    static const uint32_t shift_x2 = pin * 2;
    static const uint32_t shift_x4 = (pin % 8) * 4;
    static const uint32_t mask = 1UL << shift;
    static const uint32_t mask_x2 = 3UL << shift_x2;
    static const uint32_t mask_x4 = 0xFUL << shift_x4;
    static const uint32_t clearmask = 1UL << (pin + 16);
    enum { GPIOx_BASE = port_gpio_t<port>::GPIOx_BASE };

    static struct
    {
        GPIOxTypeDef* operator-> () { return (GPIOxTypeDef*)GPIOx_BASE; }
    }GPIOx;

...

    INLINE static void SetMode(PinMode mode)
    {
        GPIOx->MODER = (GPIOx->MODER & ~mask_x2) | (mode << shift_x2);        // Линкер выдаёт ошибку

//        ((GPIOxTypeDef*)GPIOx_BASE) -> MODER = (((GPIOxTypeDef*)GPIOx_BASE) -> MODER & ~mask_x2) | (mode << shift_x2); // Линкер НЕ выдаёт ошибку
    }


Если использовать закомментированный код, то линкер не ругается.
Подскажите, куда копать?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 12 2016, 09:45
Сообщение #2


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

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



К сожалению, не могу подсказать по IAR-у. GCC так ругается только при уровне оптимизации -O0. С любыми другими уровнями оптимизации ошибок нет.
Попробуйте по аналогии, добавьте оптимизации, может, поможет.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
SergNK
сообщение Apr 12 2016, 10:06
Сообщение #3


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

Группа: Свой
Сообщений: 139
Регистрация: 30-03-11
Из: Фаниполь (Минск)
Пользователь №: 63 991



Вся оптимизация выключена, что в компиляторе, что в линкере
А когда выставил High, Balanced, собралось.
И даже заработало!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 16th April 2024 - 17:55
Рейтинг@Mail.ru


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