Передайте указатель функции в xTaskCreate с помощью void * pvParameters - PullRequest
0 голосов
/ 19 июня 2020

Можно ли передать указатель на функцию в качестве параметра для функции freeRTOS xTaskCreate? Я подозреваю, что мне нужно преобразовать void * pvParameters в задачу, прежде чем я смогу ее вызвать, но я не уверен, что такое cast.

class param
{
    private:
        //Initialized during construction to hardware specific value. 
        uint8_t mParam = 0;
    public:
        uint_8 getParam() {return mParam;}
};

void task(void* pvParameters)
{
    //get hardware specific pvParameters.
    uint8_t hwParam = pvParameters(); 
    // Do task things. 
}

main()
{
    param p;
    uint32_t result; 
    result = xTaskCreate(task, "Task", configMINIMAL_STACK_SIZE, (void *)&p.getParam, configMAX_PRIORITIES - 1, nullptr); //lint !e712 implicit conversion from long to int
    if (result == 0)
    {
        //print error msg.
    }
    else
    {
        vTaskStartScheduler();
        for(;;) {ASM("NOP");}
    }
}

1 Ответ

0 голосов
/ 20 июня 2020

Почему бы не использовать & p (адрес объекта p) в качестве аргумента для доступа к полному объекту param с использованием такого преобразования:

param& p = *(param*)pvParameters;

Помните, что для ряда портов / MCU основной стек используется повторно поскольку стек ISR и выделенные аргументы основного стека могут быть повреждены. Лучше использовать, например, статический / новый объект param.

...