Tengo más de 20 años de sistemas integrados, en su mayoría 8 y 16 micros. La respuesta breve a su pregunta es la misma que cualquier otro desarrollo de software: no optimice hasta que sepa que lo necesita, y luego no optimice hasta que sepa lo que necesita optimizar. Escriba su código para que sea confiable, legible y mantenible primero. La optimización prematura es tanto, si no más, un problema en los sistemas integrados
Cuando programa "sin desperdiciar ningún recurso", ¿considera su tiempo como un recurso? Si no, quién le está pagando por su tiempo, y si no hay nadie, ¿tiene algo mejor que ver con eso? Una vez que el diseñador de sistemas embebidos tiene que elegir es el costo del hardware versus el costo del tiempo de ingeniería. Si va a enviar 100 unidades, use un micro más grande, a 100,000 unidades, un ahorro de $ 1.00 por unidad es lo mismo que 1 año de desarrollo de software (ignorando el tiempo de comercialización, el costo de oportunidad, etc.), a 1 millón de unidades, comienza obtener ROI por ser obsesivo con el uso de recursos, pero tenga cuidado porque muchos proyectos integrados nunca lograron la marca de 1 millón porque se diseñaron para vender 1 millón (Alta inversión inicial con bajo costo de producción), y se arruinaron antes de llegar allí.
Dicho esto, hay que tener en cuenta y tener en cuenta los sistemas embebidos (pequeños), ya que estos dejarán de funcionar, de manera inesperada, no solo harán que vaya lento.
a) Pila: por lo general, solo tiene un tamaño de pila pequeño y, a menudo, tamaños de marco de pila limitados. Debe ser consciente de cuál es la utilización de su pila en todo momento. Tenga en cuenta que los problemas de apilamiento causan algunos de los defectos más insidiosos.
b) Montón: nuevamente, tamaños de montón pequeños, así que tenga cuidado con la asignación de memoria injustificada. La fragmentación se convierte en un problema. Con estos dos, debe saber qué hace cuando se agota: no sucede en un sistema grande debido a la paginación proporcionada por el sistema operativo. es decir, cuando malloc devuelve NULL, ¿lo verifica y qué hace? Cada malva necesita un cheque y un controlador, ¿hincha de código? Como guía, no lo use si hay una alternativa. La mayoría de los sistemas pequeños no usan memoria dinámica por estas razones.
c) Interrupciones de hardware: debe saber cómo manejarlas de manera segura y oportuna. También necesita saber cómo hacer un código seguro para el reingreso. Por ejemplo, las bibliotecas estándar de C generalmente no son reentrantes, por lo que no deben usarse dentro de los controladores de interrupciones.
d) Montaje: casi siempre optimización prematura. Como máximo, se necesita una pequeña cantidad (en línea) para lograr algo que C simplemente no puede hacer. Como ejercicio, escriba un pequeño método en ensamblaje hecho a mano (desde cero). Haga lo mismo en C. Mida el rendimiento. Apuesto a que el C será más rápido, sé que será más legible, mantenible y ampliable. Ahora, para la parte 2 del ejercicio: escriba un programa útil en ensamblador y C.
Como otro ejercicio, eche un vistazo a la cantidad de kernel de Linux que es ensamblador, luego lea el siguiente párrafo sobre el kernel de Linux.
Vale la pena saber cómo hacerlo, incluso puede valer la pena dominar los idiomas para uno o dos micros comunes.
e) "register unsigned int variable_name", "register" es, y siempre ha sido, una pista para el compilador, no una instrucción, a principios de los años 70 (hace 40 años), tenía sentido. En 2012, es una pérdida de pulsaciones de teclas, ya que los compiladores son tan inteligentes y los conjuntos de instrucciones de micros tan complejos.
Volviendo a su comentario de Linux: el problema que tiene aquí es que no estamos hablando de solo 1 millón de unidades, estamos hablando de cientos de millones, con un tiempo de vida para siempre. Vale la pena el tiempo de ingeniería y el costo para que sea lo más óptimo posible. Aunque es un buen ejemplo de la mejor práctica de ingeniería, sería un suicidio comercial para la mayoría de los desarrolladores de sistemas integrados ser tan pedantes como lo requiere el linux kernal.