Empirical comparison of software-based error detection and correction techniques for embedded systems