Does all microcontroller code run in loop?

Short answer: almost all applications on microcontrollers are designed to run “forever”, usually inside some kind of loop – but not every single line of code is literally inside a while(1) loop.



Let’s unpack that a bit.


1. Why “infinite loop” is so common

Microcontrollers usually:

  • Power up

  • Run some startup code (set up stack, clocks, memory)

  • Call your main()

  • Then are expected to run as long as the device has power

Unlike a PC program, there’s no operating system saying “OK, you’re done now, exit”.
So firmware is typically structured as:

int main(void) { setup_peripherals(); init_stuff(); while (1) { // “superloop” read_inputs(); update_state(); control_outputs(); } }

This is why you see so many:

  • while(1) in bare-metal C

  • for(;;) in some code

  • loop() function in Arduino (which the core actually calls in a loop internally)

So: the top-level logic is usually in a forever loop.


2. But not everything is a loop

Several important bits are not “running in a loop” in the usual sense:

a) Interrupt Service Routines (ISRs)

ISRs run when hardware events happen (timer tick, UART RX, pin change, etc.).

ISR(TIMER0_COMPA_vect) { // This is not a loop, it’s a small handler tick_count++; }
  • The CPU jumps into the ISR, runs a few instructions, then returns to whatever it was doing.

  • So ISRs are event-driven, not looping.

b) Startup code / initialization

Before your superloop starts, there’s one-time code:

  • Copying .data from flash to RAM

  • Zeroing .bss

  • Initializing clock PLLs

  • Running C++ constructors

That code runs once, then never again.


3. RTOS systems: many little “loops”

With an RTOS (FreeRTOS, Zephyr, etc.), you often have tasks:

void vTaskLED(void *pvParameters) { for (;;) { // each task has its own loop toggle_led(); vTaskDelay(500); } }
  • Each task is typically an infinite loop.

  • A scheduler switches between tasks, so it’s no longer one big while(1) but many smaller loops.


4. Can you write MCU code that doesn’t loop?

You can, but it’s unusual:

  • Example: a very simple piece of code that:

    • configures something once,

    • maybe sets some pins,

    • then goes into deep sleep and never wakes.

Even then, the CPU either:

  • sits in a sleep instruction inside an infinite loop, or

  • halts in some implementation-specific way.

If you let main() just return, many C runtimes on MCUs will:

  • Jump to a default infinite loop, or

  • Reset the MCU.

So the system still “loops” at some level to keep the chip alive.


5. Mental model to keep

  • Application level: almost always some form of forever loop (superloop or RTOS tasks).

  • Interrupts: small event handlers that run briefly and return.

  • Startup and init: one-shot code before the loop starts.

  • Hardware: if there were truly no loop and no sleep, the core would just sit at the last instruction, which is effectively a tiny loop anyway.

So:

Not every line of microcontroller code runs in a loop, but practically every meaningful firmware is designed around one or more infinite loops, because the device is supposed to run continuously as long as it’s powered.

评论

此博客中的热门博文

Detailed Explanation of STM32 HAL Library Clock System

How To Connect Stm32 To PC?

How do you set up ADC (Analog-to-Digital Converter) in STM32?