1

クラス内で RtosTimer を使用しようとしていますが、mbed がロックされます。これは、ティックごとに threadHelper を呼び出して新しいポインターを作成しているためだと思いますが、実際にはティックごとに threadMethod を呼び出すか、ティックごとに threadHeper を呼び出しますが、同じポインターを使用します。

誰かが私がこれをどのように行うべきかを教えてもらえますか?

以下のコードは、threadHelper が 1 回しか呼び出されないため、RtosThread に対して機能しますが、Rtos タイマーを使用する必要があります。

.h

#ifndef TEST_CLASS_H
#define TEST_CLASS_H

#include "mbed.h"
#include "rtos.h"

/** TestClass class.
 *  Used for demonstrating stuff.
 */
class TestClass
{
public:
    /** Create a TestClass object with the specified specifics
     *
     * @param led The LED pin.
     * @param flashRate The rate to flash the LED at in Hz.
     */
    TestClass(PinName led, float flashRate);

    /** Start flashing the LED using a Thread
     */
    void start();

private:
    //Member variables
    DigitalOut m_Led;
    float m_FlashRate;
    RtosTimer *m_rtosTimer;

    //Internal methods
    static void threadHelper(const void* arg);
    void threadMethod();
};

#endif

cpp

#include "TestClass.h"

TestClass::TestClass(PinName led, float flashRate) : m_Led(led, 0), m_FlashRate(flashRate)
{
    //NOTE: The RTOS hasn't started yet, so we can't create the internal thread here
}

void TestClass::start()
{
    m_rtosTimer = new RtosTimer(&TestClass::threadHelper, osTimerPeriodic, (void *)0);
    int updateTime = (1.0 / m_FlashRate) * 1000;
    m_rtosTimer->start(updateTime);
}

void TestClass::threadHelper(const void* arg)
{
    //Cast the argument to a TestClass instance pointer
    TestClass* instance = (TestClass*)arg;

    //Call the thread method for the TestClass instance
    instance ->threadMethod();
}

void TestClass::threadMethod()
{
    //Do some stuff
}

ありがとう

4

1 に答える 1

2

渡されたargポインターthreadHelper()は、コンストラクターに渡した引数ですRtosTimer。この場合は null ポインターです。 threadHelper()この null ポインターを逆参照すると、実行時エラーが発生します。

その代わり:

m_rtosTimer = new RtosTimer(&TestClass::threadHelper, osTimerPeriodic, (void*)this);
于 2015-03-13T22:58:24.773 に答える