hi Erik,
This is a huge topic :) There are many places you can start. Its even tougher when you consider that the definition for an embedded system is very, very fuzzy. "back in the day", an embedded system was one where the software (or most of it) was burned into ROM. In the early 90's I worked on a point of sale system and controller for gas stations. It was a 'big' 16bit 186 system. It was 'big' in the sense that it had way more than 64k of code spaced - we did that by paging physical ROMs in and out of the address space dynamically.
Today, many things are considered embedded systems, but many are 'softer' in that the software is more conventionally like a PC as is the hardware. For example kiosks and point of sale systems these days are almost always just PCs that present one application (or a controlled UI) to the user.
In my mind, there are two things that define a classica embedded system:
- where you (the system designer or owner) has access to and can change, the source code to everything in the system.
- Where resources such as CPU, memory, I/O, and power are constrained in a significant way.
All the best embedded developers I know got their start wrting all the software for an embedded system from scratch - this means all the code, from the code at the hardware rest vector, to the application code. In many cases this meant building a small, but effective kernel.
A good place to start would be this.
- Decide on something cool or interesting to do.
- Find some inexpensive hardware that can perform the task. There are TONs of do it yourself bare bones hardware systems out there.
- Pick one that has decent development tools that let you work in C or C++. I suggest avoiding things that are programmed in basic or other higher level languages.
- Write all the software for your idea from scratch. Its groovy to use the C/C++ libraries.
This will teach you quite a bit about embedded systems work.
Note, this is not the only or best way to proceed - others will have different suggestions. But, I promise this will teach you quite a bit about embedded systems work.
Added Info
Ok! That's very helpful info. Many embedded systems do not true real time operating systems. Heck, many use a simple main dispatch loop and they work jsut fine.
For your puposes, I would suggesting experimenting with
- RTLinux - you can do this on a normal PC with very good success.
- WindowsCE - is also easy to experiment with using the trial version and the tools are very good (as are the linux tools, but hey, I do work for MSFT)
- PREX looks cool, but I have no experience with it.
One other
1. EBSNet is not free, but it is very good. I used to work with these guys years ago.
Books
1. XINU Operating System Design: The XINU Approach Is an oldie but a goody. Also see the networking book.
2. My favorite thing in this class is MicroC/OS-II The book and the code are great.
MicroC/OS-II works great on PC hardware and will give you all the nitty-gritty access you desire.