一時的な異常を考慮したコード

この投稿では、一時的な異常を考慮したコードについて説明致します。

組込み製品は、厳しい稼働環境に置かれる場合や耐久年数が長い場合があります。そのため、ノイズなどの外乱要因発生やハードウェア素子劣化等の影響による故障まで至らない一時的な異常が発生する場合があります。そのような場合を考慮したコードを入れる製品があります。

例1:加算時のオーバーフローチェック、減算時のアンダーフローチェック

unsigned char func_add(unsigned char x1, unsigned char x2)
{
    unsigned short y = (unsigned short)x1 + x2;
    if( y > 0x00ff )
    {
        y = 0x00ff;
    }
    return((unsigned char)y);
}

unsigned char func_sub(unsigned char x1, unsigned char x2)
{
    signed short y = (signed short)x1 - x2;
    if( y < 0x0000 )
    {
        y = 0x0000;
    }
    return((unsigned char)y);
}


void func(void)
{
    unsigned char i=X=0;

    for( i = 0; i < 10 ; i++ )
    {
           X = func_add(X, i);  // X=45
    }

    for( i = 0; i < 10 ; i++ )
    {
           X = func_sub(X, i);  // X=0
    }
}

例2: AD変換Bit より大きなAD変換値

このケースは、次の二つの異常が考えられます。MCUメーカと相談し、どちらの対策が良いか検討ください。

ADC変換ユニットの異常

unsigned short func(void)
{
    unsigned short tmp=0;
    tmp = 0x03ff & adc_read(ch0);
    return(tmp);
}

HAL処理の異常

#define mac_lmt_up(val,lmt)  (((val)>(lmt))?(lmt):(val) )

unsigned short func(void)
{
    unsigned short tmp=0;
    tmp = mac_lmt_up(adc_read(ch0), 0x3ff);
    return(tmp);
}
OSS-ECAL Japanese
error: コンテンツは保護されている