Sabes que estoy tratando de tomar esa decisión, si usar o no librerías de terceros para cosas complejas como las que mencionas, no es lo mismo levantar un par de funciones para una Uart que para el USB.
Es que en última instancia, con C tampoco tenemos un control total. Uno escribe código en C y es el compilador el que tiene el control, que traduce las instrucciones a código objeto.
Una simple instrucción de asignación (a = b) va a ser compilada de formas distintas dependiendo de la configuración del compilador (nivel de optimización entre otras), si la variable es volatile o no, si la variable "a" es una variable local a la función (en tal caso normalmente se use la pila, se puede cambiar con opciones de compilación), si es static entonces en realidad es global. Si b es el resultado de llamar a una función entonces quizás se use para b uno de los registros de trabajo del micro.
Y también el código generado va a depender del código antes y después de la instrucción de asignación, si después hago un if(a) el código no va a ser el código de la instrucción de asignación más el codigo del if; sino una fusión (siempre y cuando se utilice al menos una mínima optimización).
Normalmente cuando uno está escribiendo el código por primera vez puede optar por no usar ninguna optimización, usar -O0 para los que hablan gcc, y una vez que sabe que eso funciona entonces sí puede optimizar en general (-O2, -O3), o quizás le interese optimizar el tamaño de código (-Os que puede ir en contra de la velocidad de ejecución). Lo digo porque alguna vez puede pasar que uno no sabe por qué algo no funciona y termina viendo el disassembly que generó el compilador, y ve alguna operación "rara" (por ejemplo, suele pasar que si usas código optimizado las instrucciones no se ejecutan en el orden que las escribiste, sino que salta de un lugar a otro dentro de la rutina en forma fantasmagórica -> optimización).
¿Entonces por qué usar optimización?, porque normalmente te reduce la cantidad de memoria usada a la mitad, y se ejecuta más rápido, lo que no es para nada despreciable.
En fin, a lo que voy es que no hay que creerse que por usar C tenemos todo el control, u órdenes de magnitud de mayor control que usando C++. Lo que tiene C es que seguro lo vas a poder usar con cualquier cosa (8, 16, 32 bits), C++ recién en algunos micros de 16 bits y seguro de 32 bits.
Al final, la diferencia pasa más por si la compañía X (que puede ser distinta a la que hace el micro) te provee de un buen compilador (que no genere instrucciones inútiles y esté bien optimizado para el hardware del micro) de que si escribís en C o C++.