Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Indigo + Yagarto + J-Link
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
ivainc1789
После знакомства с Eclipse Indigo SR2 и установки и настройки тулчейна остаются некоторые вопросы:

1. Проект с пустой main функцией не захотел компилироваться без ошибок при простом подключении библиотеки периферии с сайта ST. Разбор полетов показал, что некоторые исходники библиотеки не видят определения в собственных хидерах. Я долго с этим разбирался, а в результате все решилось простым редактированием соотв хидеров (просто ставим где-нибудь в файле пробел потом его удаляем, сохраняем файл) и ошибки компиляции пропадают... У кого-нибудь такое уже было? И как часто приходится вам сталкиваться с такими глюками в Eclipse?
2. Вторую проблему пока не решил... GCC уже совсем другой компилятор, поэтому наработанный код в IAR у меня тут не работает. Особенно это касается препроцессора. В IARе я устраивал всякие игры с дефайнами и все нормально работало - здесь такие вещи уже не проходят:

Код
#define PINCLR(x) (_PORT_POS(x##p)##->BSRR=##_BIT_BR(x##b))


выдается ошибка:

Код
pasting ")" and "->" does not give a valid preprocessing token    main.c    /IndigoTest/src    line 39    C/C++ Problem
pasting "=" and "_BIT_BR" does not give a valid preprocessing token    main.c    /IndigoTest/src    line 39    C/C++ Problem


какие есть пути для исправления? Я так понимаю, для GCC такие дефайны слишком сложные?
AHTOXA
Цитата(ivainc1789 @ Oct 27 2012, 18:45) *
в результате все решилось простым редактированием соотв хидеров (просто ставим где-нибудь в файле пробел потом его удаляем, сохраняем файл) и ошибки компиляции пропадают... У кого-нибудь такое уже было? И как часто приходится вам сталкиваться с такими глюками в Eclipse?
ПКМ на проекте - Index - Rebuild.
Цитата(ivainc1789 @ Oct 27 2012, 18:45) *
какие есть пути для исправления? Я так понимаю, для GCC такие дефайны слишком сложные?
Эту ошибку, насколько я могу судить, выдаёт не GCC, а сама эклипса. У неё свой парсер (очень крутой). То есть, проект может компилироваться, а эклипса может выдавать ошибки. Решение проблемы - переписать макрос по-правильному.
(У меня была недавно похожая проблема, оказалось, что неправ был всё-таки я, а не эклипса)
ivainc1789
Переписать что-то не так-то просто оказалось. В IAR'е полное определение макроса для сброса бита порта:

Код
// где-то в .h файле
#define _PORT_POS_(a) GPIO##a  
#define _PORT_POS(a) _PORT_POS##_(a)
#define _BIT_BR_(a) GPIO_BSRR_BR##a
#define _BIT_BR(a) _BIT_BR##_(a)

#define PINCLR(x) (_PORT_POS(x##p)##->BSRR=##_BIT_BR(x##b))


// где-то в .c файле
#define TESTp        B    // порт пина
#define TESTb        0    // номер пина

int main() {
  PINCLR(TEST); // сбрсываем пин B0 (должно преобразоваться в GPIOB->BSRR = GPIO_BSRR_BR_0)
  return 0;
}


Чую, надо как-то разложить макрос на части, но как только в подстановке появляются символы "=" и "->" - начинается ругань...
SSerge
Вообще-то именно те ##, на которые ругается, они лишние, их можно безболезненно удалить или заменить на пробелы.

ivainc1789
Цитата(SSerge @ Oct 27 2012, 20:00) *
Вообще-то именно те ##, на которые ругается, они лишние, их можно безболезненно удалить или заменить на пробелы.

Если я вас правильно понял, то макрос нужно переделать так:
Код
#define PINCLR(x) (_PORT_POS(x##p)->BSRR=_BIT_BR(x##b))

Это действительно приводит к устранению исходных ошибок, но появляется одна новая:


Код
'GPIO_BSRR_BR0' undeclared (first use in this function)    main.c    /IndigoTest/src    line 39    C/C++ Problem
Symbol 'GPIO_BSRR_BR0' could not be resolved    main.c    /IndigoTest/src    line 39    Semantic Error

Т.е. должно преобразовываться в GPIO_BSRR_BR_0, а по факту GPIO_BSRR_BR0. В IAR'е все нормально.

Да... Пришлось все переосмыслить и в итоге заработало нормально:
Код
// где-то в .h файле
#define _PORT_POS_(a) GPIO##a
#define _PORT_POS(a) _PORT_POS_(a)
#define _BIT_BR_(a) GPIO_BSRR_BR_##a
#define _BIT_BR(a) _BIT_BR_(a)

#define PINCLR(x) (_PORT_POS(x##p)->BSRR=_BIT_BR(x##b))


// где-то в .c файле
#define TESTp        B    // порт пина
#define TESTb        0    // номер пина

int main() {
  PINCLR(TEST); // сбрсываем пин B0 (должно преобразоваться в GPIOB->BSRR = GPIO_BSRR_BR_0)
  return 0;
}
AHTOXA
Извините, я сильно не вчитывался, но может быть так:
Код
#define _BIT_BR_(a) GPIO_BSRR_BR_##a
#define _BIT_BR(a) _BIT_BR_(a)

---
Упс, опоздалsm.gif
ivainc1789
Осталась давнее предупреждение из файла STM32F0xx_rtc.c:
Код
unused variable 'wutcounter' [-Wunused-variable]    stm32f0xx_rtc.c    /IndigoTest/SPD/src    line 311    C/C++ Problem

там объявлена неиспользуемая переменная:
Код
__IO uint32_t wutcounter = 0x00;

