Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » C & С++ применительно к embedded system (в догонку __libc_init_array)


C & С++ применительно к embedded system (в догонку __libc_init_array)

Сообщений 1 страница 15 из 15

1

Вот решил тоже тему открыть...

Вопросы к форумчанам
1. в каких случаях используют С++ в embedded разработках ? и пишет ли кто-нибудь их Вас на С++ ? поверхностно представляю различия этих языков ,но пока не совсем прикинул в каких проектах может понадобиться применять ООП в данной области или это сделано для того чтобы люди которые программируют desktop приложения легче себя чувствовали в МК разработке и не отказывались от привычных библиотек?

2.правильно ли я понимаю, что если С++ не используется, то я могу очистить линкер и стартап фаил от всяких штук типа __libc_init_array ?  c этой штукой что-то не хочет линковка проходить.

2

Если бы мне вдруг пришлось писать что-то большое на си, то обязательно использовал бы namespace, ну и компилировать пришлось бы уже на c++ )

3

В этом ведь и штука, что в нашей области что-то супер большое редко бывает и поэтому нет смысла в с++ . но возможность есть :)

4

Ну да, поэтому же я например не использую раздельную компиляцию - только прямые текстовые инклуды и никаких заморочек с хедерами )
А про c++, глянь если хочешь проект музыкальных инструментов из топика Интересные проекты, там автор очень аккуратно использует c++

5

Пишу на С++.
Удобно. Сейчас (ну я по себе меряю) доступны камни с достаточным количеством памяти, и можно особо не заморачиваться про размер.
За скорость работы - в местах, где она нужна - можно и ассемблерные вставки делать, если что, но это уже на крайняк, а так и обычной оптимизации компилятора хватает.
Ну я про себя написал. Может у кого и другое мнение. И оно может не совпадать с моим :)

6

Atomic-dm написал(а):

Вопросы к форумчанам
1. в каких случаях используют С++ в embedded разработках ? и пишет ли кто-нибудь их Вас на С++ ? поверхностно представляю различия этих языков ,но пока не совсем прикинул в каких проектах может понадобиться применять ООП в данной области или это сделано для того чтобы люди которые программируют desktop приложения легче себя чувствовали в МК разработке и не отказывались от привычных библиотек?

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

Atomic-dm написал(а):

2.правильно ли я понимаю, что если С++ не используется, то я могу очистить линкер и стартап фаил от всяких штук типа __libc_init_array ?  c этой штукой что-то не хочет линковка проходить.

Можно и с С++ многое повыкидывать, правда не всегда прокатывает. Можно всю канитель с размоткой стека при исключениях выкинуть, так как вам все равно проц ресетить в этом случае, и размотка стека может помочь только в случае, если вы сможете каким то образом выдать это все на куда нибудь в виде отладочной информации, чтоб посмотреть. Я так до сих пор и не смог найти нормального способа размотки стека программы, при попадании в HardFaultHandler, так как стандартные функции Unwind* работают с текущим стеком, а не со стеком программы, и потому не видят ничего уже. Надо будет попробовать пошерстить на эту тему интернет, может уже нашли способ.

7

Ну если брать в расчет МК с достаточными вычислительными ресурсами, то ООП я могу представить, но если брать достаточно простые МК с небольшим количеством оперативки и памяти, то мне очень трудно представить как там ООП применять...

вообще конечно очень любопытно услышать разные мнения.  всегда можно что-то полезное для себя уяснить. :)

8

Не ну понятно, что на AVRках 8и битных С++ лучше не стоит использовать из-за ограниченности ресурсов (хотя кто то умудрялся на Меге 128й его поднять), но на ARMах, как по мне, С++ самое то, что нужно.

9

Использование c++, версия lite )
Итоговый бинарник чуть больше 1K

main.cc

Код:
#include "stm32f103xx.h"
#include "stm32f103xx.cc"
gpio::pin_t led1 = {GPIOB, 12};
extern "C" {
    void SystemInit () {
        rcc::hsi48();
        rcc::iopben( 1 );
        systick::init( 10000 );
        gpio::pininit( &led1, gpio::pp2 );
    }
    void SysTick_Handler () {
        gpio::pinset( &led1, systick::test() & 1<<11 );
    }
}
int main () {
    while (1) {
    }
}

stm32f103xx.cc

