2

lpc1788 ARM Cortex M3 でコードを書いています。ポートを GPIO として設定しようとすると、奇妙な警告が表示されました。警告にもかかわらず、コードはまったく問題なく動作しますが、この警告が表示される理由を知るために、この投稿をここに掲載します。以下は私が書いたコードです。

static uint32_t * PIN_GetPointer(uint8_t portnum, uint8_t pinnum)  
{  
    uint32_t *pPIN = NULL;  
    pPIN = (uint32_t *)(LPC_IOCON_BASE + ((portnum * 32 + pinnum)*sizeof(uint32_t)));  
    return pPIN;  
}    

void PINSEL_SetPinMode ( uint8_t portnum, uint8_t pinnum, PinSel_BasicMode modenum)  
{  
    uint32_t *pPIN = NULL;  
    pPIN = PIN_GetPointer(portnum, pinnum);  
    *(uint32_t *)pPIN &= ~(3<<3);    //Clear function bits  
    *(uint32_t *)pPIN |= (uint32_t)(modenum<<3);  
}  

int main(void)  
{  
    PINSEL_SetPinMode(1,15,0);  //this gave a warning: enumerated type mixed with another type  
    PINSEL_SetPinMode(1,18,PINSEL_BASICMODE_NPLU_NPDN);    //this doesnt give any warning  

   /* Following is the enum present in a GPIO related header file, putting it here in comments so that   
       those who are going through this post, can see the enum  

            typedef enum
            {
                PINSEL_BASICMODE_NPLU_NPDN  = 0, // Neither Pull up nor pull down        
                PINSEL_BASICMODE_PULLDOWN,       // Pull-down enabled
                PINSEL_BASICMODE_PULLUP,         // Pull-up enabled (default)         
                PINSEL_BASICMODE_REPEATER        // Repeater mode          
            }PinSel_BasicMode;        
   */

    return 0;  
}     
4

3 に答える 3

6

タイプが必要なint場所でタイプを使用しています。enum PinSel_BasicModeenum と int は通常交換可能ですが、異なる型です。

0が列挙値ではありません。PINSEL_BASICMODE_NPLU_NPDNは。それは0定義を通してのみです。

enum 宣言が変更PINSEL_BASICMODE_NPLU_NPDNされて 1 に等しい場合、コードは無効になります。

于 2013-06-04T12:47:11.693 に答える
2

1.値が期待されるint場所に渡しています。enumしたがって、それを正しい列挙型にキャストするか、より適切にキャストします。正しいenum値を直接使用します。

PINSEL_SetPinMode(1, 15, (PinSel_BasicMode)0);
PINSEL_SetPinMode(1, 15, PINSEL_BASICMODE_NPLU_NPDN);

2.値に対してビット シフト演算子を使用していenumます。コンパイラを満足させるには、ビットシフトの前後にキャストする必要があると思います。

void PINSEL_SetPinMode ( uint8_t portnum, uint8_t pinnum, PinSel_BasicMode modenum)  
{  
    uint32_t *pPIN = NULL;  
    pPIN = PIN_GetPointer(portnum, pinnum);  
    *pPIN &= ~(3<<3);    //Clear function bits  
    *pPIN |= (uint32_t)((uint32_t)modenum << 3);
}

前: 値の代わりに整数値をシフトしたいためenum

後: シフト操作の出力型は必ずしも入力型と同じではないためです。

于 2013-06-04T13:00:18.240 に答える
0

列挙型は定義された型であるため、ここでの警告は int と互換性のない型であるため、型キャストして警告を回避できます。

ただし、ここでは列挙型に 0 が定義されているため、コードが間違った結果を出すことはありません。

それが役に立てば幸い.....

于 2013-06-04T12:52:56.993 に答える