Зачем?
В IAR использовал некоторые расширения. Например для шины 1wire тайминги весьма критичны, поэтому необходимо запрещать все на время их счета. Вот как выглядела процедура ини шины в IAR:
Код
// сброс на шине
// возвращает 1 если нет устройств, 0 если обнаружены устройства
unsigned char OWReset(void){
  unsigned char Status;
  PINCLR(DQ);Delay1wire(Trstl);
  __istate_t s = __get_interrupt_state();
  __disable_interrupt();
  PINSET(DQ);Delay1wire(Tpdh+Tpdl/2);
  if (PINCHK(DQ)) Status = 1;else Status = 0;
  __set_interrupt_state(s);  
  Delay1wire(Trsth-Tpdh-Tpdl/2+Trec);
  return(Status);
}

Есть ли какие-нибудь спец. средства в GCC для замены иаровских extended keywords?
ivainc1789
Вопрос с расширениями IAR решил через функции CMSIS. Короче, удалось собрать и запустить отладку некоторого тестового проекта на STM32F100C8(flash64K,ram8K), который параллельно подготовлен и в IAR. Пока впечатления не очень радостные, проблемы такие:
1. GCC генерит немного больший код. Результаты компиляции сборок Debug/Release: IAR=25Кб/10Кб, GCC=38Кб/11Кб. Огорчительно, что в STM32F100C6( где 32К flash) отлаживать с Эклипсой и GCC не получилось бы, пришлось бы разбивать на части...
2. Особенно интересно сравнить отладку в IAR и GCC. J-Link'ом удалось "походить" по асму и Си коду - тут все нормально, но почему-то не работает плагин EmbSys Reg - значения в регистрах не показывает, хотя вроде я его правильно настроил на целевой кристалл.
3. Не удалось пока (а возможно это и не сделать) аналог окна Live Watch в IAR - это когда программа запущена на выполнение, а значения переменных в окне Expression автоматом обновляются примерно раз в секунду. Мне кажется очень удобным наблюдать некоторые процессы в программе в такой "динамике". Как бы такое сделать, ума не приложу...?
4. Не нашлось аналога команды SetNextStatement в IAR, это когда ставим курсор в произв. место в коде и хотим шагать с этого места. Команда Эклипса Move To Line (если это аналог) у мну не работает - проц просто переходит в running и все...
_Артём_
Цитата(ivainc1789 @ Oct 30 2012, 07:57) *
1. GCC генерит немного больший код. Результаты компиляции сборок Debug/Release: IAR=25Кб/10Кб, GCC=38Кб/11Кб. Огорчительно, что в STM32F100C6( где 32К flash) отлаживать с Эклипсой и GCC не получилось бы, пришлось бы разбивать на части...

Разница небольшая вобщем-то - 10 и 10 кБайт. В другои проекте может и наоборот оказаться...
Видно что GCC сильней сжимает неоптимизированный код (не пробовали опцию -Os ставить?).

У Иара не молучается так что оптимизация по скорости даёт меньший код?

Цитата(ivainc1789 @ Oct 30 2012, 07:57) *
2. Особенно интересно сравнить отладку в IAR и GCC. J-Link'ом удалось "походить" по асму и Си коду - тут все нормально, но почему-то не работает плагин EmbSys Reg - значения в регистрах не показывает, хотя вроде я его правильно настроил на целевой кристалл.

А что вы для STM использовали как GDB-сервер? GDB от Atollic?

Цитата(ivainc1789 @ Oct 30 2012, 07:57) *
Мне кажется очень удобным наблюдать некоторые процессы в программе в такой "динамике". Как бы такое сделать, ума не приложу...?

У STM была какая-то программа для отображения вроде (stmstudio что ли?), её неудаётся задействовать?

Цитата(ivainc1789 @ Oct 30 2012, 07:57) *
4. Не нашлось аналога команды SetNextStatement в IAR, это когда ставим курсор в произв. место в коде и хотим шагать с этого места. Команда Эклипса Move To Line (если это аналог) у мну не работает - проц просто переходит в running и все...

Да, с Move to Line и Run to Line в Eclipse как-то печально...
ivainc1789
Цитата(_Артём_ @ Oct 30 2012, 10:36) *
Разница небольшая вобщем-то - 10 и 10 кБайт. В другои проекте может и наоборот оказаться...
Видно что GCC сильней сжимает неоптимизированный код (не пробовали опцию -Os ставить?).
Именно с этой опцией цифры и привел. Если ставить -O1,2,3 - результаты просто неприемлемые, вроде остальные ключи командной строки стоят правильные. Их в Yagarto не так и много, чтобы ошибиться...

Код
У Иара не молучается так что оптимизация по скорости даёт меньший код?
У Иара разница при переключениях скорость/код на большинстве моих проектов несущественная, в этом случае тоже. В принципе GCC как компилятор меня лично бы устроил вполне, но проблемы с отладкой... Не так это пока удобно как в Иаре, но буду пробовать дальше разбираться...

Код
А что вы для STM использовали как GDB-сервер? GDB от Atollic?
Со стороны J-Link'а его родной сервер, со стороны Эклипса клиент GDB из Yagarto. Кстати, на сайте Сеггера есть таблица из которой следует, что gdb из Yagarto функциональнее менторовского CodeSourcery (сам не проверял), потому и подсел пока на Yagarto.


Код
У STM была какая-то программа для отображения вроде (stmstudio что ли?), её неудаётся задействовать?
Это прога для рисования графиков по изменению значений переменной. Кому-то возможно полезна, но мне пока такое не требуется. Нужен Live Watch. Если не добьюсь, наверно придется оставаться на Иаре. Кстати, его плагин для Эклипса все еще сильно ограничен, судя по release notes. Прикручивать Эклипс к Иару ради редактора как-то пока не хочется... Эх, нет в халяве совершенства.... а так жаль...

Код
Да, с Move to Line и Run to Line в Eclipse как-то печально...
У меня Run To Line работает нормально.

