SergNK 0 12 апреля, 2016 Опубликовано 12 апреля, 2016 · Жалоба Суть проблемы. В проекте подключил библиотеку 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); // Линкер НЕ выдаёт ошибку } Если использовать закомментированный код, то линкер не ругается. Подскажите, куда копать? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 12 апреля, 2016 Опубликовано 12 апреля, 2016 · Жалоба К сожалению, не могу подсказать по IAR-у. GCC так ругается только при уровне оптимизации -O0. С любыми другими уровнями оптимизации ошибок нет. Попробуйте по аналогии, добавьте оптимизации, может, поможет. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergNK 0 12 апреля, 2016 Опубликовано 12 апреля, 2016 · Жалоба Вся оптимизация выключена, что в компиляторе, что в линкере А когда выставил High, Balanced, собралось. И даже заработало! Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться