Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: по старой теме C++ и макросы
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Zeal0t
Добрый день.
Если кто то использует то что предложил AHTOXA в теме из описания не смогли бы помочь, направить )

Имеем.
- IAR 7.10
- STM32F107
- scmRTOS в стадии изучения
- макросы http://electronix.ru/redirect.php?https://...tongus/stm32tpl

програмка простенькая из примеров. собирается и линкуется без проблем. работает в кристале без ошибок

добавляем классы/макросы для управления пинами.

как объявляем

typedef Pin<'C', 6, 'H'> PC6;
PC6 ledGreen;

как используем

ledGreen.Mode(OUTPUT);
ledGreen.On();

или

PC6::Mode(OUTPUT);
PC6::On();

компиляция - без ошибок и проблем
при линковке получаю

Error[Li005]: no definition for "Pin<(char)67, (int)6, (char)72>::GPIOx" [referenced from W:\Devices\Panel\debug\Obj\main.o]
Error[Li005]: no definition for "Pin<(char)67, (int)6, (char)72>::CRx" [referenced from W:\Devices\Panel\debug\Obj\main.o]

в какую сторону копать? )
спасибо
AHTOXA
Оптимизацию включили?
Zeal0t
Цитата(AHTOXA @ Jan 23 2015, 13:11) *
Оптимизацию включили?


Настройки оптимизации из примеров по scmRTOS:

Medium,
Common subexpression elimination
Code motion
Static clustering

p.s.
хм.......
при указании
High/Balanced собирается но не работает. похоже где то во внутренностях ОС виснем (

p.p.s.
уточнение по "High/Balanced собирается но не работает. похоже где то во внутренностях ОС виснем ("
по шагам в отладчике - работает.

p.p.p.s.
"опытным" путем "метод нахождения крайнего" выяснил что на действия линкера влияет опция "Function inlining"
будем копать в этом направлении )


окончательный p.s^4 - все решено/исправленно
вывод: только не бейте - сам виноват )

как было написано для проверки, естественно в спешке лишь бы посмотреть

Код
typedef Pin<'C', 6, 'H'> PC6;
typedef Pin<'C', 7, 'H'> PC7;

PC6 ledGreen;
PC7 ledYellow;

template<>OS_PROCESS void TLed::exec()
{
  RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

  ledGreen.Mode(OUTPUT);
  ledYellow.Mode(OUTPUT);

  FOREVER {
    ledGreen.On();
    ledYellow.On();

    sleep(1000);

    ledGreen.Off();
    ledYellow.Off();
  }
}


вроде как все хорошо. но. они моргали но визуально я это не видел т.к. не было задержки после выключения )))
прошляпил не спорю )))

по поводу файла pin_stm32F1xx.h
в нем есть вот такое

Код
#ifndef INLINE
#define INLINE __attribute__((__always_inline__)) inline
#endif


этот INLINE используется дальше в описаниях. но, насколько я понимаю, это GCC описание. для IAR изменил как

Код
#ifndef INLINE
#define INLINE #pragma inline = forced
#endif


результат - компиляция на всех уровнях оптимизации без ошибок но линковка без ошибок только на уровне High

далее было добавлено:
- в перекрытии оператора "->" в струтуре GPIOx добавлено INLINE
- в перекрытии всех операторов в структуре CRx добавлено INLINE

все компилируется, линкуется, работает на всех уровнях оптимизации.

p.s.end.
2AHTOXA: может пргодится )

всем спасибо за участие )
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.