With 8 and 16-bit microcontrollers based embedded systems, it comes down to it is easier to develop software that can fit into the limited resources of these very modest storage limitations (maybe a few 100 bytes of RAM for low-end 8-bit microcontrollers, with 2-8 KiB of ROM or EPROM/Flash for code storage).
In those cases small languages like C or assembly tend to be the most commonly used development languages. As a very rough relative comparison, a complete assembler and C99 compiler can fit onto a single floppy disk, while you need several MiB for a modern C++ development system (with STL, etc.).
When you are looking at higher end micros (high-end 16-bit, and mostly 32-bit, with fairly rare 64-bit) and DSP in embedded environments then the restrictions weaken, and software development may make up the bulk of the development effort, so it makes sense to use the most productive development tools, including more advanced languages with features like Object-Oriented Programming (OOP) languages such as C++, and newer languages (Java, Perl, Ruby, Python).
It is possible in assembly and C to predict how much memory is being used, so that a space constrainted design is feasible, but advanced features such as templates, exception handling, and run-time binding make it impossible to exactly know the necessary memory footprint for a standard C++ program in advance. I don't know enough about MISRA C++, which is a subset of C++, to comment on it.
Languages based upon virtual machines running byte-code (Java, Perl, Python) are less mature in the embedded developer's experience, and as these languages are designed to insulate the programmer from the particular hardware, it also makes it more difficult to be conscience of such embedded hardware system's limitations and restrictions. These is less of an issue with fast 32-bit processors (e.g. ARMv7) with MiB if not GiB of RAM.
All the BASIC implementations that I'm aware of are quite simplistic in the language features, remaining largely true to the legacy of Dartmouth BASIC from the 1960s. This means that the language doesn't have any complex run-time libraries or exception handling, and an interpreter or compiler is fairly simple to write and is small in file size as well.
Most microcontrollers have at least one BASIC compiler available for it.
I hope that outlines in broad strokes the reasons you'll find C and assembly primarily used on smaller or older embedded systems, and with the limitations of newer mid to high-end embedded systems differ only slightly from a traditional desktop personal computer.