Вот блин, дождался. на строке где производилось деление чисел получил такое сообщение в окне редактора:

Код
Can't find a source file at "../../../../../gcc-4.7.2/libgcc/config/arm/ieee754-df.S"
Locate the file or edit the source lookup path to include its location.
такого файла в инсталлированном yagarto нет вообще...
_Артём_
Цитата(ivainc1789 @ Oct 30 2012, 12:22) *
В принципе GCC как компилятор меня лично бы устроил вполне, но проблемы с отладкой... Не так это пока удобно как в Иаре, но буду пробовать дальше разбираться...

Проблемы с отладкой это прыганье непонятно по каким строкам исходника?
Или отсутствие LiveWatch и прочих окон?

Цитата(ivainc1789 @ Oct 30 2012, 12:22) *
Со стороны J-Link'а его родной сервер, со стороны Эклипса клиент GDB из Yagarto.

Я использую такую же связку: J-Link сервер, ПВИ от Yagarto, Zylin, EmbSys.
В основном работает.

Цитата(ivainc1789 @ Oct 30 2012, 12:22) *
Нужен Live Watch. Если не добьюсь, наверно придется оставаться на Иаре. Кстати, его плагин для Эклипса все еще сильно ограничен, судя по release notes. Прикручивать Эклипс к Иару ради редактора как-то пока не хочется... Эх, нет в халяве совершенства.... а так жаль...

Если так Live Watch нужен, то можно запустить на отладку ELF полученный от GCC.


ivainc1789
Цитата(_Артём_ @ Oct 31 2012, 00:32) *
Проблемы с отладкой это прыганье непонятно по каким строкам исходника?
Или отсутствие LiveWatch и прочих окон?

1. И то, и то. Сейчас вроде первую проблему решил... По крайней мере, после удаления Zylin CDT debug plugin, который у меня так и не заработал в Индиге SR2 все команды инициализации, старта дебага теперь выполняются корректно как и предписано в настройка штатного debug plugin. Единственное, что не работает, это птица в Windows/Pref, которая якобы ставит по умолчанию break на main. У меня не ставит. Чтобы поставить такой брейкпоинт, работает птица в debug configurations...
2. LiveWatch это конечно просто моя привычка. Но чем заменить пока не знаю. В некоторых проектах я отлавливал глюки тоько благодаря LiveWatch. Например, при "наблюдении" некоторой переменной с частотой 1 значение в сек. замечались "проскоки" левых значений. После разбора полетов ошибка быстро находилась. А тут на время выполнения программы все замораживается и что-то посмотреть можно тока при достижении точки останова. Неудобно.
3. Еще я не совсем понял пока как GCC работает с float. То, что IAR определял как float здесь рекастится в double. Как бы дать знать компилятору, чтобы не использовал double? "Ошибка" приведенная выше это вроде просто вызов библиотечной функции а так как исходника нет, вот и ругается...
4. Кнопки Reset при GDB отладке похоже нет. Вместо нее приходится просто выполнять Terminate всего процесса. Верно ли?
5. Разобрался таки с EmbSys register plugin. Как только дочитал тему на нашем форуме в соотв разделе. Так и не понял почему заставляют делать двойной клик на каждом регистре чтобы "активировать" его?
6. И еще траблы с printf. Компиляция стандартной функции из библиотек ST:
Код
void assert_failed(uint8_t* file, uint32_t line){
  printf("BadPar: file %s on line %d\r\n", file, line);
  while (1);
}

выдает ошибки типа:
Код
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\thumb\v7m\newlib\libc\reent/../../../../../../../newlib-1.20.0/newlib/libc/reent/sbrkr.c:58: undefined reference to `_sbrk'
c:/arm/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/thumb/v7m\libg.a(lib_a-writer.o): In function `_write_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\thumb\v7m\newlib\libc\reent/../../../../../../../newlib-1.20.0/newlib/libc/reent/writer.c:58: undefined reference to `_write'
c:/arm/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/thumb/v7m\libg.a(lib_a-closer.o): In function `_close_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\thumb\v7m\newlib\libc\reent/../../../../../../../newlib-1.20.0/newlib/libc/reent/closer.c:53: undefined reference to `_close'
c:/arm/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/thumb/v7m\libg.a(lib_a-fstatr.o): In function `_fstat_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\thumb\v7m\newlib\libc\reent/../../../../../../../newlib-1.20.0/newlib/libc/reent/fstatr.c:62: undefined reference to `_fstat'
c:/arm/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/thumb/v7m\libg.a(lib_a-isattyr.o): In function `_isatty_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\thumb\v7m\newlib\libc\reent/../../../../../../../newlib-1.20.0/newlib/libc/reent/isattyr.c:58: undefined reference to `_isatty'
c:/arm/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/thumb/v7m\libg.a(lib_a-lseekr.o): In function `_lseek_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\thumb\v7m\newlib\libc\reent/../../../../../../../newlib-1.20.0/newlib/libc/reent/lseekr.c:58: undefined reference to `_lseek'
c:/arm/yagarto/bin/../lib/gcc/arm-none-eabi/4.7.2/../../../../arm-none-eabi/lib/thumb/v7m\libg.a(lib_a-readr.o): In function `_read_r':
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\thumb\v7m\newlib\libc\reent/../../../../../../../newlib-1.20.0/newlib/libc/reent/readr.c:58: undefined reference to `_read'

таких путей у меня в Yagarto вообще нет, но ясно, что тут что-то с библиотеками... Как победить, пока не знаю...


Код
Если так Live Watch нужен, то можно запустить на отладку ELF полученный от GCC.
Если вы про отладку в Иаре, то мне все же хочется найти ему замену. Полную. Надо наработать опыт с GDB отладкой чтобы лучше пользоваться такими возможностями. Но Иаровский плагин я все же попробую, хоть он и ограниченный. Версия 0.13.2 уже сильно продвинулась...
_Артём_
Цитата(ivainc1789 @ Oct 31 2012, 19:09) *
1. И то, и то. Сейчас вроде первую проблему решил... По крайней мере, после удаления Zylin CDT debug plugin, который у меня так и не заработал в Индиге SR2 все команды инициализации, старта дебага теперь выполняются корректно как и предписано в настройка штатного debug plugin.

У меня установлена Helios Service Release 2, вроде с Zylin работатет нормально.
А чем Zylin заменить можно? И есть ли смысл?


Цитата(ivainc1789 @ Oct 31 2012, 19:09) *
Единственное, что не работает, это птица в Windows/Pref, которая якобы ставит по умолчанию break на main. У меня не ставит. Чтобы поставить такой брейкпоинт, работает птица в debug configurations...

Остановка на main по моему обеспечивается не галкой, а командой инициализации
Цитата
tbreak main

там можно хоть на Reset_Handler-е тормознуть, хоть на SysTick_Handler, или на main.

Цитата(ivainc1789 @ Oct 31 2012, 19:09) *
2. LiveWatch это конечно просто моя привычка. Но чем заменить пока не знаю. В некоторых проектах я отлавливал глюки тоько благодаря LiveWatch. Например, при "наблюдении" некоторой переменной с частотой 1 значение в сек. замечались "проскоки" левых значений. После разбора полетов ошибка быстро находилась. А тут на время выполнения программы все замораживается и что-то посмотреть можно тока при достижении точки останова.Неудобно.

Заменить можно проверкой переменной в каком-нибудь часто вызываемом месте (прерывании от таймера например) и остановкой при выходе за допустимый диапазон.

PS. А что databreakpoint и break поусловию не поддержаны?

Цитата(ivainc1789 @ Oct 31 2012, 19:09) *
3. Еще я не совсем понял пока как GCC работает с float. То, что IAR определял как float здесь рекастится в double.

Да, это проблема, сам бы хотел знать как заставить считать с меньшей точностью.
Есть правда библиотека от ARM для CortexM3 - DSP_Lib, но там вообще fixed point. По идее она компактней.

Цитата(ivainc1789 @ Oct 31 2012, 19:09) *
4. Кнопки Reset при GDB отладке похоже нет. Вместо нее приходится просто выполнять Terminate всего процесса. Верно ли?

К сожалению верно - приходится изголятся - писать
Цитата
mon reset 0

в окне Console (реально пишу mr - остальное Punto Switcher разворачивает).

Цитата(ivainc1789 @ Oct 31 2012, 19:09) *
5. Разобрался таки с EmbSys register plugin. Как только дочитал тему на нашем форуме в соотв разделе. Так и не понял почему заставляют делать двойной клик на каждом регистре чтобы "активировать" его?

Кто заставляет?
Я делаю двойной лик на нужном блоке (например нужет USART0, то его разворачиваю и кликаю на стоке USART0 - обновляет сразу весь блок регистров).



Цитата(ivainc1789 @ Oct 31 2012, 19:09) *
6. И еще траблы с printf. Компиляция стандартной функции из библиотек ST:
Код
void assert_failed(uint8_t* file, uint32_t line){
  printf("BadPar: file %s on line %d\r\n", file, line);
  while (1);
}

выдает ошибки типа:
Код
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\thumb\v7m\newlib\libc\reent/../../../../../../../newlib-1.20.0/newlib/libc/reent/sbrkr.c:58: undefined reference to `_sbrk'

таких путей у меня в Yagarto вообще нет, но ясно, что тут что-то с библиотеками... Как победить, пока не знаю...

Стандартная ошибка номер не знаю какой... Нужно то ли new реализовать, то ли ещё что ... не помню - printf не использую.

Кажется AHTOXA выкладывал файл, исправляюший эту ошибку (stm32_minimal_with_printf_and_new.zip). А может я путаю...

Цитата(ivainc1789 @ Oct 31 2012, 19:09) *
Код
Если так Live Watch нужен, то можно запустить на отладку ELF полученный от GCC.
Если вы про отладку в Иаре, то мне все же хочется найти ему замену. Полную.

Я про то чтобы компилировать GCC, а открывать в IAR ARM EW. Но если отказаться хотите, то это не вариант.

Цитата(ivainc1789 @ Oct 31 2012, 19:09) *
Надо наработать опыт с GDB отладкой чтобы лучше пользоваться такими возможностями. Но Иаровский плагин я все же попробую, хоть он и ограниченный. Версия 0.13.2 уже сильно продвинулась...

