uCR is more properly called a C/C++ runtime than an operating system. A programmer writes an application program in C++ and compiles with the uCR headers. The compiler generates assembly code from the source files that the programmer writes, and what the compiler cannot do it delegates to the execution environment. uCR provides the execution environment for the generated code.
The programmer links the resulting object code with uCR libraries that fill in the parts left out by the compiler, and gets an executable image. This image is loaded into the target by prom programmer, ROM emulator, serial download--whatever works for you--and is executed.
uCR libraries add support for thread programming and interrupt handlers. These are features dependent on the CPU and not the board, so including them does not introduce board support problems. The uCR distribution also includes ancillary libraries that contain device classes, and other code that may not be specific to the CPU but is commonly used.
Interrupt handler support is also included with the uCR core library, because again it is a matter for the CPU and compiler how interrupt service routines are entered and left, and not specific to target boards. What the target boards do fix is the assignment of devices to specific interrupts, so uCR makes no attempt to guess such things.