この投稿では、一時的な異常を考慮したコードについて説明致します。
組込み製品は、厳しい稼働環境に置かれる場合や耐久年数が長い場合があります。そのため、ノイズなどの外乱要因発生やハードウェア素子劣化等の影響による故障まで至らない一時的な異常が発生する場合があります。そのような場合を考慮したコードを入れる製品があります。
初めてみる方には、異様に思えるかもしれませんが、市場で発生した不具合の対策だったりするので、理由を確かめてみてください。
例1:加算時のオーバーフローチェック、減算時のアンダーフローチェック
組込み製品の中には、加算時のオーバーフローチェックや減算時のアンダーフローチェックを入れるようにルール化している製品があります。

/* Overflow check function for unsigned char type addition */
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);
}
/* Underflow check function for char type subtraction */
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);
}
unsigned char function_add(void)
{
unsigned char A = B = C = 0;
A = func1(); /* func1 return value 0 to 50 */
B = func2(); /* func2 return value 0 to 10 */
C = func_add(A, B);
return( C );
}
unsigned char function_sub(void)
{
unsigned char A = B = C = 0;
A = func3(); /* func1 return value 30 to 80 */
B = func4(); /* func2 return value 10 to 20 */
C = func_add(A, B);
return( C );
}
例2: AD変換Bit より大きなAD変換値
組込み製品の中には、マイコンのレジスタの未使用Bitをゼロにして読み込むことをルール化している製品があります。

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