реклама на сайте
подробности

 
 
> Embedded C++, Кто какие библиотеки использует?
segment
сообщение Oct 28 2010, 12:12
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 352
Регистрация: 10-08-06
Из: Санкт-Петербург
Пользователь №: 19 471



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

Само собой использование STL в программе под микроконтроллер сомнительно, так как, к примеру, работа с STL в Keil uVision 4 (видимо их порт STL) обходится в минимум 40 Кбайт (собрал пример из Keil examples). Поэтому выходом из этой ситуации вижу использование либо специальных готовых light библиотек либо написание базовых шаблонов/классов самому. Но так уже стадия "начинающий и все хочу попробовать" прошла уже давно, поэтому писать самому не сильно тянет.
Кто какие C++ библиотеки использует для работы с периферией и данными?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Forger
сообщение Oct 28 2010, 12:54
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Я использую исключительно свои библиотеки. Писать их приходится всего один раз.
Все проекты построены под одному и тому же шаблону, прототипу.
Для процов, к которым нет нормального C++ компилятора и среду, построение аналогичное, но не такое красивое sad.gif

Например, вот так выглядит весь main.cpp:
Код
#include "TApplication.h"

// Единственный экзэмпляр приложения
static TApplication application;

int main()
{
    application.run();
}

// Системный таймер для синхронизации приложения (период составляет ровно 1 мс)
extern "C" void SysTick_Handler()
{
    application.synchronize();
}


Заметьте - во всем проекте только один глобальный объект, да и тот виден только в main.cpp

Вот часть TApplication.h:
Код
#include "..\Target\TTargetSTM32.h"
#include "..\RTOS\RTOS_TNKernel.h"

.....

class TApplication
{
public:
    void run(void);
    inline void synchronize(void) { _rtos.synchronize(); }

    // для примера
    void LED_On(void) { _target.setPinToLOW(PORT_LED_RED, PIN_LED_RED); }    // Включить красный светодиод
    void LED_Off(void) { _target.setPinToHIGH(PORT_LED_RED, PIN_LED_RED); }    // Выключить красный светодиод

private:
    class TThreadDisplay : public TThread<THREAD_DISPLAY_STACK_SIZE, THREAD_DISPLAY_PRIORITY>
    {

        typedef UNSIGNED8 TCommand;    
        typedef UNSIGNED8 TData;
        typedef UNSIGNED8 TPositionX;
        typedef UNSIGNED8 TPositionY;
        typedef const char TChar;
    public:
        virtual void initialize(void * bodyArgument);
    private:
        virtual void body(void);
        void fill(TData);
        void gotoXY(TPositionX, TPositionY);
        void sendCommand(TCommand);
        void sendData(TData);
        void printChar(TChar);
        void printString(TChar*, TPositionX, TPositionY);
        THardwareSTM32 * _target;
    };

    class TThreadWatchDog : public TThread<THREAD_WATCH_DOG_STACK_SIZE, THREAD_WATCH_DOG_PRIORITY>
    {
        virtual void initialize(void * bodyArgument);
        virtual void body(void);
        THardwareSTM32 * _target;
    };

.......
    
private:
    TKernel                    _rtos;
    THardwareSTM32            _target;
    TThreadDisplay            _threadDisplay;

.....
};


Вот часть TApplication.cpp:
Код
void TApplication::TThreadWatchDog::initialize(void * bodyArgument)
{
    _target = (THardwareSTM32*)bodyArgument;
    _target->initializeWatchDogTimer(12); // Период сторожевого таймер 12 мс
}

void TApplication::TThreadWatchDog::body(void)
{
    _target->updateWatchDogTimer(); // Сбрасывать сторожевой таймер каждые 10 мс
    sleep(10);
}


Вот часть THardwareSTM32.h:
Код
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

......

typedef unsigned            UNSIGNED;
typedef unsigned char        UNSIGNED8;
typedef unsigned short        UNSIGNED16;
typedef unsigned int        UNSIGNED32;
typedef unsigned long long     UNSIGNED64;

typedef signed char            SIGNED8;
typedef signed short        SIGNED16;
typedef signed int            SIGNED32;
typedef signed long long     SIGNED64;

typedef float                FLOAT32;
typedef double                FLOAT62;

........

class THardwareSTM32
{
public:
    typedef UNSIGNED8    TInterruptChannel;
    typedef UNSIGNED8    TInterruptPreemptionPriority;
    typedef UNSIGNED8    TInterruptSubPriority;
    typedef UNSIGNED32    TSystemTimerPeriodMs;
    typedef UNSIGNED16    TWatchDogTimerPeriodMs;
    typedef UNSIGNED32    TUserTimerPeriodUs;
    typedef UNSIGNED8    TUserTimerChannel;

.....

    void reset(void);
    void initializeWatchDogTimer(TWatchDogTimerPeriodMs);
    void updateWatchDogTimer(void);

    void setSystemFrequency(TSystemFrequency);
    void initializeMainTimer(TSystemTimerPeriodMs);

    THardwareSTM32();
    ~THardwareSTM32() { reset(); }

....
    TSystemFrequency GetSystemFrequency() const { return(_systemFrequency); }

