Many good answers already to this question. I think you need to decide what the word firmware means for you and / or what you want it to mean. Perhaps your definition is really not inline. My definition means the lack of an operating system. And that would probably upset many software engineers, but experienced ones like the ones who already answered would probably understand our variations in the definition and why. I think they will call me a microcontroller specialist, and this is certainly true, but I spend most of my time on full-speed processors with memory and rom and I / O, network, etc. I am the guy who brings hardware for the first time, washes the board and chip errors, and then passes it on to what most would call software engineers. I am an electrical engineer by profession and a software engineer by profession, so I saddled the line.
It is very possible, and not uncommon, that you can stay in the built-in C / C ++ world, never have to read a technical description or diagram, all you have to do is call the api that someone else created. There is a large and increasingly large market for this, like what used to be (my definition) true built-in, or built-in rtos (which is often apy calls, and not a complete experience) for this linux-built thing that exploded. There is nothing wrong with that, it’s pretty close to the experience of developing code for the desktop, but you need to try a little harder for reliable code, since it may be based on flash / rom and they may not want to have weekly / monthly units updated in the field . Ideally, never update, but it is also becoming increasingly rare.
The embedded linux api is based on rtos / embedded and can still be different than what I call application programming. You can still or want to read the table or diagram, you still need to know the assembler for the target platform.
I like all the answers so far to this question, I think we are struggling to understand what you really ask or what you really look for in life, add to what we like in our choice and you will get this combination of answers .
I see several groups, of course, there is a good old real built-in microcontroller, but even this turns into libraries and apis, and not metal, look at the arduino and stellaris community and a bunch of others. I spend a lot of time training and testing on board, you should know a fair amount of all the system hardware, registers, circuits, etc. You need to know enough assembler both to load things from reset, and how to debug things, looking at dismantling dumps and look for signs of life in I / O buses or memory buses, etc. If you are lucky, you will also start working on the design of the chips and get the opportunity to monitor the implementation of your instructions in the simulation. The next group is the bootloader / operating system. The hardware is working pretty well at the moment, the chip boots, the memory seems to be working, the rom is. This command writes the production boot code and gets the product from inclusion in the embedded system, rtos, linux, vxworks, bsd, whatever. it is talent in itself, a toolchain, a root file system, etc. The next group is the masses, software developers who write applications for this operating system, now some will read data tables, diagrams, etc., writing device drivers or apis for other users, and at the highest level there may be someone whoever programs at the application level, calls api and sdk, some of which can be developed by the company, some of which can be acquired or others.
Bottom line: Absolutely, there are built-in functions. Are you going to know everything? NO, perhaps 20 years ago, probably 40 years ago, and not today the field is too large and wide. What are the best things you can do for yourself in this area? Learn assembler for several sets of instructions. The most popular, of course, is the hand, the version of the thumb, maybe mips or powerpc or others. If you are leaning towards microcontrollers, study (hand, thumb) avr, pic (blah), msp430, maybe 8051. Read some data sheets, microcontrollers can teach you, even if this is not the field you want, tons of development for $ 50 / eval boards (e.g. sparkfun.com) that provide fact sheets, simple schemas, assembler, C, etc. If you are a software developer, learn to speak hardware guys, people with software and hardware do not speak the same language, if you can avoid the choice of parties and remain neutral and speak both languages so that you help yourself, your career and with whom whatever you work. Despite any personal views you may have regarding entants or bit or byte numbering, you will probably have to deal with some comic things and talk with clients / colleagues who can only deal with octal (yes, really) or deal only with msbit something equal to zero. I recommend looking at verilog and possibly vhdl. At least in a readable sense, it is not necessary to create it from scratch. If you can already program and know C, this is very readable. Depending on the work and colleagues, Verilog and the schema may be your only documentation that you use to write your software. If you cannot do this, they can replace you with someone who can (rather than force hardware people to document their materials).