I have also used RTEMS for my first major embedded software project, almost 25 years ago.
I had to port it to PowerPC, because that was an architecture not yet supported at that time, but the porting was very easy, because the code quality and the documentation were excellent and all parts dependent on the CPU architecture were clearly separated from the rest. I also had to write some device drivers, including an Ethernet driver, and again, the documentation and the device driver examples made that task easy.
RTEMS proved to be a much better choice than the alternatives at that time, i.e. pSOS and VxWorks, because the access to the source code enabled a degree of customization impossible with the proprietary RTOSes and its performance was great too.
In later years, I have not used RTEMS much, but not because I have discovered any better RTOS, but because I have realized that for a majority of the embedded software using an RTOS is an overkill. It is simpler and with less overhead to just use on bare metal an event handler with a priority queue storing scheduled actions whose time duration is limited (this is equivalent with cooperative multitasking).
There are applications which can be simplified by the preemption offered by an RTOS, like RTEMS (typically when porting to an embedded device some programs that have been written for a general-purpose OS, e.g. for Linux or FreeBSD), but the need for this must be assessed carefully, because using preemption guarantees that you cannot use the CPU close to its full capacity.
Therefore, using RTEMS (or any RTOS, but RTEMS is one of the best) can be the best choice for an embedded system when the CPU is quite powerful in comparison with what it has to do, so optimizing the CPU utilization is not needed, and the main target is to minimize the software development time by reusing some programs which have not been written specifically for real-time systems (e.g. a Web server or other complex networking programs).
Without an RTOS, i.e. without preemption, it is mandatory to be able to estimate upper limits for the execution time of any function, to be able to guarantee that deadlines are met. With an RTOS, you must still be able to do that for functions that are executed by high-priority tasks, but this may be unnecessary for those executed in low-priority tasks (which will be preempted, whenever necessary, by the high-priority tasks).