|
Embedded C++, Кто какие библиотеки использует? |
|
|
|
 |
Ответов
|
Oct 28 2010, 12:54
|

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

|
Я использую исключительно свои библиотеки. Писать их приходится всего один раз. Все проекты построены под одному и тому же шаблону, прототипу. Для процов, к которым нет нормального C++ компилятора и среду, построение аналогичное, но не такое красивое  Например, вот так выглядит весь 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).
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
Сообщений в этой теме
Сега 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|