SlideShare a Scribd company logo
1 of 23
Тихонов К.В.
Работа с прерываниями в микроконтроллерах
в 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 VHDLvitaliykulanov
 
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 EnvironmentIosif Itkin
 
C language lect_22_advanced
C language lect_22_advancedC language lect_22_advanced
C language lect_22_advancedRoman 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 ModelIosif 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-TraditionalMarketingZachary Stucki
 
Alcoholism and Recovery
Alcoholism and RecoveryAlcoholism and Recovery
Alcoholism and RecoveryMick Colabrese
 
Screenplay 1
Screenplay 1Screenplay 1
Screenplay 1E_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_BarnesJeffrey 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_manualAlfredo FR.
 
Google Traffic Tips, Tactics and Strategies
Google Traffic Tips, Tactics and StrategiesGoogle Traffic Tips, Tactics and Strategies
Google Traffic Tips, Tactics and StrategiesKokoshungsan Ltd.
 
Σενάριο Σ.Κούτσου Επιμόρφωση Β Επιπέδου
Σενάριο Σ.Κούτσου Επιμόρφωση Β ΕπιπέδουΣενάριο Σ.Κούτσου Επιμόρφωση Β Επιπέδου
Σενάριο Σ.Κούτσου Επιμόρφωση Β Επιπέδουskoutsu
 
LLAMADO PARA ARRENDAMIENTO
LLAMADO PARA ARRENDAMIENTOLLAMADO PARA ARRENDAMIENTO
LLAMADO PARA ARRENDAMIENTORenzo Paladino
 
Multivibrator bistabil
Multivibrator bistabilMultivibrator bistabil
Multivibrator bistabilUC Tidar
 
Chapter 1 - A Historical Overview
Chapter 1 - A Historical OverviewChapter 1 - A Historical Overview
Chapter 1 - A Historical Overviewlisajurs
 
Cuadro comparativo
Cuadro comparativoCuadro comparativo
Cuadro comparativoACRF15
 
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
 
SANJAY_ALAHAM_Resume_01.08.16
SANJAY_ALAHAM_Resume_01.08.16SANJAY_ALAHAM_Resume_01.08.16
SANJAY_ALAHAM_Resume_01.08.16Sanjay Alaham
 
CV-Vipin Verma.doc
CV-Vipin Verma.docCV-Vipin Verma.doc
CV-Vipin Verma.docVipin Verma
 

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 и inlineDEVTYPE
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
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.pptxrobete3065
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDDAleksei Alekseev
 
Навигация в Android без боли и слез
Навигация в Android без боли и слезНавигация в Android без боли и слез
Навигация в Android без боли и слезMobileUp
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 
Илья Фофанов "Обработка ошибок в 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();}) стандартный подход