PIC16: Entendiendo el límite del argumento para _delay

2

Mi compilador PIC16, XC8, define una pseudo-función _delay(n) que inserta un retraso de n ciclos. Sin embargo, hay una restricción (consulte aquí , página 59):

  

El argumento de retardo debe ser una constante y menor que   aproximadamente 179,200 para dispositivos PIC18 y aproximadamente 50,659,000   para otros dispositivos.

¿De dónde vienen estos límites superiores? La factorización de 50,659,000 (2 ^ 3 * 5 ^ 3 * 7 * 7237) no parece arrojar ninguna idea.

    
pregunta Randomblue

2 respuestas

3

_delay se genera en el momento de la compilación, por lo que el código no es necesariamente el mismo para todos los valores, pueden rellenarse o incluso crear bucles compuestos para lograr el número exacto de ciclos deseado.

50659000/2 ^ (8 * 3) es aproximadamente 3. Por lo tanto, probablemente el bucle central que están usando es un bucle de 3 instrucciones (si se necesita un microcontrolador de 8 bits, se necesitan 3 reducciones para una variable de 3 * 8 bits). Dado que salta en 3, pueden rellenar con uno o dos nop para obtener el número exacto de ciclos. Esto requiere la disminución y el salto si / si no es posible la instrucción cero (y con / sin acarreo).

    
respondido por el apalopohapa
1

Primero, si la respuesta es importante, entonces no deberías usar un compilador.

En segundo lugar, independientemente de la razón que desee conocer, la respuesta es buscar en el código fuente. Esto probablemente se implementa como una especie de macro en tiempo de compilación. Si es así, la fuente tiene que estar donde la puedas ver. Si llama a una rutina de biblioteca, puede que no esté disponible. Sin embargo, aún puede crear un programa de prueba con él y luego realizar un solo paso a través del retraso en la ventana de memoria del programa en MPLAB para ver qué está pasando.

Lo más probable es que los números impares provengan de bucles anidados. El bucle interno probablemente sea el mínimo necesario para realizar la comprobación y el bucle de finalización del bucle, por lo que sale de los ciclos a los que salga. Esto podría introducir factores primarios de aspecto extraño en los ciclos máximos.

En cualquier caso, esta es una mala manera de hacer retrasos de más de unos pocos ciclos. Nunca debe estar cerca del máximo que esta función puede retrasar. Si se encuentra con ganas de demorar más de unos pocos µs, debería volver a pensar en su arquitectura. Haga más tiempo con una interrupción periódica regular, por ejemplo.

Añadido:

También acabo de notar que se dice que los retrasos máximos fueron aproximadamente el número de ciclos enumerados. No se puede derivar nada significativo de los factores primos de los valores aproximados.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas