circuitcellar.com
Magazine Support   Digital Library   Products & Services   Suppliers Directory 
 
 





Priority Interrupt Archive

 
November 2005, Issue 184

Priority Interrupt
by Steve Ciarcia


Back to Basics

 

These days too many technical professionals call themselves embedded-systems programmers. Unfortunately, this employment category has morphed to encompass virtually anyone who writes software for a controller that is subsequently “embedded” into a product design. If you are an engineer writing java code for the PC buried inside an airport luggage scanner, embedded-systems programmer is now on your resume. A guy who writes an entire real-time operating system for a portable EEG in assembly language so that it fits in 30 KB of flash memory calls himself an embedded-systems programmer too.

Call me prejudiced if you want, but as a guy who remembers when the whole software world could fit in 64 KB, I think the only real embedded-systems programmer is someone who has a fundamental knowledge of the low-level computer system operation for the device being programmed. I don’t mean only assembly language programmers, but surely that’s about as low-level as you can get.

In the beginning, engineers had to be very talented to fit everything necessary into a limited space. They had to have a detailed understanding of system architecture and even do things in assembly language if execution speed and program efficiency demanded it. Very few people had this expertise, and the number of technical professionals who called themselves embedded-systems programmers was limited.

As more memory and processing power have been added to controllers, less programming efficiency and less expertise on the part of the designer have been required. Instead of an expert programmer having to spend weeks optimizing assembly language code to digitize video on a 12-MHz 8051, a less experienced individual can now do it easily with a 40-MHz 8051-core SoC (about 10× performance increase) with a hundred times more memory and a dozen built-in peripherals. Today, programmers don’t have to worry about clock cycle times or memory access speeds, because the processing power and memory of modern CPUs and SoCs have increased so much that even an inefficient, poorly written C++ program can usually stumble along and perform its intended tasks. If a program won’t run and doesn’t quite hack it, programmers can always count on the next hardware iteration to have enough added performance to fill in for inefficient and disorganized code.

The problem is that Moore’s law will eventually run out of gas. While the internal complexity of processors still might be doubling every 12 to 18 months, clock frequency and processing efficiency are no longer doubling at the rate they were 10 years ago. In another decade, it will all stop.

Old codgers like me find it absurd that anyone would call himself an embedded-systems engineer without an understanding of hardware. In fact, the latest generation of software engineers has grown up using high-performance development tools that specifically avoid machine dependency. In essence, they were taught that all computers are the same. They were told that any computer has more than enough processing power and memory to accommodate using high-level language software, so they give little thought to efficiency. These inexperienced developers usually write code without considering its performance or the unique attributes of their target system.

Employers are starting to become savvy about the different experience levels within the embedded-systems jobs category. In an effort to separate computer-application-level software engineers from true embedded-systems designers, these days it is not uncommon to see job postings that include statements like, “must know assembly language programming and understand low-level hardware.” In all truth, I doubt any of these companies want someone to actually code processors in assembly language, but this is the terminology they use to draw the line in the sand in front of all the java programmers who like to call themselves embedded-systems engineers. 

This isn’t a sermon. I readily admit that I’m one of those people who counts on the next processor improvement to clean up inefficient code. My expertise was hardware at a time when there were choices about how much hardware and software you wanted to use in your system design. Today, there is little choice. True embedded-systems engineers have to know both hardware and software. I’ve never even hinted at the notion that I’m a “programmer,” system or otherwise. I make no apologies when I point out that programmers should broaden their expertise if they want to add the word “embedded” to their resumes. Everyone else is a brute-force coder and that’s as good as it gets, just like me. Good thing I don’t have to earn a living at it.