Función llamada en ISR y Directiva de superposición -Keil / 8051 core

1

Mi código C tiene un ISR, donde se debe tomar una decisión para ejecutar una función particular "A". Ahora sé que no es bueno ejecutar una función en un ISR. Pero en este caso de mi aplicación, no veo otra salida. Después de llamar a la función "A", noté un salto repentino en el tamaño de los datos consumidos y la ADVERTENCIA L15 repentina explicada en KEIL EXPLICACIÓN DE LA ADVERTENCIA .

Estoy seguro de que la función "A" no se ejecuta de manera reentrante, pero sí consume memoria física; tanto la función "A" como las funciones que llama. (Creo que esto se refiere a las variables declaradas en las funciones).

En primer lugar, ¿hay alguna manera de evitar el disparo en el espacio de la memoria de datos?

En segundo lugar, quiero aplicar el método 2 como se muestra en la explicación de keil. Pero no sé cómo & donde exactamente insertar la directiva OVERLAY en mi código. ¿En la inicialización? ¿En función de la declaración? Antes de la definición de la función? ¿Dónde exactamente?

EJEMPLO DE ADVERTENCIA en mi Código

*** WARNING L15: MULTIPLE CALL TO FUNCTION
NAME:    _IECLOC_FUN/DATA_ACCESS
CALLER1: ?C_C51STARTUP
CALLER2: TIMER_ISR/TIMER

ADVERTENCIA DE SIGNIFICADO

Se agradecerán correcciones, sugerencias, ejemplos de código y enlaces. Espero que esta pregunta sea clara.

Gracias a todos.

    
pregunta Paul A.

2 respuestas

2

Comprenda que con Keil en 8051 núcleos las variables locales de la subrutina y cualquier argumento de entrada más allá de lo que cabría en los registros, el compilador asigna RAM para la ubicación de estos. El enlazador luego tiene un trabajo complicado que realiza para analizar la estructura completa del árbol de llamadas de su programa y optimizar el conjunto de memoria asignada para estos fines a fin de minimizar la cantidad de RAM requerida. Esta minimización utiliza la exclusión mutua entre secuencias de llamadas de código para determinar qué partes de la agrupación de memoria se pueden compartir entre rutas de código que no se superponen en el flujo de ejecución.

Cuando inyectas una llamada ISR en la combinación del árbol de llamadas de código, el enlazador no puede determinar desde qué punto puede entrar en juego la interrupción. Podría aparecer en cualquier momento durante cualquiera de las rutas de exclusión mutua que el enlazador encontró en el código de línea principal normal. Esto significa que el vinculador debe extraer la subrutina del grupo de uso compartido y asignar espacio de datos específicamente para las variables locales de la subrutina y quizás incluso algunos de sus argumentos de entrada. Sin esto, los grupos de memoria compartida de otras rutas de ejecución de código mutuamente excluyentes se contaminarían y el programa se estrellaría en la gloria ardiente.

El desafío cuando se codifica en un núcleo 8051 es tratar de alejarse de los diseños que usan muchas variables locales, tienen muchos argumentos de entrada y tienen contextos de llamada que se comparten entre el código de la línea principal y las interrupciones. Realmente tiene que limitar las libertades que obtiene con otras arquitecturas que tienen una pila que se utiliza para el paso de argumentos de subrutinas y variables locales. Keil optó por no implementar todo en la pila y, por lo tanto, produjo un conjunto de herramientas que ofrece rendimiento y optimización de primera clase en la industria para la arquitectura 8051. Y por esa razón, es importante adaptar un estilo de codificación que se adapte al esquema de Keil.

En su caso, realmente recomiendo que reconsidere su determinación de que esta subrutina debe llamarse tanto desde el contexto de la línea principal como desde el contexto de interrupción. Intenta encontrar una técnica de diseño que evite esto y tu vida será mucho más simple.

    
respondido por el Michael Karas
1

La directiva OVERLAY es un comando para el vinculador, y no entra en absoluto en su código fuente. Puede colocar directivas en la línea de comandos de BL51, pero para cualquier cosa no trivial, generalmente es mejor colocarlas en un archivo de comandos de vinculador separado y pasar ese archivo al enlazador utilizando la sintaxis BL51 @<commandfile> en la línea de comandos.

Consulte la referencia de línea de comandos para BL51 aquí .

    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas