klen 1 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба свежак для арм для 32 битной винды: http://klen.org/Files/DevTools/kgp_arm_eab..._32_20101006.7z для 64 битной: http://klen.org/Files/DevTools/kgp_arm_eab..._64_20101006.7z в принципе они ничем не должны отличатся ..., первая будет работать на обоих платформах. как обычтно dyenhb имеется openocd смешно но факт - вчерашнее состояние исходников binutils не разрешает кортексу-M3 использовать инструкцию SWI :) - но я это поправил, это народ прикручивает M0 м M1. есть просьба к тем кто их может проверить - проверить компиллер и сообщить об успешности или наоборот. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spasbyspas 0 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Уважаемые Клен. Ваши архивы повреждены! Пожалуйста, исправьте их! Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 6 октября, 2010 Опубликовано 6 октября, 2010 · Жалоба Уважаемые Клен. Ваши архивы повреждены! Пожалуйста, исправьте их! Спасибо! как Вы определили что архивы битые. я сейчас скачал и проверил, архивы целые. оба. мож компилятор не работает - это тогда не архивы виноваты а я чтото недоложил. укажите симптомы. и еще, если вы будите пытатся запустить бинарники для 64 битной винды из под 32 битной - то она скажет что файлы повреждены или не являются исполняймыми. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spasbyspas 0 6 октября, 2010 Опубликовано 6 октября, 2010 (изменено) · Жалоба Пожалуйста, простите меня. После замены версии с нового вер. архиватора - все извлечено! Изменено 6 октября, 2010 пользователем spasbyspas Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimay192 0 8 октября, 2010 Опубликовано 8 октября, 2010 (изменено) · Жалоба Клен, а ты делаешь сборки тулчейной для linux? или быть может выложишь исходники (исходники или патчи) с краткой инструкцией по самостоятельной сборке (опции сборки, ...) :) Меня интересует тулчейн для армов Изменено 8 октября, 2010 пользователем dimay192 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimay192 0 11 октября, 2010 Опубликовано 11 октября, 2010 (изменено) · Жалоба Проблема у меня таже, что у AlexeyVoroshen (несколько постов тому назад) - накидал мне компилятор/линковщик всякого барахла под 50КБ во флеху. До определенного момента все было ок (размер кода вроде соответствовал тому, что я писал).... А потом - шаг влево, шаг вправо (даже при добавлении вызова ПУСТОЙ ф-ции) - захламляет флеха не пойми чем. А перед этим говорит, "undefined reference to `_exit' ", "undefined reference to `_sbrk' " "undefined reference to `_sbrk' ", и т.д... Ну на тебе заглушку syscalls.c.... Компилит... Вроде все нормуль... Но размер кода махом увеличивается на 50КБ! А проект- то пока еще пустой... Операторы типа new,... и др. не использовал подавно. .... Собрал тулчейн собственными силами вот из этого {gcc-4.5.1 | binutils-2.20 | newlib-1.18 | gdb-7.2 | openocd-0.5.0} Причем, newlib собирал с опцией --disable-newlib-supplied-syscalls (сказать по правде, немного не понимаю - то ли при этом вообще должны запрещаться системные вызовы, то ли компилятор начинает искать их реализацию в других исходниках).... Ну ладно, в любом случае проблема остается - непомерно великий код. хотя размер целевого кода не должен вылезти за пределы 32К флеши (решил перейти с MSP430 на STM32, а заодно и перенести (переписать) существующий проект, который на первом занял менее 10КБ). Брать STM32 со 128КБ флешой ради 50КБ ховнятены (прошу прощения за мой французский) - стремно. Как же мне вразумить компилятор не тащить то, че он не должен тащить (не нужны мне системные вызовы, обработчики исключений, ... - без них как то работал на MSP-шнике)?!!!!!!!!!!!!!!! С какими ключами можно собрать компилятор, чтобы тот размещал в памяти исключительно целевой код и самый минимум из необходимого, не относящегося к целевому коду?!!!!!!!!!!!!!!! Изменено 11 октября, 2010 пользователем dimay192 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 12 октября, 2010 Опубликовано 12 октября, 2010 · Жалоба А потом - шаг влево, шаг вправо (даже при добавлении вызова ПУСТОЙ ф-ции) - захламляет флеха не пойми чем.О каждом модуле, загруженном линкером, линкер отчитывается в map-файле - из-за какого символа модуль был загружен, и кто (какой модуль) на этот символ ссылался. Там же указаны все размеры всех загруженных в выходной файл секций. Как может быть "не пойми чем", если линкер отчитывается за каждый байт? Как же мне вразумить компилятор не тащить то, че он не должен тащить (не нужны мне системные вызовы, обработчики исключений, ... - без них как то работал на MSP-шнике)?!!!!!!!!!!!!!!!Во-первых, компилятор скорее всего ни при чем. Ссылки на системные вызовы, как правило, берутся из стандартных библиотек (в данном случае newlib). Вероятно, Вы используете библиотечные функции, требующие наличия системных вызовов, вот линкер их и подгружает. Во-вторых, давайте разговаривать более предметно. Покажите ваш map-файл и перечислите модули, которые по вашему мнению не должны были загружаться линкером. Попробуем совместными усилиями разобраться, почему он это сделал. Без знания конкретных подробностей вряд ли можно сказать что-либо для Вас полезное. С какими ключами можно собрать компилятор, чтобы тот размещал в памяти исключительно целевой код и самый минимум из необходимого, не относящегося к целевому коду?!!!!!!!!!!!!!!!У меня компилятор всегда генерил только целевой код. Собираю как описано в документации. На каком языке пишете? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 12 октября, 2010 Опубликовано 12 октября, 2010 · Жалоба проект в студию, будем искать виноватых.... и мы их обязателно выберем в итоге :) 0. добавить в проект опции -fno-exceptions -fno-rtti, если их небыло 1. проверить результат и доложить. 2. обновить мою сборку, я наковырял небольшой породокс которым научился управлять но немогу пока объяснить - в новых сборках это учтено. для 32 битной винды: http://klen.org/Files/DevTools/kgp_arm_eab..._20101006_v2.7z для 64 битной: http://klen.org/Files/DevTools/kgp_arm_eab..._20101006_v2.7z 3. опять проверить и сравнить, результаты доложить. 4. будем детально разбиратся - 50кб на пустом месте это просто треш, это так оставлять нельзя - искать причину и жеч каленым железом. некоторые размышления: если проект на С++ то еще както я могу разумно предположить куда копать(парадокс которыый я нашел), если С - то ваще абзац.... ниченипанятна сейсас у меня демо проект в двух вариантах - один на С++ другой на С, содержит код FreeRTOS + несколько задач ( светодиод, USB, UART, тестовые сложные вычисления ) - в обои варантах получаю 10к++, С++ дает несколько процентов больше (есть виртуальные функции в обертках FreeRTOS вызовов) - такая ситуация то к чему я стремлю компиллер, у коллеги получилось 50к на пустом месте.... нестыковачка гдето... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimay192 0 12 октября, 2010 Опубликовано 12 октября, 2010 (изменено) · Жалоба Значит такс: 1.проект на С++ В общем, структура кода приблизительно такова: Главная ф-ция: ResourceManager RM; int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f10x_xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f10x.c file */ RM.start(); } Содержит два класса Первый, базовый class PlatformAbstractionLayer { public: PlatformAbstractionLayer(); virtual ~PlatformAbstractionLayer(); inline void confGPIO(void); inline void confConnection(void); inline bool confSystemTimer(void); protected: ... }; inline void PlatformAbstractionLayer::confGPIO(void) { //Единственное место, где я задействовал библиотеку STM32F10x_StdPeriph_Lib_V3.3.0 ... GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_Init(GPIOD, &GPIO_InitStructure); ... } inline bool PlatformAbstractionLayer::confSystemTimer(void) { return !SysTick_Config(SystemCoreClock / 1000); } !!!Остальные методы класса пусты!!! второй, наследник class ResourceManager: public PlatformAbstractionLayer { public: ResourceManager(); virtual ~ResourceManager(); inline void start(void); inline void softTimersDecrement(void); private: uint32 SoftTimerTicks[SOFT_TIMER_CNT]; uint32 SoftTimerPeriod[SOFT_TIMER_CNT]; uint32 SoftTimerFlags; inline void confHardware(void); inline void confSoftware(void); }; inline void ResourceManager::start(void) { this->confHardware(); this->confSoftware(); while(1) {} } inline void ResourceManager::softTimersDecrement(void) { uint16 idx; for(idx = 0; idx < SOFT_TIMER_CNT; idx++) { if((this->SoftTimerTicks[idx] != 0) && (--(this->SoftTimerTicks[idx]) == 0)) { this->SoftTimerTicks[idx] = this->SoftTimerPeriod[idx]; this->SoftTimerFlags |= BV32(idx); } } } inline void ResourceManager::confHardware(void) { this->confGPIO(); this->confConnection(); this->confSystemTimer(); } inline void ResourceManager::confSoftware(void) { } 2.опции -fno-exceptions -fno-rtti использовал! 3.Компилил проект четырьмя сборками компилятора а. CodeSourcery б. kgp_arm_eabi_x86_32_20101006 в. Собственная сборка г. Собственная сборка (newlib собирал с опцией (среди прочих, оптимизирующих размер кода) --disable-newlib-supplied-syscalls, с использованием файла-заглушки syscalls.c) Результаты получились такие (размер секции .text в байтах): CodeSourcery - 57936 kgp_arm_eabi_x86_32_20101006 - 5008 Собственная сборка (в) - 10636 Собственная сборка (г) - 7784 При определении класса PlatformAbstractionLayer как абстрактный: class PlatformAbstractionLayer { public: PlatformAbstractionLayer(); virtual ~PlatformAbstractionLayer(); inline void confGPIO(void); inline void confConnection(void); inline bool confSystemTimer(void); protected: virtual inline void softTimersDecrement(void)=0; ... }; ситуация меняется так (размер секции .text в байтах): CodeSourcery - 57936 kgp_arm_eabi_x86_32_20101006 - 41716 Собственная сборка (в) - 65664 Собственная сборка (г) - 64728 Изменено 12 октября, 2010 пользователем dimay192 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 12 октября, 2010 Опубликовано 12 октября, 2010 · Жалоба осталось только понять чем абстрактный клас от виртуального отличается в нашем отдельн взятом случае. полюбому дайте исходник одним файлом , код методов выкиньте, тут явно видно что дело не в целевом коде а в C++ подтяжках. нужно смотреть *.map и листинги - посмотреть что за код прилазит. есть вариант что зачемто (нам это предстоит выяснить зачем) прилинковывается new delete которые могут использоватся внутренним кодом stdlibc++. предоагаю еже один тесть - переопределите операторы new и delete - хотябы заглушки сделайте. Насколько я помню в stdlibc++ по умолчанию через new тянет свой стандартный аллокатор памяти - это жопа для микроконтроллеров, он страшный.... а вот если свой подсунуть в определении new то может эти 50кб и отвалятся... попробуйте. а ведь интересные грабли имеем, не так ли коллеги? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GetSmart 0 12 октября, 2010 Опубликовано 12 октября, 2010 · Жалоба а ведь интересные грабли имеем, не так ли коллеги? Как скажете, маэстро. (не смог сдержаться:)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 12 октября, 2010 Опубликовано 12 октября, 2010 · Жалоба Значит такс: ... virtual inline void softTimersDecrement(void)=0; Кхм! Не устаю повторять :rolleyes: Ну и от деструкторов, тем более виртуальных, в эмбеддед-приложениях, имхо, надо избавляться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 12 октября, 2010 Опубликовано 12 октября, 2010 · Жалоба Кхм! Не устаю повторять :rolleyes: Ну и от деструкторов, тем более виртуальных, в эмбеддед-приложениях, имхо, надо избавляться. а как от них избавишся если уничтожаеш экземпляр приведенный к базовому? тогда не вызовется деструктор потомка.. вопрос в дркгом - откуда стоько кода? пройтись по табличке VMT нужны такты и не так много как думают, а кода тут не нада - он тотже как при вызове виртуальныйх функций - механизм един. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 12 октября, 2010 Опубликовано 12 октября, 2010 · Жалоба вопрос в дркгом - откуда стоько кода? пройтись по табличке VMT нужны такты и не так много как думают, а кода тут не нада - он тотже как при вызове виртуальныйх функций - механизм един.Может я ошибаюсь, но на pure virtual функции, ставятся заглушки, которые могут потянуть за собой какой-то код exeptions, который за собой найдёт что потянуть. Не глядя на то, что ключ no-exceptions стоит — он на генерацию кода влияет, а не на то, что из библиотеки тянется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 12 октября, 2010 Опубликовано 12 октября, 2010 · Жалоба логичное объяснение. можно предложить так - генерить вызов какого либо пользовательского обработчика. это будет не по стандарту но для контроллеров пойдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться