Firmware Programming: Languages, Tools, and Best Practices