Перейти к содержанию
    

свежак для арм

для 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. есть просьба к тем кто их может проверить - проверить компиллер и сообщить об успешности или наоборот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые Клен. Ваши архивы повреждены!

Пожалуйста, исправьте их!

Спасибо!

как Вы определили что архивы битые. я сейчас скачал и проверил, архивы целые. оба. мож компилятор не работает - это тогда не архивы виноваты а я чтото недоложил. укажите симптомы. и еще, если вы будите пытатся запустить бинарники для 64 битной винды из под 32 битной - то она скажет что файлы повреждены или не являются исполняймыми.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Пожалуйста, простите меня. После замены версии с нового вер. архиватора - все извлечено!

Изменено пользователем spasbyspas

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Клен, а ты делаешь сборки тулчейной для linux? или быть может выложишь исходники (исходники или патчи) с краткой инструкцией по самостоятельной сборке (опции сборки, ...) :) Меня интересует тулчейн для армов

Изменено пользователем dimay192

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема у меня таже, что у 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А потом - шаг влево, шаг вправо (даже при добавлении вызова ПУСТОЙ ф-ции) - захламляет флеха не пойми чем.
О каждом модуле, загруженном линкером, линкер отчитывается в map-файле - из-за какого символа модуль был загружен, и кто (какой модуль) на этот символ ссылался. Там же указаны все размеры всех загруженных в выходной файл секций. Как может быть "не пойми чем", если линкер отчитывается за каждый байт?

 

Как же мне вразумить компилятор не тащить то, че он не должен тащить (не нужны мне системные вызовы, обработчики исключений, ... - без них как то работал на MSP-шнике)?!!!!!!!!!!!!!!!
Во-первых, компилятор скорее всего ни при чем. Ссылки на системные вызовы, как правило, берутся из стандартных библиотек (в данном случае newlib). Вероятно, Вы используете библиотечные функции, требующие наличия системных вызовов, вот линкер их и подгружает.

Во-вторых, давайте разговаривать более предметно. Покажите ваш map-файл и перечислите модули, которые по вашему мнению не должны были загружаться линкером. Попробуем совместными усилиями разобраться, почему он это сделал. Без знания конкретных подробностей вряд ли можно сказать что-либо для Вас полезное.

 

С какими ключами можно собрать компилятор, чтобы тот размещал в памяти исключительно целевой код и самый минимум из необходимого, не относящегося к целевому коду?!!!!!!!!!!!!!!!
У меня компилятор всегда генерил только целевой код. Собираю как описано в документации.

На каком языке пишете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

 

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к на пустом месте.... нестыковачка гдето...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит такс:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

полюбому дайте исходник одним файлом , код методов выкиньте, тут явно видно что дело не в целевом коде а в C++ подтяжках.

 

нужно смотреть *.map и листинги - посмотреть что за код прилазит.

 

есть вариант что зачемто (нам это предстоит выяснить зачем) прилинковывается new delete которые могут использоватся внутренним кодом stdlibc++.

 

предоагаю еже один тесть - переопределите операторы new и delete - хотябы заглушки сделайте. Насколько я помню в stdlibc++ по умолчанию через new тянет свой стандартный аллокатор памяти - это жопа для микроконтроллеров, он страшный.... а вот если свой подсунуть в определении new то может эти 50кб и отвалятся... попробуйте.

 

а ведь интересные грабли имеем, не так ли коллеги?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а ведь интересные грабли имеем, не так ли коллеги?

Как скажете, маэстро.

 

(не смог сдержаться:))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит такс:

...

    virtual inline void softTimersDecrement(void)=0;

Кхм! Не устаю повторять :rolleyes:

Ну и от деструкторов, тем более виртуальных, в эмбеддед-приложениях, имхо, надо избавляться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кхм! Не устаю повторять :rolleyes:

Ну и от деструкторов, тем более виртуальных, в эмбеддед-приложениях, имхо, надо избавляться.

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

 

вопрос в дркгом - откуда стоько кода? пройтись по табличке VMT нужны такты и не так много как думают, а кода тут не нада - он тотже как при вызове виртуальныйх функций - механизм един.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вопрос в дркгом - откуда стоько кода? пройтись по табличке VMT нужны такты и не так много как думают, а кода тут не нада - он тотже как при вызове виртуальныйх функций - механизм един.
Может я ошибаюсь, но на pure virtual функции, ставятся заглушки, которые могут потянуть за собой какой-то код exeptions, который за собой найдёт что потянуть. Не глядя на то, что ключ no-exceptions стоит — он на генерацию кода влияет, а не на то, что из библиотеки тянется.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

логичное объяснение. можно предложить так - генерить вызов какого либо пользовательского обработчика. это будет не по стандарту но для контроллеров пойдет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...