C for embedded controllers (was Re: Timed mechanical fuel

Charles S. Tosch c1icst1 at kocrsv01.delcoelect.com
Tue Nov 28 16:02:21 GMT 1995


>	Message 11:
>	From owner-diy_efi-outgoing at coulomb.eng.ohio-state.edu Wed Nov 22 12:42:42 1995
>	From: Ed Lansinger <elansi01 at mpg.gmpt.gmeds.com>
>	Subject: RE: C for embedded controllers (was Re: Timed mechanical fuel injection ) 
>	To: diy_efi at coulomb.eng.ohio-state.edu
>	Mime-Version: 1.0
>	

<Mucho stuff deleted>

>	I have yet to see a meaningful difference in productivity for small
>	projects such as I believe we are discussing here which is the
>	result of language alone, assuming equal familiarity and practice with
>	two languages in question.  The real differences seem to come through
>	design tools, support tools such as simulators and debuggers, code re-use,
>	and (for larger projects) effective project management.  But note that
>	assembly language precludes none of that.
>	
>	What is unfortunately true for embedded systems programming is, as a general
>	statement, assembly language programming is being marginalized or dropped
>	from CompSci and Computer Engineering curricula.  It's getting harder
>	to find new people with assembly language experience.  If you are
>	building programming teams there's pressure to use C because of this
>	simple fact.
>	
>	> Once you get used to
>	>using a high level debugger, like gdb, its very hard to revert back
>	>(and unnecessary) to a low level monitor.
>	
>	I agree with the sentiment that a high level debugger is a Good Thing,
>	but I disagree with "unnecessary" and I don't find it "very hard".
>	When debugging EFI in C or C++ I find I often go down to the assembly
>	language level.  There's a big, implicit leap of faith when you decide
>	to use a high-level language, which is that you trust that the compiler.
>	Actual compiler bugs aside, there is absolutely no guarantee that
>	the compiler interprets your code the way you think it will.  Does
>	it move a word to an I/O address 16 bits at a time or with separate
>	byte moves?  Is it really performing atomic operations on your data
>	to avoid coherency problems the way you think it is?  Just how efficient
>	is it?  What evaluation order did it end up using for that expression?
>	How nasty is the jump through the virtual table?
>	
>	No matter how you slice it, using a high-level language further removes
>	you from knowing exactly what the processor is doing.  For critical
>	embedded systems (and anything that can stall on a railroad track
>	is critical), this is cause for being cautious.
>	
>	>| machine code is more direct to the point
>	>
>	>I don't understand this comment... do not the two programs (C vs
>	>assembly) do the same thing?
>	
>	I don't understand the original comment, either.  However, I contend
>	that there are certain things that are easier to express in assembler
>	than in C and vice versa.  I find complicated decision logic to be
>	easier to express and follow in assembler than in horrific &&-||-!
>	combinations with umpteen levels of nested parentheses (even better
>	is relay-ladder logic).  Conversely, I much prefer to write
>	PulseWidth = k * MAP() * VE(RPM()) than the equivalent in assembler
>	(although I can't say that the assembler really takes me any longer to
>	write and debug).
>	
>	>
>	>| requires less memory
>	>
>	>True, but maybe only by 10-20% with a good optimizing C compiler (gcc
>	>for the 68k is a good example. Optimization is cpu dependent.). With
>	>larger programs it is conceivable the C will be smaller since it
>	>generally promotes better structure.
>	
>	Like art, the medium affects the expression.  No self-respecting
>	assembly language programmer writing anything more than a trivial
>	program would use a whole word to represent a boolean value, much
>	less 16Kb to hold an 8,000-element boolean array.  The same programmer
>	automatically uses a "walking pointer" to search an array rather than
>	indexing because it's the most obvious thing (or uses
>	the built-in search instruction if a CISC machine).  He or she doesn't
>	need to count on the compiler to be smart enough to return a value as the
>	carry flag rather than on the stack because why would you waste the
>	time and space?
>	
>	That same programmer would retch knowing that linking in sprintf() pulls
>	in umpteen K of routines to convert %g,%e,%G,%E,%f,%x,%X,... formats
>	when all that is needed is %s and %d.
>	
>	I really don't think the statement that C beats assembler for code space
>	as programs get larger is supportable.  We're moving to C right now
>	from assembler at GM.  The code does the same things (i.e. the car
>	runs with all the same features) but we're looking at a huge increase
>	in ROM space (much more than 10-20%).
>	
>	I have no problem with the overhead typically found in C programs if
>	memory and CPU power is cheap.  But sometimes it isn't.  If you are truly
>	going to optimize for time and space, you need to have
>	control over every aspect of the code.  You can only do this with
>	assembly language, or if you have source for the compiler and are willing
>	to mess with it.
>	
>	>| hardware often can be made simpler
>	>
>	>This is nonsense.
>	
>	I agree 100% with John.
>	
>	>Remember, assembly can easily be placed in-line
>	>within any C code.
>	
>	As an aside, I personally don't like in-line assembler.  I find I get
>	greater flexibility when I link the assembler separately, especially when
>	using a source-level debugger that has no problem switching languages
>	midstream.
>	
>	I am arguing to shore up support for paying continued attention to
>	assembler for this type of programming.  I think it can help us build
>	better systems.  I am not advocating using it preferentially to C or other
>	languages, which I feel can be justifiable choices.
>	
>	The GE Software Engineering Handbook classifies embedded systems programming,
>	especially real-time mission-critical systems, as the toughest kind of all.
>	I much prefer having ALL of the tools available.
>	
>	Ed Lansinger
>	GM Powertrain Premium V (Northstar/Aurora) Software & Calibration Group
>	
>	
>	

I agree with Ed. Their are pros and cons to both approaches,
however I am a fan of assembly language.

The engine/trans controller I am working on uses assembly vs. 
a high level language used for some other programs. Our RAM/ROM 
usage is substantially smaller (~40-50%!) and there is no
comparison in our throughput numbers. This translates into SERIOUS
$$$ at high volume. (I realize this won't apply in most applications
here.)

(Actual dialog)
Dave: What is the throughput on your program?
Chuck: It is about ~80% at 9100 RPM.
Dave: Why the #^@&$&% are you doing testing at 9100 RPM?
Chuck: Because my simulator wouldn't go any higher.  ;)


-- 
Chuck Tosch                     	c1icst1 at kocvrs01.delcoelect.com
Delco Electronics			(317) 451-0869
Kokomo, IN 46904	     		8-322-0869  




More information about the Diy_efi mailing list