Свернутый текст
Код:
namespace rcc {
volatile struct {uint32_t ahb, apb1, apb2;} f = {8000000, 8000000, 8000000};
void hsi48 () {
    RCC->CFGR_b.PLLMUL = 10;
    RCC->CFGR_b.PPRE1 = 4;
    RCC->CFGR_b.OTGFSPRE = 1;
    while (!RCC->CR_b.PLLRDY) RCC->CR_b.PLLON = 1;
    FLASH->ACR = 0x11;
    RCC->CFGR_b.SW = 2;
    f.ahb  = 48000000;
    f.apb1 = 24000000;
    f.apb2 = 48000000;
}
void iopben (uint32_t v) {
    RCC->APB2ENR_b.IOPBEN = v;
}
}
namespace systick {
volatile uint32_t n, v;
void init (uint32_t f) {
    SysTick->LOAD = rcc::f.ahb/f-1;
    SysTick->CTRL = 7;
    n = 0;
    v = 0xFFFFFFFF;
}
uint32_t test () {
    if (SysTick->VAL < v) v = SysTick->VAL;
    return n++;
}
}
namespace gpio {
typedef const struct {GPIOA_Type* p; uint32_t n;} pin_t;
typedef enum {
    ai = 0x0,  pp10 = 0x1,  pp2 = 0x2,  pp50 = 0x3,
    fi = 0x4,  od10 = 0x5,  od2 = 0x6,  od50 = 0x7,
    pi = 0x8, app10 = 0x9, app2 = 0xA, app50 = 0xB,
              aod10 = 0xD, aod2 = 0xE, aod50 = 0xF
} mode_t;
void pininit (pin_t* pin, mode_t mode) {
    uint32_t n = 4*pin->n;
    if (pin->n < 8) {
        pin->p->CRL = (pin->p->CRL & ~(0xF<<n)) | mode<<n;
    } else if (pin->n < 16) {
        n -= 32;
        pin->p->CRH = (pin->p->CRH & ~(0xF<<n)) | mode<<n;
    }
}
void pinset (pin_t* pin, uint32_t v) {
    pin->p->BSRR = (v?1:0x10000)<<pin->n;
}
}

10

Не считаю С++ удобным ЯП. Все пишу на С: как прошивки микроконтроллеров, так и что-нибудь для ПК (в т.ч. сетевые/веб сервисы): https://github.com/eddyem/

11

Предыдущий свой пост про "c++ lite" я тут в шутку написал, но потом как-то постепенно всерьёз перешёл на такой стиль, не только для нового, но и старое многое переделал

12

MasterAlexei написал(а):

Я так до сих пор и не смог найти нормального способа размотки стека программы

Ради Вас зарегистрировался. А чем вы дебажите? В GDB вроде стек разматывается, интересно просто "на сколько" вам его размотать то нужно?

Atomic-dm написал(а):

в каких случаях используют С++

C++ можно использовать всегда, вопрос что именно использовать из плюсов? malloc? string? cout? или же просто организовывать функции в классы для удобства? Если сильно не погружаться в ООП то плюсы весьма полезны и совсем не раздувают бинарник, везде нужно меру знать.

Atomic-dm написал(а):

очистить линкер и стартап фаил от всяких штук типа __libc_init_array

Мой стартап очищен от таких штук а так же от SystemInit тоже, и плюсы воспринимает нормально. Естественно я не пользуюсь стандартными функциями типа *printf malloc и т.п. считаю их абсолютным злом еще со времен AVR.

13

насколько я понимаю __libc_init_array инициализирует экземпляры классов как его можно выбросить из проекта. (смотрел в пошаговом режиме).

14

__libc_init_array там вроде и не фигурирует(стартап файл), только libc да вызов SystemInit, остальное возможно CMSIS тянет, еще у меня в мэйкфйле:

Код:
#GCC config
#-------------------------------------------------------------------------------
CFLAGS += -mthumb $(MCU)
CFLAGS += -mfloat-abi=soft
CFLAGS += -Wall -pedantic
CFLAGS += $(OPT)
CFLAGS += -Wall -fmessage-length=0
CFLAGS += -ffunction-sections -fdata-sections
CFLAGS += $(addprefix -I, $(INCLUDES))
CFLAGS += $(addprefix -D, $(DEFINES))
#-------------------------------------------------------------------------------


#For C only
#-------------------------------------------------------------------------------
FLAGS  = -std=gnu99
#-------------------------------------------------------------------------------
#For C++ only
#-------------------------------------------------------------------------------
CXXFL  = -std=c++14 -fno-exceptions -fno-rtti
#-------------------------------------------------------------------------------

вот такие флаги компилятора. Что он там тянет смотреть лениво.

Отредактировано CoBa31Rus (2018-05-27 22:08:22)

15

я еще такую штуку компилятору в конце скармливаю
LD_FLAGS += -Wl,--print-memory-usage
тоже хорошая штука


Вы здесь » Микроконтроллеры » Архив » C & С++ применительно к embedded system (в догонку __libc_init_array)