SlideShare a Scribd company logo
Тихонов К.В.
Работа с прерываниями в микроконтроллерах
в 21 веке.
Структура доклада
Главные проблемы
Уровень представления прерывания
(interrupt managers)
Уровень объектов, имеющих в себе методы,
являющиеся прерываниями.
Сам пример
Плюсы и минусы
Главные проблемы:
Вектор прерывания стандартно не
масштабируем
Вектор прерывания один, объектов много
В вектор прерывания нельзя передать
параметр, функция реализующая
прерывание узнает все из глобальных
переменных.
Стандартный подход
void __attribute__ ((weak, alias ("Default_Handler")))
TIM2_IRQHandler(void);
extern "C" void TIM2_IRQHandler(void) {
Led1Up();
FlagLed=1;
}
void Led1Up(void)
{
Bla bla bla
}
● Плюсы
Быстро
● Минусы
Нельзя менять на ходу
Никакая инкапсуляция
нужная глобальная переменная
при нескольких источниках прерывания по
одному вектору, нужно проверять все
Массив с указателями
typedef void (*pHandlerPointer_t)();
pHandlerPointer_t volatile IsrVectors[81]
extern "C" void TIM2_IRQHandler(void) {
IsrVectors[TIM2_IRQHandler]();
};
void AddHandler(pHandlerPointer_t handler, IRQn_Type irq) {
IsrVectors[irq] = handler;
}
Он же в статическом классе
class InterruptManager {
private:
static pHandlerPointer_t volatile IsrVectors[81];
public:
static void DefaultHandler(void) {asm volatile("nop"::);};
static void AddHandler(pHandlerPointer_t handler, IRQn_Type irq)
{IsrVectors[irq] = handler;};
static void RemoveHanlder(IRQn_Type irq) {IsrVectors[irq] =
DefaultHandler;};
static void Raise(IRQn_Type irq) {IsrVectors[irq]();};
};
InterruptManager::AddHandler(MyFuncton,TIM2_IRQHandler);
● Плюсы
Можем менять на ходу.
● Минусы
Нельзя указать вектором прерывания ничего
кроме void*.
Все еще требуются глобальные
переменные.
Смещение таблицы прерываний в
оперативную память
void remap_vector_table (void)
{
if (SCB->VTOR)return;
memcpy ((void*) IsrVectors, (void*) SCB->VTOR, sizeof IsrVectors);
__disable_irq();
SCB->VTOR = (uint32_t) (IsrVectors);
__DSB ();
__enable_irq();
__ISB();
}
● Плюсы
То же самое, что и предыдущий метод, но
указатель на функцию это и есть вектор, что
убирает косвенный вызов.
● Минусы
Нельзя указать вектором прерывания ничего
кроме void*.
Применимо только в Cortex M3,M4,M7,M0+
Все еще требуются глобальные
переменные.
Массив из std::function
class InterruptManager {
public:
static void DefaultHandler(void) {asm volatile("nop"::);};
static std::function<void()> IsrVectors[81];
static void AddHandler(std::function<void()> handler, IRQn_Type irq)
{IsrVectors[irq]=handler;};
static void RemoveHanlder(IRQn_Type irq)
{IsrVectors[irq]=defaultHandlerfunctor; };
static void Raise(IRQn_Type irq) {IsrVectors[irq]();};
private:
static std::function<void()> defaultHandlerfunctor;
};
extern "C" void TIM2_IRQHandler(void) {
InterruptManager::Raise[TIM2_IRQHandler]();
};
● Плюсы
Можно вызывать все что угодно функции с
параметрами,лямбды ,методы у классов.
и.т.п.
std::function<void()> Display42OnLCD = []() { lcd.write(42,4); };
std::function<void()> Testfunctor = [&]() { this->testmethod(); };
InterruptManager::AddHandler(Display42OnLCD,TIM2_IRQn);
InterruptManager::AddHandler(Testfunctor,TIM3_IRQn);
Теперь не нужны глобальные переменные
● Минусы
Виртуальный вызов
Каждое аллоцирование std::function
использует динамическое выделение памяти
Пойдем на уровень выше
Не хотим решать проблему наличия
глобальных переменных на столь низком
уровне проектирования.
Считаем, что interruptManager уже
реализован.
Статический метод класса и
статическая переменная
возвращающая thisclass Clock
{
public:
Clock():pThis(this){}
static void StaticIrq(void) {pThis->Irq();}
void SetActiveIrq(void) {pThis=this;}
private:
void Irq(void);
static Clock *pThis;
}
InterruptManager::AddHandler(Clock::StaticIrq,TIM3_IRQn);
● Плюсы
Мы избавились от глобальных переменных,
без std::function
Можно указывать какой класс сейчас
активен и примет сейчас управление
прерывания.
Минусы
Добавляем косвенный вызов
Observer Pattern
class Interruptable
{
public:
Interruptable();
virtual ~Interruptable();
virtual void interruptHandle(void){};
};
class Clock: public Interruptable
…
class Timer: public Interruptable
class InterruptSubject{
public:
InterruptSubject(){}
void IrqHandle(){
for(size_t i = 0; i < MAX_INTERRUPTS; i++){
if(ArrayOfInterruptClasses[i]!=NULL)
ArrayOfInterruptClasses[i]->interruptHandle();
};}
void SetInterrupt(Interruptable * pInterrupt);
void RemoveInterrupt(Interruptable * pInterrupt);
private:
Interruptable* ArrayOfInterruptClasses[MAX_INTERRUPTS];
};
● Плюсы
Масштабируемо
Гибко
● Минусы
При системе один экземпляра класса
InterruptSubject на один вектор прерывания,
невозможно сделать IrqHandle статическим,
что позволяет использовать его только с
массивом std::function
Шаблонизированный Observer
Pattern
template <IRQn_Type irqN>
class InterruptSubject{
public:
InterruptSubject(){}
static void IrqHandle(){
for(int i = 0; i < MAX_INTERRUPTS; i++){
if(ArrayOfInterruptClasses[i]!=NULL)
ArrayOfInterruptClasses[i]->interruptHandle();};
}
static void SetVector(){InterruptManager::AddHandler(IrqHandle,irqN);};
static void SetInterrupt(Interruptable * pInterrupt);
static void RemoveInterrupt(Interruptable * pInterrupt);
private:static Interruptable* ArrayOfInterruptClasses[MAX_INTERRUPTS];
● Плюсы
Все то же самое, что и стандартный
observer, но у каждого прерывания
находится свой статический массив
указателей на функции, что позволило
сделать методы вызова прерывания
статическим (можно менять на лету в
оперативной памяти)
● Минусы
НЕТ :)
Осталось за кадром
● Mbed interrupt manager
(синглтон с самодельным связным списком
который хранит и указатели void* и указатель
на обьект, если это метод объекта)
● Статья с Embedded.com
Interrupts in C++
Arduino TimerOne lib
TimerOne Timer1; глобальный таймер
ISR(TIMER1_OVF_vect) {Timer1.isrCallback();}) стандартный подход
Вопросы

More Related Content

What's hot

Subprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDLSubprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDL
vitaliykulanov
 
TMPA-2015: Multi-Module Application Tracing in z/OS Environment
TMPA-2015: Multi-Module Application Tracing in z/OS EnvironmentTMPA-2015: Multi-Module Application Tracing in z/OS Environment
TMPA-2015: Multi-Module Application Tracing in z/OS Environment
Iosif Itkin
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
Roman Brovko
 
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
Iosif Itkin
 
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Dmytro Mindra
 
Test Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream ModelTest Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream Model
Iosif Itkin
 

What's hot (7)

Subprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDLSubprograms in VHDL, Procedures in VHDL
Subprograms in VHDL, Procedures in VHDL
 
Step 2
Step 2Step 2
Step 2
 
TMPA-2015: Multi-Module Application Tracing in z/OS Environment
TMPA-2015: Multi-Module Application Tracing in z/OS EnvironmentTMPA-2015: Multi-Module Application Tracing in z/OS Environment
TMPA-2015: Multi-Module Application Tracing in z/OS Environment
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advanced
 
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
TMPA-2015: Standards and Standartization in Program Engineering. Why Would Yo...
 
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
Тестируем код с Visual Studio 2012 - XP Days Ukraine 2012
 
Test Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream ModelTest Set Generation Based on a Management Stream Model
Test Set Generation Based on a Management Stream Model
 

Viewers also liked

BrandingHopeBuildingS2LThroughNon-TraditionalMarketing
BrandingHopeBuildingS2LThroughNon-TraditionalMarketingBrandingHopeBuildingS2LThroughNon-TraditionalMarketing
BrandingHopeBuildingS2LThroughNon-TraditionalMarketing
Zachary Stucki
 
Alcoholism and Recovery
Alcoholism and RecoveryAlcoholism and Recovery
Alcoholism and Recovery
Mick Colabrese
 
Screenplay 1
Screenplay 1Screenplay 1
Screenplay 1
E_1
 
Municipal Perspectives for Renewable Energy Adoption_Barnes
Municipal Perspectives for Renewable Energy Adoption_BarnesMunicipal Perspectives for Renewable Energy Adoption_Barnes
Municipal Perspectives for Renewable Energy Adoption_Barnes
Jeffrey S. Barnes
 
Ts 590 s-usb_audio_settings_manual
Ts 590 s-usb_audio_settings_manualTs 590 s-usb_audio_settings_manual
Ts 590 s-usb_audio_settings_manual
Alfredo FR.
 
Google Traffic Tips, Tactics and Strategies
Google Traffic Tips, Tactics and StrategiesGoogle Traffic Tips, Tactics and Strategies
Google Traffic Tips, Tactics and Strategies
Kokoshungsan Ltd.
 
Σενάριο Σ.Κούτσου Επιμόρφωση Β Επιπέδου
Σενάριο Σ.Κούτσου Επιμόρφωση Β ΕπιπέδουΣενάριο Σ.Κούτσου Επιμόρφωση Β Επιπέδου
Σενάριο Σ.Κούτσου Επιμόρφωση Β Επιπέδου
skoutsu
 
LLAMADO PARA ARRENDAMIENTO
LLAMADO PARA ARRENDAMIENTOLLAMADO PARA ARRENDAMIENTO
LLAMADO PARA ARRENDAMIENTO
Renzo Paladino
 
IBSA - Capter les disparités territoriales du boom démographique bruxellois /...
IBSA - Capter les disparités territoriales du boom démographique bruxellois /...IBSA - Capter les disparités territoriales du boom démographique bruxellois /...
IBSA - Capter les disparités territoriales du boom démographique bruxellois /...
Institut Bruxellois de Statistique et d'Anlayse - Brussels Instituut voor Statistiek en Analyse
 
Tarea 8
Tarea 8Tarea 8
Tarea 8
quirosgomez
 
Robbert Hock - Advanced Sitecore Rocks
Robbert Hock - Advanced Sitecore RocksRobbert Hock - Advanced Sitecore Rocks
Robbert Hock - Advanced Sitecore Rocks
NordicSitecoreConference
 
Multivibrator bistabil
Multivibrator bistabilMultivibrator bistabil
Multivibrator bistabil
UC Tidar
 
Chapter 1 - A Historical Overview
Chapter 1 - A Historical OverviewChapter 1 - A Historical Overview
Chapter 1 - A Historical Overview
lisajurs
 
Cuadro comparativo
Cuadro comparativoCuadro comparativo
Cuadro comparativo
ACRF15
 