    void initializeUserTimer(TUserTimerChannel channel, TUserTimerPeriodUs periodUs);
    void userTimerInterruptHandler(TUserTimerChannel channel);

    void initializePIN(GPIO_TypeDef*, TGPIO_Pins, TGPIO_Mode, TGPIO_Speed);

    inline void setPinToHIGH(GPIO_TypeDef* GPIOx, TGPIO_Pins pin)
        { GPIOx->BSRR = pin; }

    inline void setPinToLOW(GPIO_TypeDef* GPIOx, TGPIO_Pins pin)
        { GPIOx->BRR = pin; }

    inline bool isPinHIGH(GPIO_TypeDef* GPIOx, TGPIO_Pins pin)
        { return((GPIOx->IDR & pin) != 0); }

    inline bool isPinLOW(GPIO_TypeDef* GPIOx, TGPIO_Pins pin)
        { return((GPIOx->IDR & pin) == 0); }
....
private:
    inline void disableAllInterrupts(void) { asm ("cpsid  I"); }
    inline void enableAllInterrupts(void) { asm ("cpsie  I"); }
.....
private:
    TSystemFrequency    _systemFrequency;
....
};


В итоге, аппартная, т.е. платформозависимая часть изолирована от основного кода - Application, RTOS, если используется - тоже изолирована от кода, поскольку RTOS - тоже отчасти платформозависима.
Глобальных переменных вообще нет! (кроме одной - типа TApplication, которую никто и "не видит"). Подобное построение я позаимствовал из старого-доброго Borland Builder C++. В принципе, по мне - у них задумка хорошая, но уж больно "тяжелая".
В итоге, как видите, получается легко сопровождаемый код. Каждая часть его может целиком использоваться в других проектах, т.к. другие проекты построены аналогично.
Шаблоны использую только свои, в них использую очень простые вещи.
А если проект большой, то такое пострение проекта позволяет четко разделить работу между людьми.
Потом, если позволяет время, можно легко оптимизировать куски низкоуровневого кода.
В принципе, весь проект целиком можно написать на ПК, а потом "подцепить" к нему соответствующий железу THardware и TKernel (RTOS).


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Oct 28 2010, 14:27
Сообщение #3


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(Forger @ Oct 28 2010, 07:54) *
В принципе, весь проект целиком можно написать на ПК, а потом "подцепить" к нему соответствующий железу THardware и TKernel (RTOS).

