Traditional software tools, such as those based on GNU, are a compromise. Originally intended for workstation use they now support embedded development, though this is often incomplete and hard to use.
Some commercial products use the same GNU ARM launchpad tools as tools offered by semiconductor vendors and have no technical benefits over those free of charge, entry level solutions.
Proprietary toolchains for embedded processors have even more problems - they often use aging technologies and aren't up to date with modern language standards, and employ a proprietary IDE, incompatible with other tools. Non-standard language support and user interfaces make it hard to mix code from different sources. Multicore systems may require a completely different toolchain for each processor!
Getting the best from these tools can be a challenge. A lot of time can be spent in the analysis and build phases, manually tweaking options and source code without fully understanding the effects. Unpredictable interactions can cause unexpected changes in run-time behavior. What works for one program or one system may make things worse for another. Trivial code or memory layout changes can have unexpected effects on memory access patterns and timing, even in unrelated parts of the program. Attempting to optimize memory use in one place just pushes the problem elsewhere. Optimization becomes a game of "Whack a Mole".
After many iterations, you eventually run out of time and have to ship your product using output which is acceptable. This isn't what your design capable of, or what you expected!
Download a free trial of SOMNIUM DRT
Got a question?