3

私は ARM プログラミングの初心者で、CoIDE を使用しています。C++ で 8 チャネルから PWM を読み取るアプリケーションを作成しようとしています。

私の問題は operator new; の使用です。私が書く場合:

RxPort rxPort = RxPort(RCC_AHB1Periph_GPIOA, GPIOA, GPIO_Pin_6, GPIO_PinSource6, GPIO_AF_TIM3, RCC_APB1Periph_TIM3, TIM3, TIM_Channel_1, TIM_IT_CC1, TIM3_IRQn);

それは正常に動作しますが、私が書くと:

RxPort* rxPort1 = new RxPort;
rxPort1->setTimerParameters(RCC_APB1Periph_TIM3, TIM3, TIM_Channel_1, TIM_IT_CC1, TIM3_IRQn);
rxPort1->setGPIOParameters(RCC_AHB1Periph_GPIOA, GPIOA, GPIO_Pin_6, GPIO_PinSource6, GPIO_AF_TIM3);
rxPort1->init();

プログラムは次の場所に移動します。

static void Default_Handler(void)
{
    /* Go into an infinite loop. */
    while (1)
    {
    }
}

最初の行の後。

my.st.com hereで 1 つのトピックを見つけ、「リンク」および「コンパイル」セクションの「その他のコントロール」に「--specs=nano.specs」を追加しようとしましたが、何も変わりません。

4

2 に答える 2

2

newlib C ライブラリを使用して GCC で new/delete および malloc/free をサポートするには、_sbrk_r()syscalls スタブを実装し、ヒープにメモリ領域を割り当てる必要があります。通常、後者はリンカー スクリプトを介して実行されますが、単純に大きな静的配列を割り当てることもできます。ただし、スマート リンカー スクリプトを記述して、静的オブジェクトとシステム スタックの割り当て後にヒープが使用可能なすべてのメモリを自動的に使用するようにすることができます。

実装例sbrk_r()(およびストリーム I/O などのライブラリ機能をサポートするための他の syscall スタブ) は、Bill Gatliff のサイト にあります。CoOS またはその他のマルチタスク OS またはエグゼクティブを使用していて、複数のスレッドから割り当てようとしている場合は、それも実装する必要が__malloc_lock()あり__malloc_unlock()ます。

失敗したときに例外をスローする必要があり、明示的な/ブロックがないDefault_Handlerため、コードは最終的に終了しました。スタイルのセマンティクスを使用し、失敗時に単に null を返す場合は、.newtrycatchmalloc()new (std::nothrow)

于 2013-10-15T19:40:53.373 に答える