Estoy usando un dsPIC33E MUC para conectar una cámara UART (VGA) a 115.2 Kbps. El propósito es guardar una imagen en una tarjeta SD.
El programa que escribí funciona bien, excepto que está dentro de un bucle que comprueba si el búfer (el búfer de 512 bytes es para un sector) está lleno o no. Si el búfer está lleno, se escribirá en una tarjeta SD. Me pregunto cómo puedo adaptar este código a un proyecto de adquisición de datos de tiempo crítico. Como se trata de una interrupción UART, no estoy seguro de si la mejor manera de guardar imágenes en una tarjeta SD es usar una bandera. Aquí está el código con el indicador de comprobación de bucle para ver si el búfer está lleno.
unsigned char buff[512];//buffer to store bytes comming from the camera
unsigned int bufferPtr=0;//pointer for the buffer. It will be incremented for each byte
while(1){
if(bufferPtr==512){Write_Sector(SectorNumber,Buff);}//if the buffer is full, Write a it to SD card
bufferPtr=0;//reset buffer Pointer so next byte will be save to the beginning of the buffer
}
rutina de interrupción
void ISR(){
Uart.FlagBit=0;//clear flag bit first
buffer[bufferPtr++]=UART_Read();//read a byte and put it into the buffer
}
Como puede ver, el programa está esperando que lleguen los bytes y los guarde en un búfer. Funciona muy bien, pero tengo una pregunta sobre el tiempo. En términos de velocidad de escritura, necesita aproximadamente 3.6 segundos para 2000 sectores (cada sector 512 bytes). Así que escribir un sector necesita 3600/2000 = 1.8ms. La velocidad en baudios me dice que 115200/10 = 11520Byte / Sec, lo que significa 11.52 Bytes / ms. ¿Cómo es posible escribir un sector en la tarjeta SD (necesita 1,8 ms) sin desbordar el búfer UART FIFO? Durante ese período de 1.8 ms, habrá 11.52 * 1.8 = 20.736 bytes entrando.