Hi everone,

My thought on the following snippet from the prev mail:-

> By the way, I think it's also better to change your initial example:
>
> unsigned two;
> void foo(void)
> {
>  two = P6IN + P6IN;
> }
>
> into:
>
> unsigned two;
>
> void foo(void)
> unsigned int tmp;
> {
>  tmp = P6IN + P6IN;  //  <-----  tmp = 2 * P6IN;  //  <----- tmp =
> P6IN; tmp+= P6IN;
>  two = tmp;
> }
>

You may think that, but no one will agree with you. There is no benifit in introducing an extra temporary variable here - it simply makes the code more
verbose and thus less readable.  You are writing in C, using a compiler -
you are not writing everything out explicitly in assembler. It is up to the
compiler to figure out what extra temporary variables it needs - in fact,
the compiler will probably internally use exactly the code you have written
out explicitly.  And unless you are specifically compiling with no
optimisation, the code generated is identical with or without the "tmp"
variable.



If an interrupt routine was to access var 'two' a side effect may occur in very rare and extremely difficult to find circumstances using the first version of 'foo'. Suppose the interrupt occurs inbetween the first P6IN read and the second read. Also suppose the compiler decides to use 'two' as a temp rather than allocate another temp (I know the 430 has plenty of registers but can you guarantee one is spare for a temp?) Now for this short moment of time the interrupt routine sees the value of 'two' before it is complete (ie as though foo had been writen 'two = P6IN'). In general this is probably not what the coder wants.

I came across a similar problem writing for another processor architecture (er OK I admit it a PIC). The line

P2 = a+b+c;

was optimised by the compiler to use the port P2 as a temp. However, P2 was a set of control signals to various parts of the system. Having some of them toggle as a result of P2 being part of the summation process was definitely not what I wanted. In hardware edges can be as significant as steady values. A deliberately introduced temp solved the problem.

My conclusion is that to program defenceively always use statements that refer to a port only once.

That's it, hope it helps the discussion,

John Pote


Reply via email to