Not at all! Mostly because of three issues:
- Reproducibility: often enough I'll come across a straightforward issue like "using an extra serial port" that already has the pins broken out on the board but isn't set as a serial port by default. The solution is almost inevitably "go into this directory deep inside your Arduino install and edit this header file". That results in two issues:
- It's not project-specific so other projects on my machine now also get the modified header
- If someone else checks out my project, they have to go in and edit that file themselves, spreading the modification like a virus.
- The abstractions are often overly simplistic and hide what's going on under the hood too much. I don't remember which board/chip it was off the top of my head but one board I was working on was having weird timing issues. As it turned out, the whole BSP for Arduino-on-that-board was running FreeRTOS under the hood and was context switching out of my loop() function arbitrarily (causing the delay between, say, two digitalWrite() statements to be dramatically different sometimes)
- The code quality of 3rd-party libraries that are commonly used varies dramatically.
I ultimately settled on Zephyr. It does a fantastic job of doing hardware abstraction and configuration behind a DeviceTree setup, it exposes really nice and consistent RTOS primatives, it has a ton of device driver support baked-in and has generally quite good code quality for all of them. I can do multiple stack-allocated threads with priority instead of having to do ugly polling hacks in a single superloop.