Easyelectronics.ru

Электроника для всех
Текущее время: 26 май 2020, 00:00

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу Пред.  1, 2, 3, 4  След.
Автор Сообщение
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 09:02 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 485
По поводу new и delete.

Лобовая перегрузка с использованием механизмов FreeRTOS чревата серьёзной потерей производительности. Как справедливо кто-то заметил выше, компилятор строит код, в котором будут неявные создания временных объектов. Например, у меня есть класс BinarySignal (бинарный сигнал). В логических выражениях, где вычисляются различные блокировки, признаки и т.п., компилятор создаёт временные объекты BinarySignal для хранения промежуточных результатов. Поэтому я бы рекомендовал следующее: для классов, реализующих объекты операционной системы (ОС), использовать менеджер памяти из ОС, а для своих объектов- свой менеджер. Причём для некоторых своих классов создать индивидуальный менеджер, учитывающий специфику использования класса.

И ещё. Обязательно включите механизмы диагностики для создаваемых классов. Например, как минимум, счётчик объектов класса и переменную, хранящую максимальное число созданных объектов этого класса. Это позволит видеть реальное использование памяти классос, тем более если будете реализовывать для этого класса свой менеджер памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 09:20 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Я переопределил операторы new delete - для потобезопасности добавлены критические секции.

Show Пока моих познаний на большее не хватает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 13:26 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Интересный момент...
Попытался я из прерывания вызвать НЕ статический метод класса через указатель.
Завел в классе статическую переменную - указатель на функцию, в конструкторе присваиваю ей адрес нужной функции, в прерывании проверяю, не пустой ли указатель и вызываю функцию (не статическую) класса через этот указатель.
Функция то запускается, но при обращении к членам класса какая то муть - явно обращается не к элементам созданного экземпляра класса (в конструкторе которого я присваивал указателю значение).
То есть при обращении читаются какие то левые значения.

Как правильно вызвать НЕ статический метод класса через указатель на него (на метод, а не на экземпляр класса) так, чтобы из этой функции обращение было к полям созданного экземпляра?
Или без указателя на экземпляр класса ничего не получиться?

Со статическими методами такой проблемы нет.


Последний раз редактировалось Pingvin 05 июл 2019, 13:42, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 13:41 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1168
Код:
struct One
{
   void print() { rtt.print("Hello"); }
};

   One one;
   using FP = void(One::*)();
   FP fp = &One::print;
   (one.*fp)();


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 13:48 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Reflector писал(а):
Код:
struct One
{
   void print() { rtt.print("Hello"); }
};

   One one;
   using FP = void(One::*)();
   FP fp = &One::print;
   (one.*fp)();


Я почему
(one.*fp)();

а не просто

fp();

?

С чего началось то все - я не могу из статического метода обращаться к нестатическим полям класса, хотел это обойти использую указатель (статический) на нестатическую функцию.


Последний раз редактировалось Pingvin 05 июл 2019, 13:54, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 13:53 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1168
Потому что fp - это не настоящий указатель, а смещение относительно начала класса.
На ПК можно использовать и такой вариант:
Код:
std::function<void()> f = std::bind(&One::print, one);
f();


А вот такой с оптимизацией у меня идентичен первому:
Код:
auto print = std::mem_fn(&One::print);
print(one);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 14:05 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Reflector писал(а):
Потому что fp - это не настоящий указатель, а смещение относительно начала класса.
На ПК можно использовать и такой вариант:
Код:
std::function<void()> f = std::bind(&One::print, one);
f();


А вот такой с оптимизацией у меня идентичен первому:
Код:
auto print = std::mem_fn(&One::print);
print(one);

А-а-а....
Тут то собака порылась.
Я вызывал как простой указатель, но почему тогда функция вызывалась?
Запутано все, надо переварить...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 14:10 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
А если мне вот это
Код:
auto print = std::mem_fn(&One::print);
print(one);

нужно сделать в конструкторе класса, использовать this?
Проблему то свою я решил по другому - делаю указатель не нестатический буфер.

Но интересно с функциями разобраться.
Спасибо, что тратите на меня своё время.
Но многое проясняется.