Я пишу на С, а поступаю точно также -- вся аапликушная часть кода пишется и отлаживается на PC. Просто вместо классов используются HAL модули, которые я подменяю при сборке на PC и для target платформы.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Сега   Embedded C++   Oct 28 2010, 12:12
- - scifi   Не знаю, насколько актуально, но вдруг пригодится:...   Oct 28 2010, 14:31
- - Petr_I   Цитата(Сега @ Oct 28 2010, 16:12) ... вых...   Oct 28 2010, 15:17
- - Сега   К моему удивлению, в Keil есть поддержка исключени...   Oct 28 2010, 18:02
|- - ig_z   QUOTE (Сега @ Oct 28 2010, 21:02) К моему...   Oct 28 2010, 19:07
- - beaRTS   А давайте помусолим uSTL (ссылка была раньше). 1....   Sep 4 2012, 09:28
- - Major   Использую для ARM (всех) компилятор C++ и очень до...   Sep 4 2012, 09:58
- - beaRTS   Спасибо! а на вопросы кто-нибудь прольет свет...   Sep 5 2012, 02:14
|- - Сергей Борщ   QUOTE (beaRTS @ Sep 5 2012, 05:14) Просто...   Sep 5 2012, 05:53
|- - beaRTS   Цитата(Сергей Борщ @ Sep 5 2012, 08:53) м...   Sep 5 2012, 07:21
- - Major   Использую и на 128КБайт и на 256МБайт (тут уже лин...   Sep 5 2012, 12:32
|- - beaRTS   Цитата(Major @ Sep 5 2012, 15:32) Зачем п...   Sep 5 2012, 14:53
- - haker_fox   Да, Си++ иногда тянет за собой кучу ненужного и тя...   Sep 5 2012, 23:51
|- - alx2   Цитата(haker_fox @ Sep 6 2012, 04:51) Да,...   Sep 7 2012, 05:16
|- - Marto   Цитата(alx2 @ Sep 7 2012, 10:16) А что им...   Sep 8 2012, 18:15
|- - haker_fox   QUOTE (alx2 @ Sep 7 2012, 14:16) Почему у...   Sep 9 2012, 00:58
|- - alx2   Цитата(haker_fox @ Sep 9 2012, 05:58) А в...   Sep 10 2012, 05:11
|- - haker_fox   QUOTE (alx2 @ Sep 10 2012, 13:11) Но Вы-т...   Sep 11 2012, 05:56
|- - haker_fox   В общем new (std::nothrow) объем кода не уменьшает...   Sep 12 2012, 13:54
|- - _Артём_   Цитата(haker_fox @ Sep 12 2012, 16:54) В ...   Sep 12 2012, 14:13
|- - AHTOXA   Цитата(haker_fox @ Sep 12 2012, 19:54) В ...   Sep 12 2012, 14:17
|- - haker_fox   QUOTE (AHTOXA @ Sep 12 2012, 22:17) Вообщ...   Sep 13 2012, 01:18
|- - AHTOXA   А если взять kgp? Или попробуйте скомпилировать пр...   Sep 13 2012, 02:33
||- - haker_fox   QUOTE (AHTOXA @ Sep 13 2012, 10:33) А есл...   Sep 13 2012, 04:20
||- - AHTOXA   Цитата(haker_fox @ Sep 13 2012, 10:20) Ва...   Sep 13 2012, 05:03
||- - haker_fox   QUOTE (AHTOXA @ Sep 13 2012, 13:03) И как...   Sep 13 2012, 05:08
||- - DmitryM   Цитата(AHTOXA @ Sep 13 2012, 09:03) ЗЫ. У...   Sep 13 2012, 05:20
|- - alx2   Цитата(haker_fox @ Sep 13 2012, 06:18) Во...   Sep 13 2012, 04:21
|- - haker_fox   QUOTE (alx2 @ Sep 13 2012, 12:21) Насколь...   Sep 13 2012, 05:01
|- - haker_fox   QUOTE (haker_fox @ Sep 13 2012, 13:01) Пр...   Sep 13 2012, 05:21
- - Major   Указатели на структуры - это практически когда воз...   Sep 6 2012, 01:37
|- - beaRTS   Цитата(Major @ Sep 6 2012, 05:37) Указате...   Sep 6 2012, 02:19
|- - haker_fox   QUOTE (Major @ Sep 6 2012, 09:37) Во встр...   Sep 6 2012, 03:25
|- - ReAl   Цитата(haker_fox @ Sep 6 2012, 06:25) В м...   Sep 6 2012, 07:35
- - Major   Ну про пути я говорить не буду Есть мнения что C+...   Sep 6 2012, 03:09
|- - beaRTS   Цитата(Major @ Sep 6 2012, 07:09) Есть мн...   Sep 6 2012, 04:23
|- - dxp   QUOTE (beaRTS @ Sep 6 2012, 11:23) чую - ...   Sep 6 2012, 06:59
|- - beaRTS   Цитата(dxp @ Sep 6 2012, 10:59) Да не, ни...   Sep 6 2012, 07:16
|- - sasamy   Цитата(dxp @ Sep 6 2012, 10:59) Да не, ни...   Sep 7 2012, 17:41
|- - dxp   QUOTE (sasamy @ Sep 8 2012, 00:41) Для чи...   Sep 8 2012, 02:49
|- - sasamy   Цитата(dxp @ Sep 8 2012, 06:49) Сегодня С...   Sep 9 2012, 22:30
- - Major   ЦитатаВот так и получается, что "поняв",...   Sep 6 2012, 05:10
- - halfdoom   Совсем не давно, после длительного обсуждения с за...   Sep 8 2012, 03:50
|- - dxp   А что это вот такое: CODEC++-code requires signifi...   Sep 8 2012, 05:54
|- - _Pasha   Цитата(dxp @ Sep 8 2012, 08:54) А что это...   Sep 8 2012, 09:14
||- - dxp   QUOTE (_Pasha @ Sep 8 2012, 16:14) Они по...   Sep 8 2012, 09:31
|- - halfdoom   Цитата(dxp @ Sep 8 2012, 08:54) Какой смы...   Sep 8 2012, 09:45
|- - dxp   QUOTE (halfdoom @ Sep 8 2012, 16:45) Эти ...   Sep 8 2012, 10:02
- - Major   Еще раз вмешаюсь. C++ это язык, возможности которо...   Sep 8 2012, 06:10
- - mikeT   Заинтересовало упоминание языка Ада в задачах, где...   Sep 8 2012, 10:33
|- - halfdoom   Цитата(mikeT @ Sep 8 2012, 13:33) SafetyC...   Sep 8 2012, 11:22
|- - SSerge   Цитата(mikeT @ Sep 8 2012, 17:33) и ниже ...   Sep 8 2012, 13:28
- - andrewlekar   Ada, насколько я знаю, очень хороший язык. Ну а er...   Sep 10 2012, 05:25
- - beaRTS   наткнулся на статью интересную Паттерны проектиров...   Oct 3 2012, 07:05
|- - kolobok0   Цитата(beaRTS @ Oct 3 2012, 11:05) ...кто...   Oct 5 2012, 09:56
|- - beaRTS   Цитата(kolobok0 @ Oct 5 2012, 13:56) И от...   Oct 8 2012, 04:34
|- - kolobok0   Цитата(beaRTS @ Oct 8 2012, 08:34) ...пат...   Oct 8 2012, 09:37
|- - beaRTS   Цитата(kolobok0 @ Oct 8 2012, 13:37) я о ...   Oct 8 2012, 09:54
- - globalist   C++ замечательный язык. Только надо уметь им польз...   Oct 9 2012, 21:26


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 31st July 2025 - 23:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01474 секунд с 7
ELECTRONIX ©2004-2016