HuadaMCU関数ライブラリでのブール型の値の判断に関する提案

最近、Huada HC32L176KATAの開発過程で問題が発見されました。
ピンPC11はLEDインジケーターを制御し、関数Gpio_WriteOutputIO(GpioPortC、GpioPin11、x&0x80)を呼び出します。
この関数は、プログラムでLEDライトを駆動するために使用されます。デバッグ、マルチメーターでのIOピンの測定も低レベルであり、オシロスコープで波形を見ると常に低レベルになります。何が起こったのか、私はN年間シングルチップマイクロコンピューターでした。
それはとても単純なことで、処理できません。奇妙です。奇妙な。
次に、Huada Companyのデモを調べたところ、2つの関数Gpio_SetIO()とGpio_ClrIO()
を使用して、プログラムのGpio_WriteOutputIOをこれらの2つの関数に置き換えたところ、インジケーターライトが正常に表示されていました。

問題は解決しますが、それでも非常に奇妙です。これら3つの機能は、最終的には操作ピンの出力レジスタであり、結果は同じであるはずです。なぜここで違うのですか?
この問題でデバッグする場合は、関数ライブラリにトレースします。x= 0x80の場合、関数に入った後のGpio_WriteOutputIOの値も0x80になります。関数は
SetBit(((uint32_t)&M0P_GPIO-> PAOUT + enPort)、enPin、bVal);を呼び出します。
次に、SetBit関数を入力し
ます。voidSetBit(uint32_t addr、uint32_t offset、boolean_t bFlag)
{     if(TRUE == bFlag)     {         *((volatile uint32_t *)(addr))| =((1UL)<<(offset)) ;     }




    else
    {         *((volatile uint32_t *)(addr))&=(〜(1UL <<(offset)));     }    }この関数が最初に式(TRUE == bFlag)を判断することがわかりました。ここで、TRUEは   #defineとして定義されます。TRUE((boolean_t)1u)これは理解できます。SetBit関数に渡される3番目のパラメーターbFlagは0x80です。この値はTRUE(値1)と等しくありません。したがって、elseステートメントが実行され、結果がインジケーターになります。常時接続のC99標準では、真と偽の2つの値を持つブール型が定義されています。式が0と評価された場合、型の値は偽であり、式がゼロ以外と評価された場合、型の値は真であり、 Huadaライブラリ関数では、判定(TRUE == bFlag)、TRUEの値は1、bFlag値は0x80と異なります。これは、C99標準とは多少異なります。Huadaライブラリ関数(TRUE ==)の判定条件をお勧めします。bFlag)は(FALSE == bFlag)に変更されます。つまり、void SetBit(uint32_t addr、uint32_t offset、boolean_t bFlag){     if(FALSE == bFlag)     {         *((volatile uint32_t *)(addr))&=(〜(1UL <<(オフセット)));     }     else     {




















        *((volatile uint32_t *)(addr))| =((1UL)<<(offset));
    }   
}


これはC99標準と統合されており、ユーザーを混乱させることはありません。

おすすめ

転載: blog.csdn.net/qq_15548761/article/details/107108093