Может и продвинулась, но мне отладка ни в Иар, ни в кейл, ни в эклипсе не понравилась - везде свои недостатки... Может в Visual Studio попробовать? Правда не знаю как. Был вроде какой-то плагин (visualgdb.com),но оно платное...
AHTOXA
Цитата(ivainc1789 @ Oct 31 2012, 23:09) *
6. И еще траблы с printf.
...
выдает ошибки типа:
Код
C:\msys\1.0\home\yagarto\newlib-build\arm-none-eabi\thumb\v7m\newlib\libc\reent/../../../../../../../newlib-1.20.0/newlib/libc/reent/sbrkr.c:58: undefined reference to `_sbrk'
...

Вам нужно добавить к проекту системные вызовы. Пример я прикладывал вот к этому сообщению.
Или посмотрите проект, про который упомянул _Артём_. Вот он.
ivainc1789
Цитата(_Артём_ @ Oct 31 2012, 23:41) *
У меня установлена Helios Service Release 2, вроде с Zylin работатет нормально.
А чем Zylin заменить можно? И есть ли смысл?
Имхо ничем и незачем. В Индиге (как там в Гелиос не знаю) уже есть "штатный" С/С++ GDB Hardware Debugging. Устанавливается стандартно. Вроде работает нормально и не надо ему мешать ))).
Код
Остановка на main по моему обеспечивается не галкой, а командой инициализации
там можно хоть на Reset_Handler-е тормознуть, хоть на SysTick_Handler, или на main.

Все верно. Только тогда какой смысл галки Window/Preferencies/C/C++/Debug/GDB? Имхо, если только она установлена, то соотв брейк должен быть, но у мну его не наблюдается.

Код
Заменить можно проверкой переменной в каком-нибудь часто вызываемом месте (прерывании от таймера например) и остановкой при выходе за допустимый диапазон.
PS. А что databreakpoint и break поусловию не поддержаны?
У меня J-Link. Я что-то не нашел такой поддержки. Плохо искал? Тут в debug есть только самый минимальный набор функций. Теперь рассмотрим такой пример из моего недавнего проекта. Есть вентилятор скорость которого авторегулируется ресурсами MCU. Драйвер обратной связи вычисляет скорость вращения и записывает/обновляет ее значение в переменной Speed. Отлаживая/проверяя работу драйвера мне хотелось бы знать с какой дельтой поддерживается скорость (ну хотя бы примерно). В Иаре достаточно кинуть Speed в LiveWatch и пронаблюдать. Если делать контроль диапазона значений или пытаться "накопить" кучку значений за например 5 мин работы - это потребует в Иар существенных знаний и телодвижений (установка log breakpoint, настройка expression и т. д.). А как в Eclipse?
Код
К сожалению верно - приходится изголятся - писать
в окне Console (реально пишу mr - остальное Punto Switcher разворачивает).

немного оффтопа. В Punto Switcher (PS) используете вкладку "Правила переключения" при уст галке "Предлагать создать правило..."? У меня что-то эти созданные правила вообще не работают. Вроде там разработчики что-то перемудрили...
Код
Кто заставляет?
Я делаю двойной лик на нужном блоке (например нужет USART0, то его разворачиваю и кликаю на стоке USART0 - обновляет сразу весь блок регистров).

Я не точно выразился. Именно двойной клик на блоке зачем нужен? Да еще при возможности такими кликами включить ВСЕ блоки. Чего ж все то сразу и не включили?
Код
Может и продвинулась, но мне отладка ни в Иар, ни в кейл, ни в эклипсе не понравилась - везде свои недостатки...

Сначала ИАР мне тоже показался каким-то ограниченным. Но сейчас, я ему не вижу альтернативы. Особенно когда надо прыгать от AVR к 8051 а потом к ARM.
Код
Может в Visual Studio попробовать? Правда не знаю как. Был вроде какой-то плагин (visualgdb.com),но оно платное...
Мне кажется за бесплатно ничего толкового никто не предложит. Придется с глюками воевать и тратить кучу времени, которого нет. Так вот подумаешь... и купишь ImageCraft ICCCORTEX8 за 250 баксов для коммерческих проектов...
AHTOXA, спасибо за ссылки. Я вот что-то это проглядел. Просто слишком много новой инфы, эмоций - сразу всего не объять beer.gif

Теперь немного про эксперименты.
Итак, есть проект. Все нормально компилируется, ошибок нет. Хочу сменить тулчейн с Yagarto на Codesourcery. КАК?
Идем в настройки проекта, там есть возможность сменить тулчейн. Вот я на это и повелся. Сменил. Теперь не работает ни тот ни другой. Пути в Path and Symbols вообще не трогает. Долго искал как вернуть все назад. Методом тыка нашел, что нужно восстановить файл .cproject из предварительно созданной резервной копии проекта. Что же делаю не так? Или сменить тулчейн в Индиге в принципе невозможно через Свойства Проекта?
demiurg_spb
Цитата(ivainc1789 @ Oct 31 2012, 21:09) *
3. Еще я не совсем понял пока как GCC работает с float. То, что IAR определял как float здесь рекастится в double. Как бы дать знать компилятору, чтобы не использовал double? "Ошибка" приведенная выше это вроде просто вызов библиотечной функции а так как исходника нет, вот и ругается...

для всех строковых флоатов надобно буковку f дописывать и для имён функций соответственно;
например:
Код
float x = 1.0f;
float y = sqrtf(fabsf(x)) + 36.6f;


также можно добавить ключей компилятору чтоб он варнинги давал полезные:
Код
CFLAGS += -pedantic
CFLAGS += -Wall
CFLAGS += -Wextra
CFLAGS += -Werror
CFLAGS += -Wstrict-prototypes
CFLAGS += -Wno-main
CFLAGS += -Wdouble-promotion
CFLAGS += -Winit-self
CFLAGS += -Wsequence-point
CFLAGS += -Wfloat-equal
CFLAGS += -Wmissing-field-initializers
CFLAGS += -Wstack-usage=100
Сергей Борщ
QUOTE (ivainc1789 @ Nov 1 2012, 08:16) *
Я не точно выразился. Именно двойной клик на блоке зачем нужен? Да еще при возможности такими кликами включить ВСЕ блоки. Чего ж все то сразу и не включили?
По двум причинам:
1) Потому что чтение некоторых регистров, даже отладчиком, приводит к некоторым действиям (изменению их содержимого, содержимого других регистров и т.д.). И если отладчик их будет молча читать - ваша программа под отладкой может работать совершенно не так, как вы ожидаете.
2) Потому что после каждой операции отладчик будет вынужден перечитывать содержимое _всех_ регистров, и это может сильно замедлить его работу. Поэтому вам и предлагается выбрать только те регистры, содержимое которых вам действительно инетересно.

QUOTE (ivainc1789 @ Nov 1 2012, 08:16) *
Или сменить тулчейн в Индиге в принципе невозможно через Свойства Проекта?
У меня путь к toolchain/bin добавляется в path в makefile. Для смены достаточно заменить одну строчку. При создании проекта выбран external makefile project. Галочки в эклипсе для настроек компиляции не используются. Проект можно собирать не запуская эклипсу.
AHTOXA
Цитата(Сергей Борщ @ Nov 1 2012, 13:11) *
external makefile project

+1.
_Артём_
Цитата(demiurg_spb @ Nov 1 2012, 07:24) *
Код
float x = 1.0f;
float y = sqrtf(fabsf(x)) + 36.6f;

И что? Тогда double-математика не используется?
demiurg_spb
Во всяком случае мне в это хотелось бы веритьsm.gif
А у вас есть сомнения?
Единственная непреодолимая для меня ситуация это ситуация с printf("%f", float_var).
Т.к. аргументом для %f должен быть дабл. И нет никакого стандартного способа для вывода флоатов при помощи prinf (без приведения к даблу).
_Артём_
Цитата(demiurg_spb @ Nov 1 2012, 14:14) *
Во всяком случае мне в это хотелось бы веритьsm.gif

Не получается. sad.gif

Цитата(demiurg_spb @ Nov 1 2012, 14:14) *
А у вас есть сомнения?

Какие ж сомнения? Использовал функции cosf, sqrtf. Потом глянул в map - а там какой-нибудь __aeabi_dmul и размер такой, что ни в какие ворота.
demiurg_spb
Так надо раскрутить и понять откуда ноги растут. Не должно быть такого.
_Артём_
Цитата(demiurg_spb @ Nov 1 2012, 14:44) *
Так надо раскрутить и понять откуда ноги растут. Не должно быть такого.


Кусок кода такой:
Код
#include <math.h>

volatile float DeltaX=50, DeltaY=120, Angle=3.14/4;
volatile float Delta;
volatile unsigned char DistanceFlag;
void test_math() {
    while (1) {
        float dx=DeltaX, dy=DeltaY, angle=Angle, distance_delta;
        dx=dx*cosf(angle);
        distance_delta=dx*dx+dy*dy;
        distance_delta=sqrtf(distance_delta);
        if (distance_delta>100)
            DistanceFlag=1;
        Delta=distance_delta;
    }
}

Всё вроде с float...
demiurg_spb
нет ни одного f после констант.
Но это наверное не главное. Вы изучайте внимательно map-файл и взаимосвязи в нём.
Это единственный верный путь.
HINT: вам вообще лучше использовать функцию hypotf(dx, dy) вместо
distance_delta=dx*dx+dy*dy;
distance_delta=sqrtf(distance_delta);
ivainc1789
Цитата(demiurg_spb @ Nov 1 2012, 09:24) *
для всех строковых флоатов надобно буковку f дописывать и для имён функций соответственно;
например:
Код
float x = 1.0f;
float y = sqrtf(fabsf(x)) + 36.6f;

А компилятору по барабану. У меня есть такие определения:
Код
#define    Fhclk   24e6            //  частота ядра,Гц
#define    ms      (Fhclk/1e3)    //  количество циклов для одной миллисекунды

эта ms в дебаггере всегда double какие там буковки не ставь... Теперь понятно, почему в дебаге такой большой код, что трудновато полностью засунуть в кристалл мало-мальский проект... Если я правильно понимаю историю GCC, его делали для компиляции приложений под линукс, строгой заточенности под микроконтроллеры (где подчас каждый байт на счету) не предполагалось...
Цитата
По двум причинам:...
Причины понятны, реализация не понятна. Можно же было бы сделать по-человечески: если пользователь разворачивает группу - группа автоматом активируется, закрывает группу - деактивируется. То же самое, тока гораздо удобнее.
Цитата
У меня путь к toolchain/bin добавляется в path в makefile. Для смены достаточно заменить одну строчку.
Я пробовал изучить синтаксис make файлов раза 4 за последние 10 лет. Не смог. Не потому что сложно, просто психологически трудно работать с IDE, в которой всеравно приходится лезть в какой-то файл и править его вручную. Хочется какого-то целостного решения, что ли. Вот Эклипс вроде его пытается предложить, но пока я в полном шоке от такого предложения. И вроде бы операции, осущ мэйкфайлом ну настолько стандартные и понятные, что любая IDE должна без вопросов это делать автоматом, ан нет... Только что решил попробовать плагин Иара в Эклипсе. Имея уже довольно прочный опыт создания тестовых проектов в Эклипсе я добавлял файлы в Иаровский проект ЦЕЛЫХ ПОЛЧАСА. И проблема оказалась в том, что даже начиная формирование нового проекта Эклипс каким-то чудом тащит за собой прилинкованные ресурсы из предыдущего. И еще у него нелюбовь к ресурсам с меткой read only. Многое не увидел пока свойства файлов не поправил. Потом переидексация по нескольку раз и т. д. И с путями в Эклипсе полная каша. И как так можно работать? А если представить проектик из 48 файлов исходников - там замучаешься так "собирать" проект... Ну это просто эмоции, сорри...
Кстати, иаровский плагин четко отрабатывает move to line и прочие команды. Вообще работает очень стабильно, придраться могу только к одному: шрифт в консоли сбивается на размер по умолчанию для исходников. Причем не сразу, первые две строки нормально отображаются установленным в настройках шрифтом.
Еще у меня по GCC вопрос. Есть ли возможность настроить map файл линкера? Стоило только указать ключ remove unused sections - он выводит весь этот длиннющий список (для каждого объектного файла) в map файл.
_Артём_
Цитата(ivainc1789 @ Nov 1 2012, 07:16) *
У меня J-Link. Я что-то не нашел такой поддержки. Плохо искал? Тут в debug есть только самый минимальный набор функций.

Нужно сначала создать break, потом в его свойствах условия остановки приписать.


Цитата(ivainc1789 @ Nov 1 2012, 07:16) *
немного оффтопа. В Punto Switcher (PS) используете вкладку "Правила переключения" при уст галке "Предлагать создать правило..."? У меня что-то эти созданные правила вообще не работают. Вроде там разработчики что-то перемудрили...

Пункт Настройки - Автозамена.
Цитата(ivainc1789 @ Nov 1 2012, 07:16) *
Мне кажется за бесплатно ничего толкового никто не предложит. Придется с глюками воевать и тратить кучу времени, которого нет.

Да вроде всё болеее менее. Можно юзать.

Цитата(ivainc1789 @ Nov 1 2012, 07:16) *
Так вот подумаешь... и купишь ImageCraft ICCCORTEX8 за 250 баксов для коммерческих проектов...

ImageCraft - не дай бог.

Цитата(ivainc1789 @ Nov 1 2012, 07:16) *
Хочу сменить тулчейн с Yagarto на Codesourcery. КАК?

А зачем? Он что лучше на порядок?



Цитата(ivainc1789 @ Nov 1 2012, 17:32) *
Только что решил попробовать плагин Иара в Эклипсе. Имея уже довольно прочный опыт создания тестовых проектов в Эклипсе я добавлял файлы в Иаровский проект ЦЕЛЫХ ПОЛЧАСА. И проблема оказалась в том, что даже начиная формирование нового проекта Эклипс каким-то чудом тащит за собой прилинкованные ресурсы из предыдущего. И еще у него нелюбовь к ресурсам с меткой read only. Многое не увидел пока свойства файлов не поправил. Потом переидексация по нескольку раз и т. д.

Как-то не так добавляете...
Просто файл создаётся в нужной папке с расширением cpp, и всё - добавилось.

Цитата(ivainc1789 @ Nov 1 2012, 17:32) *
И с путями в Эклипсе полная каша. И как так можно работать? А если представить проектик из 48 файлов исходников - там замучаешься так "собирать" проект... Ну это просто эмоции, сорри...

Видимо не настроены Discovery options.
Эклипса сама тогда всё найдёт и распарсит.
ivainc1789
1. На сайте GNU ARM plugin ознакомился с "известными проблемами". Оказывается смена тулчейна до конца не реализована и честно предупреждается, что при такой попытке проект становится нерабочий.
2. Продолжил разбираться с printf. Подключил syscall_minimal.c. Внес необходимые исправления. Теперь проект собирается без ошибок, однако простите за тупизм, но содержимое функции putChar я что-то затрудняюсь написать. В примерах люди используют вывод в UART, но мне этого не нужно ведь printf используется только для отладки J-Link'ом. Кроме того, даже при пустой функции putChar размер bin файла контроллера возрастает с 31кБ до 57кБ что совсем огорчительно. В Иаре на этом же проекте подключение printf стоит 5кБ: с 20кБ до 25кБ. Потому вопрос: возможно ли для Debug испоьзовать легкую оптимизацию с опциями -O1,2,3 ? И не помешает ли это отладке?
3. Насколько я понял, отладка через GDB позволяет только наблюдать значения переменных, ставить точки останова на код. Data брейкпоинт не поддерживается.
4. По make файлам. Может ли кто-нибудь поделиться примером под STM32 + Eclipse? Только содержимое хотелось бы видеть с поддержкой такого: определены директории где находятся И БУДУТ ДОБАВЛЯТЬСЯ си файлы, утилита автоматом их подхватывает и собирает проект. Также если есть какая-нибудь вменяемая дока по make файлам как и сама утилита (проверенная версия) - было бы здорово. И еще. Я так понимаю, что речь о GNU MAKE? Не стоит ли изучать что-то более продвинутое?
AHTOXA
Цитата(ivainc1789 @ Nov 1 2012, 21:32) *
Я пробовал изучить синтаксис make файлов раза 4 за последние 10 лет. Не смог. Не потому что сложно, просто психологически трудно работать с IDE, в которой всеравно приходится лезть в какой-то файл и править его вручную. Хочется какого-то целостного решения, что ли.

А вы посмотрите на это с другой стороны. Многие IDE поддерживают внешние makefile-ы. Таким образом, единожды изучив makefile-ы, вы избавите себя от необходимости изучать кучу птичек в разных IDE sm.gif
Цитата(ivainc1789 @ Nov 4 2012, 12:55) *
2. Продолжил разбираться с printf. Подключил syscall_minimal.c. Внес необходимые исправления. Теперь проект собирается без ошибок, однако простите за тупизм, но содержимое функции putChar я что-то затрудняюсь написать. В примерах люди используют вывод в UART, но мне этого не нужно ведь printf используется только для отладки J-Link'ом. Кроме того, даже при пустой функции putChar размер bin файла контроллера возрастает с 31кБ до 57кБ что совсем огорчительно.

К сожалению, реализация printf в стандартной библиотеке действительно тяжёлая. Если упёрлись в нехватку памяти, можете воспользоваться альтернативными реализациями (например, отсюда).
Цитата(ivainc1789 @ Nov 4 2012, 12:55) *
4. По make файлам. Может ли кто-нибудь поделиться примером под STM32 + Eclipse?

Посмотрите вот здесь. Всё как вы написали - автоматически подхватываются все файлы исходников в заданном списке директорий.
Насчёт документации - вот: Эффективное использование GNU Make. Для начала вполне достаточно.
ReAl
Цитата(AHTOXA @ Nov 4 2012, 10:30) *
А вы посмотрите на это с другой стороны. Многие IDE поддерживают внешние makefile-ы. Таким образом, единожды изучив makefile-ы, вы избавите себя от необходимости изучать кучу птичек в разных IDE sm.gif

Вот именно. Как работал в режиме с внешним makefile начиная с K52/KED/TED через Qedit/MED до NetBeans и Code::Blocks с эпизодическими редактированиями мелочей в Notepad++/VIM/gedit, так и работаю. «Целостность решения» не поломалась ни 4-кратной принципиальной сменой ОС (RT-11/DOS/Win3...XP/Linux) ни гораздо более многокртаной сменой «тулчейна»

Цитата(AHTOXA @ Nov 4 2012, 10:30) *
Посмотрите вот здесь. Всё как вы написали - автоматически подхватываются все файлы исходников в заданном списке директорий.
Присоединяюсь. Давно перешёл на автоматическое подхватывание makefil-ом всех исходников в указанных каталогах-«модулях». Удобно.
_Артём_
Цитата(ivainc1789 @ Nov 4 2012, 08:55) *
В Иаре на этом же проекте подключение printf стоит 5кБ: с 20кБ до 25кБ. Потому вопрос: возможно ли для Debug испоьзовать легкую оптимизацию с опциями -O1,2,3 ? И не помешает ли это отладке?

Нет особого смsсла использовать для отладки уровень оптимизации, отличный от release. За исключением случая, когда нужно убедится что код в принципе может быть работоспособным.


Цитата(ivainc1789 @ Nov 4 2012, 08:55) *
3. Насколько я понял, отладка через GDB позволяет только наблюдать значения переменных, ставить точки останова на код. Data брейкпоинт не поддерживается.

А нельзя ли задействовать jlink-ий сервер (который в трее висит)? На вкладке Breakpoint databreakpoint упоминаются. Или невозможно?
ivainc1789
Цитата(_Артём_ @ Nov 5 2012, 03:23) *
Нет особого смsсла использовать для отладки уровень оптимизации, отличный от release. За исключением случая, когда нужно убедится что код в принципе может быть работоспособным.
Откуда такие сведения? Т.е. вам приходилось отлаживать код release? И все работало?

Цитата
А нельзя ли задействовать jlink-ий сервер (который в трее висит)? На вкладке Breakpoint databreakpoint упоминаются. Или невозможно?

Сейчас слегка изучил возможности отладки из под CDT 8.0 :
1. Точки останова только на код с возможностью "наложить" на них действия: выдать звук, продолжить программу через заданное время в сек., выдать лог (текстовый и выполнить некоторый набор инструкций), выполнить некую внеш утилиту. Мне непонятны две вещи: если в качестве лога предлагается выполнить набор инструкций (установлена галка " As expressions", то в каком формате нужно писать этот набор? Это кусок Си кода или еще как? В хелпе не нашел. Попробовал что-то типа " X = 1; " - вроде работает... Далее, при каких таких условиях потребовалось бы выполнить некую утилиту по достижении точки останова? Если кто пользовал, можно ли пример? И наконец, жаль, но вроде как "продолжить программу через несколько сек." - это именно притормозить программу на это время. Я сначала обрадовался, что нашел аналог LiveWatch из IAR, но в Иаре сделано так, что прога не останавливается - просто каждую секунду запрашиваются текущие значения переменных из окна LiveWatch.
2. Можно сделать точку останова типа watchpoint на переменную из ram. По факту чтения или записи возможны все действия, что и в п.1. Это в том числе и то, что предлагает и J-Link'овский GDB сервер.

В целом возможности отладки неплохие, тем более что судя по хелпу из Эклипса эти CDT tools активно развиваются и уже сейчас можно слегка расширить эти возможности установкой доп плагинов.
Знакомясь с Эклипсой, я скомпилировал тестовый проект в нем как через Yagarto/GCC так и через IAR plugin. Думаю, на текущий момент это наиболее оптимальное сочетание средств: с одной стороны используются шикарные возможности редактора Эклипса, с другой есть гибкость в оперативной смене компиляторов GCC / ICC. Не знаю как дальше это пойдет, т. к. Juno загружается на моем весьма недревнем ноуте раза в 3 дольше Indigo...
Только тяжелый вопрос с изучением make файлов как всегда остался пока неразрешенным... )))
Сергей Борщ
QUOTE (ivainc1789 @ Nov 5 2012, 12:58) *
Откуда такие сведения? Т.е. вам приходилось отлаживать код release? И все работало?
Только так и отлаживаюсь и все работает. А какой смысл сначала отлаживать другой код, а потом еще отлавливать ошибки, которые вылезут при включении оптимизатора (забытые volatile, гонки и т.д)? Да, есть тонкости - отлаживаться надо с включенным окном дизассемблера, потому что не каждому С-выражению соответствует какой-то код. Да, иногда нельзя поставить точку останова, если этот участок исходника был соптимизирован. Но можно найти нужное место и вставить точку останова в окне дизассемблера.
_Артём_
Цитата(ivainc1789 @ Nov 5 2012, 11:58) *
Т.е. вам приходилось отлаживать код release? И все работало?

Что может не работать?
Работало, может не всегда сразу так как хотелось бы, но на то она и отладка, чтобы ошибки устранить. Зашивать-то всё равно Release надо.
ivainc1789
Цитата(Сергей Борщ @ Nov 5 2012, 14:25) *
не каждому С-выражению соответствует какой-то код. Да, иногда нельзя поставить точку останова, если этот участок исходника был соптимизирован. Но можно найти нужное место и вставить точку останова в окне дизассемблера.
И еще у меня часто бывало невозможно посмотреть значения переменных - печатались какие-то левые значения. Это было в Иаре. Вот тогда я и решил, что дебаг - все же для отладки, а релиз как бы должен гарантированно собираться без ошибок. Конечно, логично зашивать в МК то, что отлажено. Надо будет потестировать GDB и IAR плагин в этом смысле...
Начал с Иаровского плагина. На моем тестовом проекте ПОКА нормально дебажится релиз...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.