Tarea 3
Tarea 3Tarea 3
Tarea 3
quirosgomez
 
Presentacion fundamentos del derecho empresarial fuentes y fundamentos del ...
Presentacion fundamentos del derecho empresarial   fuentes y fundamentos del ...Presentacion fundamentos del derecho empresarial   fuentes y fundamentos del ...
Presentacion fundamentos del derecho empresarial fuentes y fundamentos del ...
ACRF15
 
Tarea 4
Tarea 4Tarea 4
Tarea 4
quirosgomez
 
SANJAY_ALAHAM_Resume_01.08.16
SANJAY_ALAHAM_Resume_01.08.16SANJAY_ALAHAM_Resume_01.08.16
SANJAY_ALAHAM_Resume_01.08.16
Sanjay Alaham
 
CV-Vipin Verma.doc
CV-Vipin Verma.docCV-Vipin Verma.doc
CV-Vipin Verma.doc
Vipin Verma
 
Peptic ulcer
Peptic ulcerPeptic ulcer
Peptic ulcer
Pirah Azadi
 

Viewers also liked (20)

BrandingHopeBuildingS2LThroughNon-TraditionalMarketing
BrandingHopeBuildingS2LThroughNon-TraditionalMarketingBrandingHopeBuildingS2LThroughNon-TraditionalMarketing
BrandingHopeBuildingS2LThroughNon-TraditionalMarketing
 
Alcoholism and Recovery
Alcoholism and RecoveryAlcoholism and Recovery
Alcoholism and Recovery
 
Screenplay 1
Screenplay 1Screenplay 1
Screenplay 1
 
Municipal Perspectives for Renewable Energy Adoption_Barnes
Municipal Perspectives for Renewable Energy Adoption_BarnesMunicipal Perspectives for Renewable Energy Adoption_Barnes
Municipal Perspectives for Renewable Energy Adoption_Barnes
 
Ts 590 s-usb_audio_settings_manual
Ts 590 s-usb_audio_settings_manualTs 590 s-usb_audio_settings_manual
Ts 590 s-usb_audio_settings_manual
 
Google Traffic Tips, Tactics and Strategies
Google Traffic Tips, Tactics and StrategiesGoogle Traffic Tips, Tactics and Strategies
Google Traffic Tips, Tactics and Strategies
 
Σενάριο Σ.Κούτσου Επιμόρφωση Β Επιπέδου
Σενάριο Σ.Κούτσου Επιμόρφωση Β ΕπιπέδουΣενάριο Σ.Κούτσου Επιμόρφωση Β Επιπέδου
Σενάριο Σ.Κούτσου Επιμόρφωση Β Επιπέδου
 
LLAMADO PARA ARRENDAMIENTO
LLAMADO PARA ARRENDAMIENTOLLAMADO PARA ARRENDAMIENTO
LLAMADO PARA ARRENDAMIENTO
 
IBSA - Capter les disparités territoriales du boom démographique bruxellois /...
IBSA - Capter les disparités territoriales du boom démographique bruxellois /...IBSA - Capter les disparités territoriales du boom démographique bruxellois /...
IBSA - Capter les disparités territoriales du boom démographique bruxellois /...
 
Tarea 8
Tarea 8Tarea 8
Tarea 8
 
Robbert Hock - Advanced Sitecore Rocks
Robbert Hock - Advanced Sitecore RocksRobbert Hock - Advanced Sitecore Rocks
Robbert Hock - Advanced Sitecore Rocks
 
Multivibrator bistabil
Multivibrator bistabilMultivibrator bistabil
Multivibrator bistabil
 
Chapter 1 - A Historical Overview
Chapter 1 - A Historical OverviewChapter 1 - A Historical Overview
Chapter 1 - A Historical Overview
 
Cuadro comparativo
Cuadro comparativoCuadro comparativo
Cuadro comparativo
 
Tarea 3
Tarea 3Tarea 3
Tarea 3
 
