El main siempre se ejecuta. La única forma que se me ocurre para terminar la ejecución del main es poner al micro en modo sleep, o bien hacer un bucle, como dice Coach, donde se testee la condición de salida del mismo.
Lo del reset_cpu() es muy buena idea, sobre todo para empezar desde el principio del programa desde cualquier subrrutina, porque supongo que esa función limpiará la pila tambien.