Diferencias en el uso de c funciones definidas por el usuario en la PC y en ARM

3

Soy nuevo en la programación en c y en ARM también, así que perdóneme la pregunta tonta. Me gustaría encontrar una respuesta en la red en lugar de molestarlo, pero no hay muchos materiales en la web. Estoy utilizando la placa Arduino Due con Atmel SAM3X8E, ARM Cortex M3 y Atmel Studio 6 en lugar del IDE de Arduino.

Quería crear un programa simple basado en la función de suspensión para parpadear el diodo. Claro, no tiene sentido usar la función de suspensión en lugar de los temporizadores. Estaba a punto de comprobar si eso funcionaba y familiarizarme con las interrupciones. Pero no funciona ...

Porque como descubrí aquí no hay funciones de retardo para ARM , así que creé mi uno. Cuando pongo el bucle for en la función principal (en los lugares que muestro en los comentarios) todo está bien, los diodos parpadean alternativamente. Cuando uso mySleep (), ambos parpadean continuamente. He generado un programa similar en CodeBlocks en la PC con stdio.hy printf en lugar de asf.hy los registros PIO. Eso funciona como yo quería. Aquí está el código a continuación:

#include <asf.h>

void mySleep(void);

int main (void)
    {
    PIOB->PIO_PER = PIO_PB26;
    PIOB->PIO_OER = PIO_PB26;
    PIOB->PIO_PUDR = PIO_PB26;
    PIOA->PIO_PER = PIO_PA14;
    PIOA->PIO_OER = PIO_PA14;
    PIOA->PIO_PUDR = PIO_PA14;

    while(1)
    {
        PIOB->PIO_SODR = PIO_PB26;
        PIOA->PIO_CODR = PIO_PA14;
        mySleep();
        //for(unsigned long long i=0;i<1000000;i++);    
        PIOB->PIO_CODR = PIO_PB26;
        PIOA->PIO_SODR = PIO_PA14;
        mySleep();
        //for(unsigned long long i=0;i<1000000;i++);
    }
}

void mySleep(void)
{
    for(unsigned long long i=0;i<1000000;i++);
}

El programa es bulit sin error. Aquí está mi pregunta. ¿Cuál es la diferencia entre la programación en PC y ARM? ¿Qué debo hacer para obtener el trabajo de funciones definidas por el usuario? ¿Se necesita alguna biblioteca adicional?

Gracias de antemano.

    
pregunta Seedorfan

2 respuestas

5

La diferencia no está en la plataforma.

La diferencia es que CodeBlocks probablemente compila sin optimización en la configuración de Depuración, mientras que muchos, si no la mayoría, compiladores integrados, tal como se configuraron de forma inmediata, optimizan las llamadas de función que no tienen efecto macroscópico.

Si vas al modo de depuración, verás que no puedes poner ningún punto de interrupción dentro de mySleep (). Esto se debe a que el compilador decidió no incluirlo en el espacio de código limitado de su procesador, ya que dentro de él no pasa nada.

Dicho esto, Atmel tiene Delay (), Delay_ms () y Delay_us () que usan un ASM VOLATILE para evitar que el CPU se acerque a los retrasos garantizados. la velocidad se establece correctamente.

También puede incluir el código ASM en línea (google, si lo desea) como VOLATILE dentro de su bucle, haciendo que ejecute una sola instrucción NOP (NOP = Sin operación = No hacer nada). Para las citas de ARM GCC, un libro de recetas en línea :

asm volatile("mov r0, r0");

Volatile significa "¡no tocar!" o de lo contrario "¡No lo optimices para mí!".

Soy demasiado perezoso para comprobarlo, pero creo que ARM también tiene la instrucción NOP.

Probablemente también puedas cambiar la configuración para la optimización, pero eso significa que tu código se volverá enorme muy rápido si recién estás comenzando.

    
respondido por el Asmyldof
2

Nunca dices cuál es realmente tu error, pero sospecho que debido a que tu función no hace nada en general, tu compilador lo está optimizando. Intenta compilar con la optimización desactivada

    
respondido por el Scott Seidman

Lea otras preguntas en las etiquetas