|
|
  |
свежак KGP win32/arm/avr/mips/m68k, GNU tools chain |
|
|
|
Oct 6 2010, 09:36
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
свежак для арм для 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. есть просьба к тем кто их может проверить - проверить компиллер и сообщить об успешности или наоборот.
|
|
|
|
|
Oct 6 2010, 18:18
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 31-08-08
Пользователь №: 39 908

|
Уважаемые Клен. Ваши архивы повреждены! Пожалуйста, исправьте их! Спасибо!
|
|
|
|
|
Oct 6 2010, 20:58
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 31-08-08
Пользователь №: 39 908

|
Пожалуйста, простите меня. После замены версии с нового вер. архиватора - все извлечено!
Сообщение отредактировал spasbyspas - Oct 6 2010, 20:59
|
|
|
|
|
Oct 8 2010, 09:45
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 20-08-08
Пользователь №: 39 711

|
Клен, а ты делаешь сборки тулчейной для linux? или быть может выложишь исходники (исходники или патчи) с краткой инструкцией по самостоятельной сборке (опции сборки, ...)  Меня интересует тулчейн для армов
Сообщение отредактировал dimay192 - Oct 8 2010, 09:46
|
|
|
|
|
Oct 11 2010, 08:38
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 20-08-08
Пользователь №: 39 711

|
Проблема у меня таже, что у 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-шнике)?!!!!!!!!!!!!!!! С какими ключами можно собрать компилятор, чтобы тот размещал в памяти исключительно целевой код и самый минимум из необходимого, не относящегося к целевому коду?!!!!!!!!!!!!!!!
Сообщение отредактировал dimay192 - Oct 11 2010, 08:47
|
|
|
|
|
Oct 12 2010, 07:12
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(dimay192 @ Oct 11 2010, 13:38)  А потом - шаг влево, шаг вправо (даже при добавлении вызова ПУСТОЙ ф-ции) - захламляет флеха не пойми чем. О каждом модуле, загруженном линкером, линкер отчитывается в map-файле - из-за какого символа модуль был загружен, и кто (какой модуль) на этот символ ссылался. Там же указаны все размеры всех загруженных в выходной файл секций. Как может быть "не пойми чем", если линкер отчитывается за каждый байт? Цитата(dimay192 @ Oct 11 2010, 13:38)  Как же мне вразумить компилятор не тащить то, че он не должен тащить (не нужны мне системные вызовы, обработчики исключений, ... - без них как то работал на MSP-шнике)?!!!!!!!!!!!!!!! Во-первых, компилятор скорее всего ни при чем. Ссылки на системные вызовы, как правило, берутся из стандартных библиотек (в данном случае newlib). Вероятно, Вы используете библиотечные функции, требующие наличия системных вызовов, вот линкер их и подгружает. Во-вторых, давайте разговаривать более предметно. Покажите ваш map-файл и перечислите модули, которые по вашему мнению не должны были загружаться линкером. Попробуем совместными усилиями разобраться, почему он это сделал. Без знания конкретных подробностей вряд ли можно сказать что-либо для Вас полезное. Цитата(dimay192 @ Oct 11 2010, 13:38)  С какими ключами можно собрать компилятор, чтобы тот размещал в памяти исключительно целевой код и самый минимум из необходимого, не относящегося к целевому коду?!!!!!!!!!!!!!!! У меня компилятор всегда генерил только целевой код. Собираю как описано в документации. На каком языке пишете?
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
Oct 12 2010, 07:34
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
проект в студию, будем искать виноватых.... и мы их обязателно выберем в итоге  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.7z3. опять проверить и сравнить, результаты доложить. 4. будем детально разбиратся - 50кб на пустом месте это просто треш, это так оставлять нельзя - искать причину и жеч каленым железом. некоторые размышления: если проект на С++ то еще както я могу разумно предположить куда копать(парадокс которыый я нашел), если С - то ваще абзац.... ниченипанятна сейсас у меня демо проект в двух вариантах - один на С++ другой на С, содержит код FreeRTOS + несколько задач ( светодиод, USB, UART, тестовые сложные вычисления ) - в обои варантах получаю 10к++, С++ дает несколько процентов больше (есть виртуальные функции в обертках FreeRTOS вызовов) - такая ситуация то к чему я стремлю компиллер, у коллеги получилось 50к на пустом месте.... нестыковачка гдето...
|
|
|
|
|
Oct 12 2010, 11:23
|
Участник

Группа: Участник
Сообщений: 28
Регистрация: 20-08-08
Пользователь №: 39 711

|
Значит такс: 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
Сообщение отредактировал dimay192 - Oct 12 2010, 11:32
|
|
|
|
|
Oct 12 2010, 15:04
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(klen @ Oct 12 2010, 19:05)  а ведь интересные грабли имеем, не так ли коллеги? Как скажете, маэстро. (не смог сдержаться  )
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Oct 12 2010, 18:39
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(dimay192 @ Oct 12 2010, 17:23)  Значит такс: ... Код virtual inline void softTimersDecrement(void)=0; Кхм! Не устаю повторять  Ну и от деструкторов, тем более виртуальных, в эмбеддед-приложениях, имхо, надо избавляться.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 12 2010, 20:15
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(klen @ Oct 12 2010, 21:57)  вопрос в дркгом - откуда стоько кода? пройтись по табличке VMT нужны такты и не так много как думают, а кода тут не нада - он тотже как при вызове виртуальныйх функций - механизм един. Может я ошибаюсь, но на pure virtual функции, ставятся заглушки, которые могут потянуть за собой какой-то код exeptions, который за собой найдёт что потянуть. Не глядя на то, что ключ no-exceptions стоит — он на генерацию кода влияет, а не на то, что из библиотеки тянется.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
  |
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0
|
|
|