Electronics: Know Ohm's law, typical voltages for electronic logic, know how to read a schematic and use an oscilloscope. Understand exactly how a computer really works. Ideally, design a simple one, and implement it with Verilog and a FPGA. (See the WIkipedia articles) Write a PID feedback loop (see the Wikipedia article). Ideally, learn control theory, and how to do digital signal processing: filter design, software PLLs, signal synthesis. Design a working software radio and you'll probably get hired just for that.
Mechanics: Know how to use a screwdriver and a wrench. Work on a car, bicycle, scooter, whatever, and fix it. Embedded systems control -machinery-, and the programmers are the -last- ones to work on the machine, so they get to fix, or identify all the problems: electrical and mechanical. If you can't do that, don't start, because you'll fail.
Software skills:Learn real-time programming: Program something
with two cooperating interrupts that runs for a week with no errors, understand Knuth's books. Understand a "design of operating systems" book like the one recommended in the MIT free courseware. Know C, C++, and at least one MS windows language (VB, etc.) so you can write software on the PC to talk to your project(s). Java is universally taught in C.S. and almost useless for embedded software. Program several assembly languages (e.g. PIC, ARM, MPU 430, 8051; PCs don't count),
write the code to start a piece of electronics from bare metal (no OS to help). Read the wikipedia article on embedded systems, computer, digital logic, etc, and follow all the links. The hot "new" thing is to be able to port a Linux kernel- so port it. Really. Port a real-time OS (there are open-source ones around).
Know a software design method (XP is not a design method).
Maths? Without algebra you'll be UTTERLY LOST at some crucial point when designing a control system. Trigonometry, calculus and physics help to control machines and do signal processing. Complex analysis is widely used for signal processing.
Last of all, be young, and have a B.S.C.S, B.S.E.E. or B.S.C.E with a grade of B+ or better from a good school. Most large companies won't hire people older than 35, and won't give programming jobs to people without a degree, or people with bad grades. You -must- get an internship as an undergraduate in order to get your first programming job. You must get three years of experience before you can get a second job.
The likelihood of getting -another- job divides by half every ten years after 25. There is -no- shortage of embedded software engineers. The companies claim that only so that they can import cheap foreign engineers. Medicine, Law, Civil Engineering, Mechanical Engineering, Industrial Design and Architecture are easier, have better pay, and let most people work until retirement. Real-estate pays best of all, and requires almost no skills at all.
Answered By: Ray V - 7/7/2006