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

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

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 temporizadores. Estaba a punto de comprobar si eso funciona y familiarizarme con las interrupciones. Pero no funciona...

Porque como descubrí aquí , no hay funciones de retraso para ARM, así que creé la mía. 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 PC con stdio.h y printf en lugar de asf.h y 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 se bulit sin error. Aquí está mi pregunta. ¿Cuál es la diferencia entre programar en PC y ARM? ¿Qué debo hacer para que funcione la función definida por el usuario? ¿Se necesita alguna biblioteca adicional?

Gracias de antemano.

Si todo funciona como se esperaba, ¿cuál es la pregunta real? Las preguntas que hizo son demasiado amplias para responderlas aquí.

Respuestas (2)

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, de los compiladores integrados, tal como están configurados de fábrica, optimizan las llamadas a funciones que no tienen ningún efecto macroscópico.

Si va al modo de depuración, verá que no puede 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 en su interior no pasa nada.

Dicho esto, Atmel tiene Delay(), Delay_ms() y Delay_us() que utilizan un bucle nop ASM VOLATILE para acercarse mucho a los retrasos garantizados si la velocidad de la CPU está configurada correctamente.

También puede incluir código ASM en línea (búsquelo en Google si lo desea) como VOLÁTIL dentro de su ciclo, haciendo que ejecute una sola instrucción NOP (NOP = Sin operación = No hacer nada). Para ARM GCC, un libro de cocina en línea cita:

asm volatile("mov r0, r0");

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

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


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

¡Gracias por tu tiempo! Sí, la diferencia estaba en la configuración del compilador, desmarqué la optimización y ahora funciona, como esperaba. Atmel tiene funciones de retardo, pero están hechas solo para AVR. Esa es mi investigación dijo, pero podría fallar. Sí, ARM tiene instrucciones NOP, volveré pronto. Primero tengo que hacer frente a cosas más básicas. Gracias por la información sobre eso.

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

Eso es todo. Desmarcar la optimización resolvió mi problema. Gracias