Последний раз редактировалось Pingvin 05 июл 2019, 14:13, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 14:12 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1168
Pingvin писал(а):
Я вызывал как простой указатель, но почему тогда функция вызывалась?

Технически там не обязано быть смещение, может быть и два указателя, т.е. в функцию ты попал по указателю на эту функцию, а указатель на начало класса, через который идет доступ к данным, потерялся.

Цитата:
нужно сделать в конструкторе класса, использовать this?

Код:
(this->*fp)();


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 14:16 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Reflector писал(а):
Технически там не обязано быть смещение, может быть и два указателя, т.е. в функцию ты попал по указателю на эту функцию, а указатель на начало класса, через который идет доступ к данным, потерялся.

Цитата:
Код:
(this->*fp)();


Спасибо, все понял.
То есть нельзя пользовать простые указатели на функцию для обращения к методом класса.
Нужны специальные, которые еще передают как бы адрес самого экземпляра класса в памяти (для обращения к полям экземпляра).
Указатель мне нужно было объявить следующим образом
Код:
   using FP = void(One::*)();

Верно?


Спасибо!


Последний раз редактировалось Pingvin 05 июл 2019, 14:21, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 14:20 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1168
Pingvin писал(а):
То есть нельзя пользовать простые указатели на функцию для обращения к методом класса.
Нужны специальные, которые еще передают как бы адрес самого экземпляра класса в памяти.
Верно?

Да, проще только с обертками, но в них все равно передается указатель на экземпляр.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 05 июл 2019, 14:23 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Reflector писал(а):
Pingvin писал(а):
То есть нельзя пользовать простые указатели на функцию для обращения к методом класса.
Нужны специальные, которые еще передают как бы адрес самого экземпляра класса в памяти.
Верно?

Да, проще только с обертками, но в них все равно передается указатель на экземпляр.

Ещё раз спасибо!
Вроде пытаюсь искать инфу, читать, но все равно без помощи гуру сложно все понять.
Ща это все закрепим на практике. :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 06 июл 2019, 22:01 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 485
Pingvin писал(а):
Reflector писал(а):
То есть нельзя пользовать простые указатели на функцию для обращения к методом класса.

Извини, а зачем тебе так извращаться? К членам класса обращаются через указатель на экземпляр класса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 07 июл 2019, 18:21 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
tonyk писал(а):
Извини, а зачем тебе так извращаться? К членам класса обращаются через указатель на экземпляр класса.


В итоге так и сделал.

Код:
Usart_1 *Usart_1::self_pointer;


в конструкторе
Код:
self_pointer = this;


в статическом методе (таске FreeRTOS)
Код:
void Usart_1::vlisteningTask (void *pvParameters){
      uint32_t bytes_in_buff;
      unsigned char sym;

      while (Usart_1::self_pointer==0){
         vTaskDelay(100);
      }
      for(;;){

            if (xSemaphoreTake(Usart_1::self_pointer->xUsartSemaphore, portMAX_DELAY)== pdTRUE)//���� 2 ������� ���������� Si4432
               {

               do {
                         taskENTER_CRITICAL();
                         bytes_in_buff = Usart_1::self_pointer->GetRxCount();
                         if (bytes_in_buff ){
                            sym = Usart_1::self_pointer->GetChar();
                            taskEXIT_CRITICAL();
                            on_symbol_received(sym);

                  }
                         else{
                            taskEXIT_CRITICAL();
                         }
               }while(bytes_in_buff);


               }


   }

}




Ещё бы с weak разобраться...

Объявил слабую функцию


Код:
void __attribute__ ((weak /*alias("default_on_symbol_received")*/)) on_symbol_received(unsigned char sym);



Вроде работает - если в main.c объявляю
Код:
void on_symbol_received(unsigned char sym){
int i;
i++;

}



То когда навожу курсор на on_symbol_received(sym); высвечивается функция из main.c
Если в main.c не реализована названная фуцнкция, то высвечивается
Код:
void __attribute__ ((weak /*alias("default_on_symbol_received")*/)) on_symbol_received(unsigned char sym);


