Il sistema che usi per la tua funzione aspetta è anche detto "busy form of waiting", cioè, nonostante il tempo d'attesa sia considerato un tempo morto, la cpu viene impiegata al 100% dal tuo programma.
Questo modo di operare va bene solo in alcuni ambiti (in cui il tempo d'attesa è brevissimo), invece nel tuo conviene implementare un contatore che non consuma (quasi) cpu.
Un possibile schema implementativo è questo

codice:
void countDown (int secondi){
   
   if (secondi <=0)
      return;

   while (secondi > 0){
      printf("- %d",secondi); // mostro il contatore discendente
      sleep(1000); /*il programma dorme per un secondo*/
      secondi--;
   }
}
La funzione sleep permette al sistema operativo di cambiare lo stato del programma da running a suspended blocked, in modo tale da non fargli sprecare CPU.