Hardware abstraction layer (HAL)
A thin software layer that hides register addresses and chip differences behind functions like uart_write().
Without a HAL the application pokes peripheral registers directly, and every change of microcontroller means rewriting it. With one, it calls an interface and only the layer underneath changes. Windows NT was built that way in 1993 — hal.dll separated the kernel from motherboard specifics so the same system could run on x86, MIPS and Alpha. Android has HAL modules for cameras and sensors.
In embedded work it is either the vendor's library, such as ST's STM32Cube HAL, or the community's, such as Rust's embedded-hal, where a sensor driver is written against traits rather than a particular chip. The perennial complaint is that generality costs: a HAL call that toggles a pin can take fifty cycles where a register write takes one. So plenty of projects end up with HAL everywhere except the one interrupt where it matters.