This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

processing speed - C or assembly?

Hi,

I'm doing a fast processing application, and undecided whether to use C or Assembly language.

When programming in C the code must be translated to assembly and some of instructions are divided in multiple registry operations, does C programming brings any disadvantage regarding the output speed of the MCU msp430?

  • Joaquim de los Santos said:

    ..., and undecided whether to use C or Assembly language.

    Hi Joaquim,

    Perhaps one good approach of the problem is to implement your algorithms in C, study them, and if necessary code them in asm.

  • Jean-Marc Paratte said:
    one good approach of the problem is to implement your algorithms in C, study them, and if necessary code them in asm

    Absolutely!

    To be able to outsmart a decent compiler, you will need to be a very good, experienced assembler programmer

  • Andy Neil said:
    To be able to outsmart a decent compiler, you will need to be a very good, experienced assembler programmer

    True for the common case. I would never even try to write an application in Assembler (though I did such thing many years ago for the C64 and PC-XT, and later for the PC/GEOS operating system, but compilers weren't that smart then)

    However, for small specific algorithms that use details of the processor architecture and can make assumptions about the current program state the compiler cannot make, using assembly language can give a significant speedup.

    One example is usign the MPY32 hardware multiplier for complex multiply.accumulate operations, something you can of course code in C but won't be even nearly as efficient due to the limited way the compiler can concatenate mathematical expression chunks to a complex hardware use.
    It's like coding an SPI transfer by toggling I/O pins in software. The compiler can optimize the code better than you ever could by yourself, but is unable to detect that the hardware could do it way more efficiently if using an USCI module. (well, in this case no assembly is required, but it's the same base problem)

    And sometimes the limitations of the C language are a problem. So to get a 32 bit multiplicaiton result, you'll have to multiply two 32 bit numbers. If you multiply two 16 bit values, the result will be 16 bit only. that's how C is defined. However, the hardware multiplier can produce a 32 bti result form two 16 bit operands, which usually is what you wand and whcih is much faster than what the comiler is allowed (!) to produce.
    Using hand-crafted inline-assembly macros isntead of a simple '*' operator gives a significant speed boost on complex calculations.

**Attention** This is a public forum