Puntero de función en lenguaje C

1

Tengo un pequeño problema con los punteros de función en un código para el microcontrolador Microchip Pic 18 Series.

El siguiente código muestra los prototipos de las funciones involucradas en el problema y una llamada a la función 'insert_task', que debe recibir la dirección de la función 'task1' por el parámetro 'task'.

Sin embargo, estoy depurando el código en Proteus Isis y el parámetro 'tarea' no recibe la dirección de la función pasada como argumento. Más específicamente, el parámetro 'tarea' no recibe nada.

¿Alguien puede ver un error en el código?

void insert_task(uint8 priority, type_t type, void (*task)());
void task1();

insert_task(0, 0, task1);

La siguiente pantalla de impresión muestra el campo "valor" del puntero "tarea" ("tarefa" en portugués) sin un valor durante la llamada de "insert_task" ("insere_tarefa" en portugués).

    
pregunta JYelton

4 respuestas

2

El único error en su código es esta línea: void task1();

Esto es solo prototipo de función. Necesitas escribir la definición de la función.

Reemplace esta línea con el siguiente código:

void task1()
{
  /* Write some code here */
  Nop();//No operation
}

El prototipo de la función de escritura no asignará memoria.

    
respondido por el GOKU
1

Si está utilizando el compilador XC8, maneja los punteros a las funciones creando una tabla de salto en la memoria de código. El puntero de la función real es entonces un valor de desplazamiento que se utiliza para indexar la tabla de salto.

En un depurador, nunca verá la dirección del espacio de código real de la función en el puntero. De hecho, si pasa un puntero a la primera función en la tabla, el valor del puntero será cero correctamente.

    
respondido por el Dave Tweed
0

Creo que el problema es un error en Proteus. Intenté depurar el código en MPLAB X y ahí funciona. Gracias por tu ayuda!

    
respondido por el user49894
0

También tenga en cuenta que muchos compiladores de uC tienen configuraciones de optimización que causan problemas con los punteros de función. Las rutinas de optimización aparentemente no pueden "ver" que algún código realmente se usa y se optimiza. Si tiene suficiente espacio de código, recomiendo desactivar o desactivar el nivel de optimización hasta que haya terminado la depuración, y luego aumentar la optimización y ver si todavía funciona.

    
respondido por el mixed_signal

Lea otras preguntas en las etiquetas