Presentacion fundamentos del derecho empresarial fuentes y fundamentos del ...
Presentacion fundamentos del derecho empresarial   fuentes y fundamentos del ...Presentacion fundamentos del derecho empresarial   fuentes y fundamentos del ...
Presentacion fundamentos del derecho empresarial fuentes y fundamentos del ...
 
Tarea 4
Tarea 4Tarea 4
Tarea 4
 
SANJAY_ALAHAM_Resume_01.08.16
SANJAY_ALAHAM_Resume_01.08.16SANJAY_ALAHAM_Resume_01.08.16
SANJAY_ALAHAM_Resume_01.08.16
 
CV-Vipin Verma.doc
CV-Vipin Verma.docCV-Vipin Verma.doc
CV-Vipin Verma.doc
 
Peptic ulcer
Peptic ulcerPeptic ulcer
Peptic ulcer
 

Similar to тихонов кв работа с прерываниями в микроконтроллерах в 21 веке

C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
Igor Shkulipa
 
ук 03.001.02 2011
ук 03.001.02 2011ук 03.001.02 2011
ук 03.001.02 2011etyumentcev
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline
DEVTYPE
 
TeaVM: dead code elimination and devirtualization
TeaVM: dead code elimination and devirtualizationTeaVM: dead code elimination and devirtualization
TeaVM: dead code elimination and devirtualization
Алексей Андреев
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
Platonov Sergey
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
Sergey Teplyakov
 
CodeFest 2013. Козлов А. — Автоматизация тестирования веб-приложений с исполь...
CodeFest 2013. Козлов А. — Автоматизация тестирования веб-приложений с исполь...CodeFest 2013. Козлов А. — Автоматизация тестирования веб-приложений с исполь...
CodeFest 2013. Козлов А. — Автоматизация тестирования веб-приложений с исполь...CodeFest
 
Jenkins Imperative Pipeline vs Declarative Pipeline
Jenkins Imperative Pipeline vs Declarative Pipeline Jenkins Imperative Pipeline vs Declarative Pipeline
Jenkins Imperative Pipeline vs Declarative Pipeline
Кирилл Толкачёв
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Sergey Platonov
 
04 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_104 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_1921519
 
Организация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данныхОрганизация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данных
CodeFest
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptx
robete3065
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDD
Aleksei Alekseev
 
Навигация в Android без боли и слез
Навигация в Android без боли и слезНавигация в Android без боли и слез
Навигация в Android без боли и слез
MobileUp
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
etyumentcev
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
Eugeniy Tyumentcev
 
Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"
Yulia Tsisyk
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
Yandex
 

Similar to тихонов кв работа с прерываниями в микроконтроллерах в 21 веке (20)

C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.C++ STL & Qt. Занятие 10.
C++ STL & Qt. Занятие 10.
 
ук 03.001.02 2011
ук 03.001.02 2011ук 03.001.02 2011
ук 03.001.02 2011
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline
 
TeaVM: dead code elimination and devirtualization
TeaVM: dead code elimination and devirtualizationTeaVM: dead code elimination and devirtualization
TeaVM: dead code elimination and devirtualization
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
CodeFest 2013. Козлов А. — Автоматизация тестирования веб-приложений с исполь...
CodeFest 2013. Козлов А. — Автоматизация тестирования веб-приложений с исполь...CodeFest 2013. Козлов А. — Автоматизация тестирования веб-приложений с исполь...
CodeFest 2013. Козлов А. — Автоматизация тестирования веб-приложений с исполь...
 
Jenkins Imperative Pipeline vs Declarative Pipeline
Jenkins Imperative Pipeline vs Declarative Pipeline Jenkins Imperative Pipeline vs Declarative Pipeline
Jenkins Imperative Pipeline vs Declarative Pipeline
 
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++ Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
 
04 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_104 ос взаимодействие_процессов_1
04 ос взаимодействие_процессов_1
 
Организация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данныхОрганизация процесса регулярной обработки больших объемов данных
Организация процесса регулярной обработки больших объемов данных
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
АРК-ПЗ-1.pptx
АРК-ПЗ-1.pptxАРК-ПЗ-1.pptx
АРК-ПЗ-1.pptx
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDD
 
Навигация в Android без боли и слез
Навигация в Android без боли и слезНавигация в Android без боли и слез
Навигация в Android без боли и слез
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"Илья Фофанов "Обработка ошибок в C#"
Илья Фофанов "Обработка ошибок в C#"
 
Григорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммыГригорий Демченко — Асинхронное программирование и сопрограммы
Григорий Демченко — Асинхронное программирование и сопрограммы
 

тихонов кв работа с прерываниями в микроконтроллерах в 21 веке

  • 1. Тихонов К.В. Работа с прерываниями в микроконтроллерах в 21 веке.
  • 2. Структура доклада Главные проблемы Уровень представления прерывания (interrupt managers) Уровень объектов, имеющих в себе методы, являющиеся прерываниями. Сам пример Плюсы и минусы
  • 3. Главные проблемы: Вектор прерывания стандартно не масштабируем Вектор прерывания один, объектов много В вектор прерывания нельзя передать параметр, функция реализующая прерывание узнает все из глобальных переменных.
  • 4. Стандартный подход void __attribute__ ((weak, alias ("Default_Handler"))) TIM2_IRQHandler(void); extern "C" void TIM2_IRQHandler(void) { Led1Up(); FlagLed=1; } void Led1Up(void) { Bla bla bla }
  • 5. ● Плюсы Быстро ● Минусы Нельзя менять на ходу Никакая инкапсуляция нужная глобальная переменная при нескольких источниках прерывания по одному вектору, нужно проверять все
  • 6. Массив с указателями typedef void (*pHandlerPointer_t)(); pHandlerPointer_t volatile IsrVectors[81] extern "C" void TIM2_IRQHandler(void) { IsrVectors[TIM2_IRQHandler](); }; void AddHandler(pHandlerPointer_t handler, IRQn_Type irq) { IsrVectors[irq] = handler; }
  • 7. Он же в статическом классе class InterruptManager { private: static pHandlerPointer_t volatile IsrVectors[81]; public: static void DefaultHandler(void) {asm volatile("nop"::);}; static void AddHandler(pHandlerPointer_t handler, IRQn_Type irq) {IsrVectors[irq] = handler;}; static void RemoveHanlder(IRQn_Type irq) {IsrVectors[irq] = DefaultHandler;}; static void Raise(IRQn_Type irq) {IsrVectors[irq]();}; }; InterruptManager::AddHandler(MyFuncton,TIM2_IRQHandler);
  • 8. ● Плюсы Можем менять на ходу. ● Минусы Нельзя указать вектором прерывания ничего кроме void*. Все еще требуются глобальные переменные.
  • 9. Смещение таблицы прерываний в оперативную память void remap_vector_table (void) { if (SCB->VTOR)return; memcpy ((void*) IsrVectors, (void*) SCB->VTOR, sizeof IsrVectors); __disable_irq(); SCB->VTOR = (uint32_t) (IsrVectors); __DSB (); __enable_irq(); __ISB(); }
  • 10. ● Плюсы То же самое, что и предыдущий метод, но указатель на функцию это и есть вектор, что убирает косвенный вызов. ● Минусы Нельзя указать вектором прерывания ничего кроме void*. Применимо только в Cortex M3,M4,M7,M0+ Все еще требуются глобальные переменные.
  • 11. Массив из std::function class InterruptManager { public: static void DefaultHandler(void) {asm volatile("nop"::);}; static std::function<void()> IsrVectors[81]; static void AddHandler(std::function<void()> handler, IRQn_Type irq) {IsrVectors[irq]=handler;}; static void RemoveHanlder(IRQn_Type irq) {IsrVectors[irq]=defaultHandlerfunctor; }; static void Raise(IRQn_Type irq) {IsrVectors[irq]();}; private: static std::function<void()> defaultHandlerfunctor; }; extern "C" void TIM2_IRQHandler(void) { InterruptManager::Raise[TIM2_IRQHandler](); };
  • 12. ● Плюсы Можно вызывать все что угодно функции с параметрами,лямбды ,методы у классов. и.т.п. std::function<void()> Display42OnLCD = []() { lcd.write(42,4); }; std::function<void()> Testfunctor = [&]() { this->testmethod(); }; InterruptManager::AddHandler(Display42OnLCD,TIM2_IRQn); InterruptManager::AddHandler(Testfunctor,TIM3_IRQn); Теперь не нужны глобальные переменные
  • 13. ● Минусы Виртуальный вызов Каждое аллоцирование std::function использует динамическое выделение памяти
  • 14. Пойдем на уровень выше Не хотим решать проблему наличия глобальных переменных на столь низком уровне проектирования. Считаем, что interruptManager уже реализован.
  • 15. Статический метод класса и статическая переменная возвращающая thisclass Clock { public: Clock():pThis(this){} static void StaticIrq(void) {pThis->Irq();} void SetActiveIrq(void) {pThis=this;} private: void Irq(void); static Clock *pThis; } InterruptManager::AddHandler(Clock::StaticIrq,TIM3_IRQn);
  • 16. ● Плюсы Мы избавились от глобальных переменных, без std::function Можно указывать какой класс сейчас активен и примет сейчас управление прерывания. Минусы Добавляем косвенный вызов
  • 17. Observer Pattern class Interruptable { public: Interruptable(); virtual ~Interruptable(); virtual void interruptHandle(void){}; }; class Clock: public Interruptable … class Timer: public Interruptable
  • 18. class InterruptSubject{ public: InterruptSubject(){} void IrqHandle(){ for(size_t i = 0; i < MAX_INTERRUPTS; i++){ if(ArrayOfInterruptClasses[i]!=NULL) ArrayOfInterruptClasses[i]->interruptHandle(); };} void SetInterrupt(Interruptable * pInterrupt); void RemoveInterrupt(Interruptable * pInterrupt); private: Interruptable* ArrayOfInterruptClasses[MAX_INTERRUPTS]; };
  • 19. ● Плюсы Масштабируемо Гибко ● Минусы При системе один экземпляра класса InterruptSubject на один вектор прерывания, невозможно сделать IrqHandle статическим, что позволяет использовать его только с массивом std::function
  • 20. Шаблонизированный Observer Pattern template <IRQn_Type irqN> class InterruptSubject{ public: InterruptSubject(){} static void IrqHandle(){ for(int i = 0; i < MAX_INTERRUPTS; i++){ if(ArrayOfInterruptClasses[i]!=NULL) ArrayOfInterruptClasses[i]->interruptHandle();}; } static void SetVector(){InterruptManager::AddHandler(IrqHandle,irqN);}; static void SetInterrupt(Interruptable * pInterrupt); static void RemoveInterrupt(Interruptable * pInterrupt); private:static Interruptable* ArrayOfInterruptClasses[MAX_INTERRUPTS];
  • 21. ● Плюсы Все то же самое, что и стандартный observer, но у каждого прерывания находится свой статический массив указателей на функции, что позволило сделать методы вызова прерывания статическим (можно менять на лету в оперативной памяти) ● Минусы НЕТ :)
  • 22. Осталось за кадром ● Mbed interrupt manager (синглтон с самодельным связным списком который хранит и указатели void* и указатель на обьект, если это метод объекта) ● Статья с Embedded.com Interrupts in C++ Arduino TimerOne lib TimerOne Timer1; глобальный таймер ISR(TIMER1_OVF_vect) {Timer1.isrCallback();}) стандартный подход