Jump to content

    

Pavel V.

Свой
  • Content Count

    211
  • Joined

  • Last visited

Everything posted by Pavel V.


  1. А какое значение находится в настройках проекта C/C++ Build -> Build directory Makefile свой, или генерится эклипсом?
  2. Имеются в виду файлы в корневой директории проекта? Вы бы привели структуру файлов, которую пытаетесь скомпилировать, а то так не понятно. У меня вроде никогда таких проблем не возникало, поведение эклипса было полностью ожидаемым. В качестве профилактики могу посоветовать поиграться с пунктами меню Index (правая кнопка на проекте -> Index -> Rebuild, Update, Freshen).
  3. "Справка" является отдельным продуктом и называется MSDN. Можно установить локально, можно найти в интернете. Я предпочитаю пользоваться онлайн через сайт майкрософта. Если программа пишется с использованием .NET, то ИМХО, следует писать на c#, он специально заточен под это дело. C++ с поддержкой Framework задумывался майкрософтом просто как мостик между "старым" (не CLR) кодом и "новым" (CLR), а не как самостоятельное средство разработки.
  4. Интересует еще вот какой вопрос - какой величиной ограничен размер одного скрипта, загруженного в модуль? В официальной документации я этой цифры не нашел - означает ли это, что размер ограничен только доступной памятью?
  5. Не знаю, будет ли полезна эта информация, но я много работал с модулями GL868 из разных поставок - описанной проблемы ни разу не наблюдал.
  6. Вроде бы поборол проблему. Оказалось, скрипт компилировался другой версией питона (помимо штатного набора софта от Telit в системе был установлен официальный релиз Python 2.7). Какой командой компилируются скрипты при вызове пункта Compile из контекстного меню?
  7. Я использую Visual Paradigm for UML, лучше инструмента не встречал. Есть Community Edition для некоммерческого использования, бесплатная. Для коммерческого применения можно и приобрести - стоит копейки.
  8. В одном своем устройстве я использовал общий источник питания для модуля SIM900 и процессора (с обвязкой) на 3,5 В (на LM2576). Вроде бы проблем не было, в том числе при передаче данных. Уровни сигнальных линий, естественно, были согласованы. Почему-то не увидел в теме упоминаний такого варианта схемы питания, может быть это в корне неправильно и чревато какими-то проблемами?
  9. Дабы не плодить темы, спрошу здесь. Начал разбираться со встроенным интерпретатором Python на модулях Telit GL868. Вроде бы, путем какого-то шаманства, что-то стало получаться, но... Проблемы есть следующие: 1. Если заливать в модуль "не скомпилированную" версию скрипта, все работает как надо, но стартует при этом с задержкой больше минуты (скриптик на 3 кб, одним файлом). 2. Если же заливать "скомпилированную" версию, то скрипт вообще не запускается. Точнее, один раз у меня получилось сделать так, чтобы он запускался (и при этом не было задержки исполнения), но повторить больше не удается. Хотелось бы услышать мнение представителя фирмы - стоит ли вообще связываться с этой возможностью? Первое впечатление возникло не самое приятное... Вроде бы и руки не самые кривые, но стабильной работы добиться пока так и не удалось.
  10. Он самый! :) Здорово, такой вариант мне больше нравится :) Попробую использовать.
  11. 1. Вы отключаете отладчик от компа, или отладчик от платы? Если отключить отладчик от платы и перезапустить ее - так работает? Вы уверены, что код заливается во флеш, а не RAM? 2. Точно не помню, но в IARе была в опциях проекта вкладка типа "Дополнительный формат выходного файла", и там надо выбрать Intel HEX. 3. Keil и JLink отлично дружат, дело только в настройках. Версия Keil-а уже перевалила за 4, надо обновиться.
  12. Спасибо за идею! В итоге так и сделал, только использовал анонимный параметр, что избавило от необходимости в вызове писать условие pin < 16. Специализацию шаблона нельзя выполнять внутри класса, поэтому вынес наружу. namespace IO { template<uint32_t pin, bool = (pin < 16)> struct ConfigurationMask { static inline uint32_t Clear() { return ~(0x03UL << (pin * 2)); } static inline uint32_t SelSet(Configuration configuration) { return (((uint32_t)configuration >> 4) & 0x03UL) << (pin * 2); } static inline uint32_t ModeSet(Configuration configuration) { return (((uint32_t)configuration >> 2) & 0x03UL) << (pin * 2); } }; template<uint32_t pin> struct ConfigurationMask<pin, false> { static inline uint32_t Clear() { return ~(0x03UL << ((pin - 16) * 2)); } static inline uint32_t SelSet(Configuration configuration) { return (((uint32_t)configuration >> 4) & 0x03UL) << ((pin - 16) * 2); } static inline uint32_t ModeSet(Configuration configuration) { return (((uint32_t)configuration >> 2) & 0x03UL) << ((pin - 16) * 2); } }; template<Port port, uint32_t pin, ActiveState activestate> class Pin { static_assert((pin < 32), "Pin number must be <= 31"); public: /* * Set Configuration */ static void SetConfiguration(Configuration configuration) { ... SEL0 &= ConfigurationMask<pin>::Clear(); SEL0 |= ConfigurationMask<pin>::SelSet(configuration); MODE0 &= ConfigurationMask<pin>::Clear(); MODE0 |= ConfigurationMask<pin>::ModeSet(configuration); ... } }; }
  13. Компилирую следующий код: template<uint32_t pin> class Pin { public: void Test() { if(pin < 16) { 1: g_test &= ~(0x03UL << (pin * 2)); } else { g_test &= ~(0x03UL << ((pin - 16) * 2)); } } }; int main() { Pin<22> test; test.Test(); } На строчку 1 компилятор ругается: source/main.cpp: In member function 'void Pin<pin>::Test() [with long unsigned int pin = 22ul]': source/main.cpp:30:12: instantiated from here source/main.cpp:18:4: warning: left shift count >= width of type [enabled by default] Код компилируется и работает правильно. Оптимизатор, естественно, выкидывает ненужный код, т.к. pin константа (что видно по листингу). Как убрать это сообщение?
  14. Кстати, заметил еще одну особенность - при уровне оптимизации -O0 проблема сохраняется, тянутся системные вызовы. Начиная с -O1 перестают.
  15. neiver Спасибо за ссылки, буду изучать :) По коду не сразу получается воткнуть, надо будет для себя диаграммки нарисовать для наглядности. У меня GPIO в проектах в основном для "медленных" операций используются, типа управления питанием внешних модулей, поэтому накладными расходами на вызов функций работы с портами особо не заморачивался. Зато очень удобно передавать куда угодно по ссылке. Будьте добры мне тоже на почту реализацию для LPC17хх, как раз сейчас с этим процессором работаю (павел AT posten.ru).
  16. Тулчейн от CodeSourcery (последняя версия) тоже корректно компилирует.
  17. Убрал только деструкторы и проблема исчезла. В том числе при использовании чисто виртуальных функций. Может поправили уже? Пробовал даже такой пример: int main(void) { while (1) { IOutput *pa = (IOutput *)&g_testPin; uint32_t a = pa->Get(); if(a) pa->Set(0); else pa->Set(1); } } Компилится без проблем: arm-kgp-eabi-size Test2.elf text data bss dec hex filename 956 4 264 1224 4c8 Test2.elf Я, к сожалению, пока не очень в нем ориентируюсь, но невооруженным взглядом видно, что использование деструкторов в абстрактных классах тянет за собой exceptions и другую требуху, несмотря на запрещающие флаги компилятора.
  18. Спасибо! Действительно, удаление деструкторов помогло :) Как все оказалось просто.
  19. Пытаюсь собрать следующий код: #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; } } }; 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 Кб :) Если для класса 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:
  20. Бьюсь с похожей проблемой, отладка вроде бы работает, но периодически случаются необъяснимые вылеты. Или, например, первая попытка дебага вылетает, а последующие работают.. И другие чудеса. Инициализация выглядит следующим образом: target remote localhost:2331 monitor endian little monitor flash device = LPC1768 monitor speed 1000 monitor reset load monitor reg r13 = (0x00000000) monitor reg pc = (0x00000004) # User mode. The on-chip Flash memory is mapped to address 0. set *0x400FC040 = (0x00000001) break main continue В этом виде хоть как-то работает, но нестабильно :(
  21. Я пока использую родной GDB-Server от Segger-а, у них есть версия в т.ч. под Линукс (которую я и использую). В целом отладка работает, но сопровождается периодическими необъяснимыми вылетами. OpenOCD тоже пробовал, но под ним отладку вообще запустить не удалось. Может быть вы мне поможете с конфигурацией? Процессор у меня LPC1768, OpenOCD запускаю с параметрами типа -f /interface/jlink.cfg -f /target/lpc1768.cfg. Отладчик запускается, процессор распознается. Но ни один из найденных вариантов инициализации отладки так и не заработал. Прикручивать пытаюсь к Eclipse.
  22. Да, действительно :) Однако, в других примерах, которые я смотрел, секции .fini_array и .dtors (похоже, именно в них должны помещаться деструкторы) присутствуют. Осталось теперь отладку добить через J-Link и можно праздновать окончательный переход на GCC.
  23. Ребята, спасибо огромное! Это первый скрипт линкера, в котором я смог разобраться :) Остальные варианты, что мне попадались, представляют собой какое-то адское месиво. А в какую секцию помещаются деструкторы?
  24. Пытаюсь разобраться в скрипте линкера, возник вопрос. В комплекте scmRTOS идут два скрипта: stm32f10x_flash_md.ld и stm32f10x_flash_md_kgp.ld. Они немного отличаются: Насколько я понял, дело касается расположения конструкторов и деструкторов. Не подскажете, чем обусловлены эти правки?
  25. Спасибо большое за ответы! Голова прояснилась. Изучил как следует формат данных, приходящих с модема и все встало на свои места.