Easyelectronics.ru

Электроника для всех
Текущее время: 19 окт 2019, 00:18

Часовой пояс: 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
Сообщения: 234
По поводу new и delete.

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

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


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

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

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


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

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

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

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


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

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

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1016
Код:
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
Сообщения: 2349
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
Сообщения: 1016
Потому что 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
Сообщения: 2349
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
Сообщения: 2349
А если мне вот это
Код:
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
Сообщения: 1016
Pingvin писал(а):
Я вызывал как простой указатель, но почему тогда функция вызывалась?

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

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

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


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
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
Сообщения: 1016
Pingvin писал(а):
То есть нельзя пользовать простые указатели на функцию для обращения к методом класса.
Нужны специальные, которые еще передают как бы адрес самого экземпляра класса в памяти.
Верно?

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


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

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

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

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


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

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

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


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

Зарегистрирован: 26 окт 2013, 07:58
Сообщения: 2349
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
Сообщения: 234
Извини, но я не могу понять зачем тебе всё это? Указатель на метод класса, хрупкие определения...

Цитата:
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
Сообщения: 2349
Чтобы обявив глобальную переменную в любом файле
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
Сообщения: 234
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
Сообщения: 2349
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
Сообщения: 234
Зачем тебе колбэки? Глянь ещё раз чуть выше на мой пример: нужно классу обрабатывать прерывания, так он просто наследует class IRQ, переопределяя в нём виртуальные setEvents() и IRQ_Handler. И всё.

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

USART_TypeDef* usart;

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

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


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

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

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

void USART1_IRQHandler()

void USART2_IRQHandler()

void USART3_IRQHandler()


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

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

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

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

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


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

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



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


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

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

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


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

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

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


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

Зарегистрирован: 08 июл 2013, 17:00
Сообщения: 234
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
Сообщения: 2349
Я Вас понял, спасибо!
Храним статический массив с указателями на экземпляры классов, имеющих наследуемый от базового класса IQR метод IRQ_Handler.

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


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

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

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

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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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