Usando RTC DS1307 en múltiples programas

0

Soy un poco nuevo en electrónica y programación, pero logré poner en funcionamiento un RTC DS1307 cuando solo lo utiliza un programa (estoy usando el código C). Pero si trato de usarlo en varios programas al mismo tiempo, ocasionalmente me da fechas y horas extrañas.

Por ejemplo, estoy usando estos dos programas:

  • test.c
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 #include "ABE_ExpanderPi.h"
 void main() {
    int i = 0;
    while( i < 100 ) {
            struct tm datetime;
            char buffer[80];
            datetime = rtc_read_date();
            if (strftime(buffer, sizeof buffer, "%Y/%m/%d;%H:%M:%S", &datetime)) {
            }
            else {
                    puts("strftime failed");
                    exit(1);
            }
            printf("%s\n", buffer);
            i++;
            usleep(10000);
    }
 }
  • test2.c
 #include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 #include "ABE_ExpanderPi.h"
 void main() {
    int i = 0;
    while( i < 100 ) {
            struct tm datetime;
            char buffer[80];
            datetime = rtc_read_date();
            if (strftime(buffer, sizeof buffer, "%Y/%m/%d;%H:%M:%S", &datetime)) {
            }
            else {
                    puts("strftime failed");
                    exit(1);
            }
            printf("%s\n", buffer);
            i++;
            usleep(10000);
    }
 }

Las funciones DS1307 se pueden encontrar en ABElectronics_C_Libraries .

Cuando ejecuto ambos al mismo tiempo, me muestra algo como esto:

...
 2018/07/11;19:07:53
 2018/80/40;05:06:92
 2018/80/40;05:06:92
 2018/07/11;19:07:53
 2018/80/40;05:06:92
 2018/07/11;19:07:53
 2018/80/40;05:06:92
 2018/07/11;19:07:53
 2018/80/40;05:06:92
 2018/07/11;19:07:53
 2018/07/11;19:07:53
 2018/07/11;19:07:53
 2018/07/11;19:07:53
 2018/07/11;19:07:53
 2018/07/11;19:07:53
 2018/80/40;05:06:92
 2041/53/02;90:12:90
 2018/07/11;19:07:53
 2018/80/40;05:06:92
 2018/07/11;19:07:53
 2018/80/40;05:06:92
 2018/07/11;19:07:53
 2018/07/11;19:07:53
 ...

En mi proyecto usaré el RTC más de dos veces al mismo tiempo. ¿Puedes ayudarme, por favor?

    

1 respuesta

1

El problema que tiene es uno de acceso concurrente. Ambos procesos se leen desde el mismo archivo y, por lo tanto, dependiendo del sistema operativo, un proceso obtiene unos pocos bytes, luego el otro, luego el otro, etc. Los errores serán aparentemente aleatorios y se basarán en cómo el sistema operativo programa las tareas para ejecutar . Por lo tanto, las buenas secuencias ordenadas de información de fecha y hora del DS1307 se cortan y se dividen entre los dos procesos, lo que resulta en un sin sentido para ambos.

Recomendaría buscar en una solución de memoria compartida. Tendrías un proceso único que puede llamar a rtc_read_date que coloca "mensajes" en una estructura FIFO en memoria compartida Luego, todos los demás procesos que necesitan información de fecha y hora podrían tomar los "mensajes" de la estructura FIFO. Esto no es exactamente trivial para un principiante, pero sería bueno aprender. Revisando este repositorio sería un buen comienzo.

    
respondido por el user146139

Lea otras preguntas en las etiquetas