c++ - FreeRTOS CPP 函数指针

标签 c++ arm freertos

我想将 CPP 类的成员函数用于 FreeRTOS taskFunction。

这是我最初的解决方案

#ifndef TaskCPP_H
#define TaskCPP_H

#include "FreeRTOS.h"
#include "task.h"

template<typename T>
class TaskBase {

protected:
        xTaskHandle handle;
        void run() {};

public:

        static void taskfun(void* parm) {
            static_cast<T*>(parm)->run();
        #if INCLUDE_vTaskDelete
            vTaskDelete(static_cast<T*>(parm)->handle);
        #else
            while(1)
            vTaskDelay(10000);
        #endif
        }

        virtual ~TaskBase() {
#if INCLUDE_vTaskDelete
                vTaskDelete(handle);
#endif
                return;
        }

};

#endif /* __TaskCPP_H__ */

#ifndef HTTPSERVER_H_
#define HTTPSERVER_H_

#include "TaskBase.h"
#include <string.h>

#include "lwip/opt.h"
#include "lwip/debug.h"
#include "lwip/stats.h"
#include "lwip/tcp.h"
#include "lwip/api.h"
#include "lwip/ip_addr.h"

class HttpServer;

class HttpServer : public TaskBase<HttpServer> {

public:
        HttpServer();
        virtual ~HttpServer();

        void run();

        void listen(ip_addr *address, uint8_t port);
        void print();

protected:
        char taskName[50];
        ip_addr address;
        uint8_t port;

};

#endif /* HTTPSERVER_H_ */

#include "HttpServer.h"

HttpServer::HttpServer()
{

}

void HttpServer::listen(ip_addr *address, uint8_t port) {

        char buf[16];
        sprintf(taskName, "%s_%d\r\n", ipaddr_ntoa_r(address, buf, 16), port);

        DEBUGOUT("ADDRESS Listen: %x\r\n", &taskName);

        this->handle = sys_thread_new(this->taskName, &taskfun, NULL, DEFAULT_THREAD_STACKSIZE + 128, DEFAULT_THREAD_PRIO);

}

void HttpServer::run() {

        while(1) {

                print();

                Board_LED_Toggle(LEDS_LED2);
                vTaskDelay(configTICK_RATE_HZ / 14);

        }

}

void HttpServer::print() {

        DEBUGOUT("ADDRESS Listen: %x\r\n", &taskName);

}

HttpServer::~HttpServer() {
        // TODO Auto-generated destructor stub
}

现在我的问题是 run 函数内的上下文不一样。在 listen(...)run(...) 中打印 taskName 的内存位置是不同的

我严重怀疑,对 run 函数进行 static_cast 会丢失类上下文吗?我错了吗?

还有其他想法来提供一个指向类成员函数的 freeRTOS 的静态函数指针吗?

以下是缺少的功能。 mainsys_thread_new 仅是一个包装器。

int main(void) {

        prvSetupHardware();

        HttpServer server;
        server.listen(IP_ADDR_ANY, 80);

        /* Start the scheduler */
        vTaskStartScheduler();

        /* Should never arrive here */
        return 1;

}

sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority )
{
xTaskHandle xCreatedTask;
portBASE_TYPE xResult;
sys_thread_t xReturn;

        xResult = xTaskCreate( pxThread, ( signed char * ) pcName, iStackSize, pvArg, iPriority, &xCreatedTask );

        if( xResult == pdPASS )
        {
                xReturn = xCreatedTask;
        }
        else
        {
                xReturn = NULL;
        }

        return xReturn;
}

最佳答案

我使用这样的东西:

class MyClass{
public:
    static void run( void* pvParams ){
        ((MyClass*)pcParams)->runInner();
    }
    void runInner(){
        while ( true ){
            // TODO code here
        }
    }
};

然后在创建任务时将指针传递给对象

MyClass* x = new MyClass;
xTaskCreate( MyClass::run, taskName, stackDepth, (void*) x, taskPrio, taskHandle );  

编辑:

假设您想使用模板:

template<typename T> 
void run ( T* p ){
     ((T*)p)->run();
}

class MyClass{
public:
     void run(){
         while ( true ){
             // task code
         }
     }
}

然后创建任务

MyClass* x = new MyClass;
xTaskCreate( run<MyClass>, taskName, stackDepth, x, taskPrio, taskHandle );

编辑:

您需要将 run 转换为 (void (*)(void*))

xTaskCreate( (void (*)(void*))run<MyClass>, taskName, stackDepth, x, taskPrio, taskHandle );

关于c++ - FreeRTOS CPP 函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606202/

相关文章:

c++ - 如何实现通用 switch/case,它也适用于一般 C++ 类型并且语法相似?

c++ - 如何摆脱整数溢出警告?

c++ - 是否可以从应用程序外部监听来自该应用程序的事件

c++ - 在 SFML 中,时钟有限制吗?

c - 我应该为 FreeRTOS 系统上的程序选择什么调度?

eclipse - 使用 OpenOCD 调试 STM32F1xx 探索板(ST-Link)

c - 自由RTOS : How to measure context switching time?

c++ - 'CXXABI_1.3.1 1' not found`

c - 在 Debian 上不用 IDE 编程 STM32F4x

arm - 使用 ARM NEON 内在函数添加 alpha 和 permute