Сборка происходит без ошибок, но мне не понятно - какой код в этом случае выполнится?
Функция же без "тела".
Алиас прописать тоже не получилось.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 07 июл 2019, 19:29 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 485
Извини, но я не могу понять зачем тебе всё это? Указатель на метод класса, хрупкие определения...

Цитата:
void Usart_1::vlisteningTask (void *pvParameters){
...


А это что? Для чего тебе это?

Есть у меня подозрение, что ты пытаешься получить вот это:
Код:
class IRQ
{
    protected:

        //----------------------------------------------------------------------
        // Обработчик прерывания.
        virtual void IRQ_Handler( void ) = 0;
        ...............

Код:
class AbsUART : public AbstractTransport, protected IRQ
{
    .................
            // Устанавливает события, по которым будет формироваться прерывания.
            virtual void setEvents( void ) = 0;
    .................


Код:
class ConIO : public AbsUART
{
    ...................       
    protected:

        #ifdef __STM32__
       
            // Обработчик прерывания.
            virtual void IRQ_Handler( void );

            // Устанавливает события, по которым будет формироваться прерывания.
            virtual void setEvents( void );

        #endif
    .....................


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 07 июл 2019, 21:53 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Чтобы обявив глобальную переменную в любом файле
Usart1 usart;

и написав функцию (коллбэк) on_symbol_received(sym); тоже в любом файле

обрабатывать в ней полученный символ, она будет вызываться пока приёмный буфер не пустой

При пустом буфере задача просто будет спать, не отжирая ресурсы контроллера

Код:
on_symbol_received(sym){

if (sym=...)

}


Последний раз редактировалось Pingvin 07 июл 2019, 21:57, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 07 июл 2019, 21:57 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 485
Pingvin писал(а):
Чтобы обявив глобальную переменную в любом файле
Usart1 usart;

и написав функцию (коллбэк) on_symbol_received(sym);

обрабатывать в ней полученный символ, она будет вызываться пока приёмный буфер не пустой

Код:
on_symbol_received(sym){

if (sym=...)

}


Извини, но это бред. Это не ООП.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 07 июл 2019, 21:58 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
tonyk писал(а):
Pingvin писал(а):
Чтобы обявив глобальную переменную в любом файле
Usart1 usart;

и написав функцию (коллбэк) on_symbol_received(sym);

обрабатывать в ней полученный символ, она будет вызываться пока приёмный буфер не пустой

Код:
on_symbol_received(sym){

if (sym=...)

}


Извини, но это бред. Это не ООП.


Я и не претиндую на академически правельный код.
Делаю, как мне удобней.
Тем более в процессе изучения.
Не проблема - можно вызвать метод другого класса, например парсера.

Извиняю...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 07 июл 2019, 22:17 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 485
Зачем тебе колбэки? Глянь ещё раз чуть выше на мой пример: нужно классу обрабатывать прерывания, так он просто наследует class IRQ, переопределяя в нём виртуальные setEvents() и IRQ_Handler. И всё.

Обрати внимание, что внутри класс AbsUART есть,

USART_TypeDef* usart;

то ты можешь привязываться к ЛЮБОМУ прерыванию от ЛЮБОГО UART. Без всяких колбэков.

Я понимаю, что ты только начинаешь изучать С++, поэтому ты и не обратил внимание, что в моём примере обработчик прерывания является ВИРТУАЛЬНЫМ методом. Подумай, как вызывать виртуальный метод из обработчика, тогда вся мощь ООП будет работать на тебя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 08 июл 2019, 06:19 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Я знаю, что из прерывания я не могу вызвать нестатический метод класса без указателя на экземпляр класса.
Каким образом тут помогут виртуальные методы (которые придется переопределять) - мне не понятно.

Прерывания должны иметь четко определённые названия, так?

void USART1_IRQHandler()

void USART2_IRQHandler()

void USART3_IRQHandler()


Каким образом из функции-обработчика прерывания вызываются методы вашего класса?

Или при переопределении виртуальному методу присваивается адрес функции-обработчика?
Тогда опять возвращаемся к проблеме доступа к полям класса.
Или в таком случае не будет проблемы как с вызовом метода класса через простой указатель
на функцию?

Покажите класс (классы) полностью.

Цитата:
Подумай, как вызывать виртуальный метод из обработчика, тогда вся мощь ООП будет работать на тебя.

У меня и так сплошные вопросы, Вы ещё мне тут загадки загадываете. :-)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 08 июл 2019, 08:46 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Метод класса через указатель (вернее std::function) можно ещё вызвать так
Код:
   std::function<void()> pFunc;
   pFunc = [](){uart_1.FlushRxBuf();};
   pFunc();



правда с дополнительными накладными расходами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 08 июл 2019, 09:01 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Работа с прерываниями в микроконтроллерах в 21 веке

https://www.youtube.com/watch?v=gXo_kyE4t_w


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 08 июл 2019, 09:06 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 485
Я пока не готов показывать тебе код из коммерческих проектов, извини. Но готов рассказать кое-что, чтобы ты смог сам реализовать задуманное тобой. Ну и посмотреть, может, ты найдёшь более изящное решение, чем у меня.
Выше я показал тебе фрагменты из _работающего_ проекта, и если у меня обработчик прерывания _виртуальный_ метод класса, значит, есть способ его вызвать. Более того, выше я говорил о смене режима работы УАПП, значит, можно "на лету" менять обработчик, то есть вызывать _виртуальный_ метод того класса-предка, который в данный момент реализует функционал УАПП!

Начни с простого, отдели мух от котлет. Тебе что нужно: получить доступ к полям класса или вызвать метод класса (заметь, это не одно и то же, хотя метод это одно из полей)? Что нужно для вызова ЛЮБОГО метода класса извне? Что тогда нужно обработчику, чтобы вызвать метод класса IRQ::IRQ_Handler()? Кстати, подсказка есть у Страуструпа, когда он описывает способ обхода защиты от вызова protected и private методов не то что из наследников, а вообще из любого места программы. Изучаешь "плюсЫ"? Изучай, я просто показываю места, на которые следует обратить внимание.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 08 июл 2019, 09:39 
Старожил

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 485
Pingvin писал(а):
Работа с прерываниями в микроконтроллерах в 21 веке

https://www.youtube.com/watch?v=gXo_kyE4t_w


Да, примерно так я и делаю.
Код:
////////////////////////////////////////////////////////////////////////////////
//
//      IRQ.h
//
////////////////////////////////////////////////////////////////////////////////
//
//      Любой класс, желающий обрабатывать прерывания, должен быть наследником
// класса IRQ, в котором ему необходимо реализовать метод IRQn_Handler(),
// а пОрты должны обеспечивать вызов этого метода.
//      Заметь, что можно "повесить" несколько прерываний на один обработчик,
// но и при "отвязке" нужно "отвязывать" каждое прерывание от этого обработчика.
//
////////////////////////////////////////////////////////////////////////////////

#ifndef __IRQ_SUBSYSTEM_H__
#define __IRQ_SUBSYSTEM_H__

////////////////////////////////////////////////////////////////////////////////

#include "targetver.h"

#include <stdlib.h>
#include <string.h>
#include "FreeRTOS.h"

#ifdef __STM32__

    #include "stm32f411xe.h"
    #include "NVIC.h"

    const int maxInterruptHandlers = 128;

#endif
////////////////////////////////////////////////////////////////////////////////

class IRQ
{
    protected:

        //----------------------------------------------------------------------
        // Обработчик прерывания.
        virtual void IRQ_Handler( void ) = 0;

        int installInterruptHandler
        (
            #ifdef __STM32__
               
                IRQn_Type   IRQn    // See "stm32fxxx.h", enum IRQn_Type.

            #endif
        );
                                                     
        int uninstallInterruptHandler
        (
            #ifdef __STM32__
               
                IRQn_Type   IRQn    // See "stm32fxxx.h", enum IRQn_Type.

            #endif
        );

        friend void callHandler( IRQn_Type );
};

////////////////////////////////////////////////////////////////////////////////
#endif  // __IRQ_SUBSYSTEM_H__
////////////////////////////////////////////////////////////////////////////////
//
//  end of IRQ.h
//
////////////////////////////////////////////////////////////////////////////////


Код:
////////////////////////////////////////////////////////////////////////////////
//
//      IRQ.cpp
//
////////////////////////////////////////////////////////////////////////////////

#include "IRQ.h"

////////////////////////////////////////////////////////////////////////////////

static void *handler[ maxInterruptHandlers ];

////////////////////////////////////////////////////////////////////////////////

int IRQ::installInterruptHandler
(
        IRQn_Type   _IRQn    // See "stm32fXXX.h", enum IRQn_Type.
)
{
    if
    (
        ( _IRQn >= 0 ) ||
        ( _IRQn < ( IRQn_Type )maxInterruptHandlers )
    )
    {
        handler[ _IRQn ] = this;
        NVIC_t::getInstance() -> enableIRQ( _IRQn );

        return 0;
    }
    else
    {
        return( -1 );
    }
}
                                             
////////////////////////////////////////////////////////////////////////////////

int IRQ::uninstallInterruptHandler
(
        IRQn_Type   _IRQn   // See "stm32f10x.h", enum IRQn_Type.
)
{
    if
    (
        ( _IRQn >= 0 ) ||
        ( _IRQn < ( IRQn_Type )maxInterruptHandlers )
    )
    {
        NVIC_t::getInstance() -> disableIRQ( _IRQn );
        handler[ _IRQn ] = 0;

        return 0;
    }
    else
    {
        return( -1 );
    }
}

////////////////////////////////////////////////////////////////////////////////

void callHandler( IRQn_Type _IRQn )
{
    if( handler[ _IRQn ] )
        (( IRQ* )handler[ _IRQn ]) -> IRQ_Handler();
    else
        abort();
}

////////////////////////////////////////////////////////////////////////////////

extern "C"
{
    //--------------------------------------------------------------------------
    void WWDG_IRQHandler( void )
    {
        callHandler( WWDG_IRQn );
    }
    //--------------------------------------------------------------------------
    void PVD_IRQHandler( void )
    {
        callHandler( PVD_IRQn );
    }
    //--------------------------------------------------------------------------
    void TAMP_IRQHandler( void )
    {
        callHandler( TAMP_STAMP_IRQn );
    }
    //--------------------------------------------------------------------------
    void RTC_WKUP_IRQHandler( void )
    {
        callHandler( RTC_WKUP_IRQn );
    }
    //--------------------------------------------------------------------------
    void FLASH_IRQHandler( void )
    {
        callHandler( FLASH_IRQn );
    }
    //--------------------------------------------------------------------------
    void RCC_IRQHandler( void )
    {
        callHandler( RCC_IRQn );
    }
    //--------------------------------------------------------------------------
    void EXTI0_IRQHandler( void )
    {
        callHandler( EXTI0_IRQn );
    }
    //--------------------------------------------------------------------------

......

////////////////////////////////////////////////////////////////////////////////
//
//  end of IRQ.cpp
//
////////////////////////////////////////////////////////////////////////////////


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32+SEGGER+FreeRTOS+C++
СообщениеДобавлено: 08 июл 2019, 09:55 
Старожил
Аватара пользователя

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2566
Я Вас понял, спасибо!
Храним статический массив с указателями на экземпляры классов, имеющих наследуемый от базового класса IQR метод IRQ_Handler.

А в прерывании проверяем, какие экземпляры ждут прерывания и если находим объекты - вызываем их метод (переопределенный для каждого класса) IRQ_Handler.


Ну у меня так же сделано, в принципе. Только хранится один статический указатель на экземпляр, и вызывается конкретный метод класса, а не унаследованный (и переопределённый) виртуальный, вот и вся разница.

Коллбэк не для этого.
Я то хотел ещё скрыть от пользователя таск FreeRTOS, который мониторит семафор.
А семафор как раз отпускается в прерывании.

Ведь я не собираюсь внутри прерывания парсить входящие строки, это нужно делать в задаче FreeRTOS.
Поэтому и коллбэк функция с передачей в качестве параметра принятого символа.
Этой функцией может быть и метод другого класса (Parser::on_symbol_recieve(unsigned char) например)

Работает, кстати - сегодня проверил.

До этого же я просто ждал семафора в таске объекта другого класса.
Захотел попробовать и так.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 87 ]  На страницу Пред.  1, 2, 3, 4  След.


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: BARS_, Eddy_Em


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB