Autor Tema: Necesito Idea sobre manejo de Buffer  (Leído 3925 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Necesito Idea sobre manejo de Buffer
« en: 17 de Agosto de 2015, 15:40:46 »
Como esto involucra un RTOS lo pongo aca.

Estoy en una duda existencial. En realidad tal ves me estoy haciendo mas problema del que deberia.
Para mi proyecto final de carrera tengo pensado hacer un datalogger, y pensado usar un RTOS, por que usar un RTOS? por multiples motivos pero lo principal es aprender, ya que nunca antes habia realizado ningun programa con un RTOS.
El datalogger posee una interfaz con un TFT para una configuracion y poder ver los datos de forma local,  tambien una interfaz ethernet para verlos remotamente.
Por que complicar el datalogger? nuevamente para aprender. Ya que tranquilamente podria hacerlo con un PIC, tirar el stack de microchip con un ENCxxJxx y  y que me escriba a una SD/memoria y listo.

En fin. Tengo que leer/escribir a una tarjeta SD, esto tiene un task propio y pienso activarlo cada cierto tiempo usando un semaforo y una interrupcion de uno de los timers del micro.
Por otro lado tengo una interrupcion con un timer que va a capturar los datos, una interrupcion por el solo motivo de tener algo mas de rapidez al tomar los datos, para esto pensaba hacer uso de un Queue, y cada tanto habilite un task que limpie ese Queue, arregle los datos y genere los datos para guardarlos en la SD dejandolos en un buffer que luego tomara la SD y guardara.

El por que de esto? Por que vi en los sistemas comerciales que uno puede seleccionar el tiempo de grabacion, es decir puedo seleccionar que lo grabe cada 1 segundo / 10s /30s /1m etc.
Esto tambien va a depender de la velocidad de captura de datos, ya que no poseo memoria infinita.

Ahora viene mi peticion a ustedes. Como ven mejor para hacer esto?

- Directamente desde la interrupcion voy llenando el buffer, y tendre variables globales para el buffer y su puntero?
- Hay algo para esto en los RTOS que permita el paso de gran cantidad de datos entre tareas o simplemente tengo que definirlo como una variable global, existe problemas con esto?.
- Alguna otra idea que se les pueda ocurrir que sea mas eficiente?, realmente pense de varias formas pero las mas simples son estas.

Y por ultimo alguno conoce una forma de estructurar los datos como para separar los valores.

Supongamos que tenemos datos digital / analogicos / y por RS485. Esto lleva a que tenga que guardar el tiempo cuando ocurrio y el dato para cada uno de esos. Los cuales obviamente tengo que diferenciarlos.
Podria guardarlos todos juntos, eso es lo mas simple pero al momento de verlo tengo que pasar por todo el archivo para obtener todos los valores. Si uno piensa que la menor velocidad de captura en los equipos comerciales es de 1ms, entonces al segundo estamos teniendo ya 1000 datos. Lo que necesitaria una forma de compresion. Como que se complico un poco la cosa xD.
Tambien como guardar eficientemente datos

Tipo:Tiempo:Dato   (Si no cambia no lo toco y cuando ocurra uno nuevo grabar el nuevo valor)
Tipo:Tiempo:Dato:Contador  (Esto permite un mejor control para saber que exactamente ocurrieron esos puntos)

Conviene realizar una tabla?, dedicare 1 archivo por cada una de las entradas? Aunque eso signifique que tenga solo 20 datos?.
Conviene hacer un link entre datos y datos?
Tipo:Tiempo:Dato:offset_Siguiente

PD: Por ahi no me gusta preguntar cuando es algo como esto (Personal) pero realmente no se cual pueda ser la mas viable u opcion que sea eficiente.

Asi que espero la respuesta de quien me pueda tirar una ayuda, o una idea de como hacerlo. Sino buscare y terminare ejecutando alguna por mi mismo.
« Última modificación: 17 de Agosto de 2015, 15:50:38 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Necesito Idea sobre manejo de Buffer
« Respuesta #1 en: 17 de Agosto de 2015, 19:13:33 »
Yo estoy estudiando e implementado algo de freeRTOS en los STM y me interesa que pongas lo que vallas haciendo!

ahora algunos comentarios

- Directamente desde la interrupcion voy llenando el buffer, y tendre variables globales para el buffer y su puntero?
- Hay algo para esto en los RTOS que permita el paso de gran cantidad de datos entre tareas o simplemente tengo que definirlo como una variable global, existe problemas con esto?.
- Alguna otra idea que se les pueda ocurrir que sea mas eficiente?, realmente pense de varias formas pero las mas simples son estas.

tengo la misma duda que vos, pero pienso que una variable global no deberìa ser la solucion en un RTOS. Si fuese una variable global no opdrìa ocurrir que una tarea esté escribiendo el buffer y al cambiar de tarea, la otra intente acceder a esta no siendo vàlidos los datos? Aunque no conozco la tecnica para pasar grandes volumenes de datos entre tareas...

Y por ultimo alguno conoce una forma de estructurar los datos como para separar los valores.

Supongamos que tenemos datos digital / analogicos / y por RS485. Esto lleva a que tenga que guardar el tiempo cuando ocurrio y el dato para cada uno de esos. Los cuales obviamente tengo que diferenciarlos.
Podria guardarlos todos juntos, eso es lo mas simple pero al momento de verlo tengo que pasar por todo el archivo para obtener todos los valores. Si uno piensa que la menor velocidad de captura en los equipos comerciales es de 1ms, entonces al segundo estamos teniendo ya 1000 datos. Lo que necesitaria una forma de compresion. Como que se complico un poco la cosa xD.
Tambien como guardar eficientemente datos

Tipo:Tiempo:Dato   (Si no cambia no lo toco y cuando ocurra uno nuevo grabar el nuevo valor)
Tipo:Tiempo:Dato:Contador  (Esto permite un mejor control para saber que exactamente ocurrieron esos puntos)

Conviene realizar una tabla?, dedicare 1 archivo por cada una de las entradas? Aunque eso signifique que tenga solo 20 datos?.
Conviene hacer un link entre datos y datos?
Tipo:Tiempo:Dato:offset_Siguiente

PD: Por ahi no me gusta preguntar cuando es algo como esto (Personal) pero realmente no se cual pueda ser la mas viable u opcion que sea eficiente.

Asi que espero la respuesta de quien me pueda tirar una ayuda, o una idea de como hacerlo. Sino buscare y terminare ejecutando alguna por mi mismo.

Me parece, sin pensarlo mucho, es que lo común es hacer un archivo por lote de muestreo. O sea, configuro el dataloger para muestrear cierta cantidad de canales con una tasa determinada (fija para todos los canales). Luego el archivo sería tipo tabla, una fila para cada muestra y una columna para cada canal. Quizás el archivo podrìa tener un encabezado con la configuracion del lote de captura... yo arrancarìa con eso, una simple tabla separa por comas o algo así. luego podes investigar alguna otra forma más compleja si es que necesitas agregarle complejidad al proyecto...

saludos
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
-
Leonardo Garberoglio

Desconectado Tisco

  • PIC16
  • ***
  • Mensajes: 108
Re: Necesito Idea sobre manejo de Buffer
« Respuesta #3 en: 18 de Agosto de 2015, 06:14:35 »
Yo para transferir grandes cantidades de datos uso los google protocol buffers (hay la versión nanopb para uC).

La verdad es que son muy prácticos, pues te permite trabajar con varias versiones de tus paquetes de datos sin mucha dificultad.

Saludos!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Necesito Idea sobre manejo de Buffer
« Respuesta #4 en: 18 de Agosto de 2015, 08:27:50 »
servirá esa info?

Lo tenia en PDF con ese como que empeze a ver como es FreeRTOS, de todas formas termina siendo lo que pensaba, no usar nada del RTOS, lo que estaria pasando que es el pointer eso lo haria siempre ya que no cambiaria., A lo sumo puedo llegar a pasar el largo si es que lo necesito.

Ademas se me simplifica un poco este tema por que el manejo de memoria que elegi para el FreeRTOS no libera la memoria RAM. ( Aunque los que mas consumirian serian internet y la SD nomas ). Por eso elegi esa forma.

Citar
Yo para transferir grandes cantidades de datos uso los google protocol buffers (hay la versión nanopb para uC)

Veo que intenta hacer una base de datos, esta interesante, lo que no se es como reaccionara con la SD conectada por SPI
Creo que me estas hablando sobre el tema de los archivos. Por que si fuera entre task, no veo por que aplicarlo creo que es mas simple el puntero al array.
Ya encontre el nanopv y le voy a dar una leida a la documentacion para ver exactametne que hace y si puedo aplicarlo. Gracias por el dato. Aca dejo el link del nanopb:
https://code.google.com/p/nanopb/
Por si el garbe tambien le quiere dar una ojeada.
« Última modificación: 18 de Agosto de 2015, 08:35:03 por KILLERJC »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Necesito Idea sobre manejo de Buffer
« Respuesta #5 en: 18 de Agosto de 2015, 10:22:28 »
Yo para transferir grandes cantidades de datos uso los google protocol buffers (hay la versión nanopb para uC).

La verdad es que son muy prácticos, pues te permite trabajar con varias versiones de tus paquetes de datos sin mucha dificultad.

Saludos!

muy interesante, pero no se hasta donde aplica a lo que necesita KILLER, quizá parta la parte de alamacenamiento de los datos puede servir...
-
Leonardo Garberoglio

Desconectado Tisco

  • PIC16
  • ***
  • Mensajes: 108
Re: Necesito Idea sobre manejo de Buffer
« Respuesta #6 en: 18 de Agosto de 2015, 10:26:54 »
Las aplicaciones son varias; aunque en mi caso, para lo que más los uso es para transferir datos entre dos uC, los distintos cores de un mismo uC y entre los distintos processos que se ejecutan en cada core (creo que este último caso es el que os aplicaría a vosotros).

Un saludo!

Desconectado juaperser1

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 2976
Re: Necesito Idea sobre manejo de Buffer
« Respuesta #7 en: 18 de Agosto de 2015, 11:07:23 »
Hola killerjc, el primer post que haces desde que estoy registrado, jeje.

Te gusta bastante complicarte la vida, un RTOS para un datalogger,  :D :D, a mi también me gusta complicarme la vida.

Tu proyecto sin embargo, me recuerda mas a un cliente-servidor, es solo una idea vale, pero imagina tus datos como si fueras un cliente ( tu datalogger) y te suscribes a un servidor ( los datos a recibir), de esta maneras tus datos serán TIPS, estructuras o matrices donde puedes poner los datos que quieras, el tiempo, el dato numérico, la importancia del dato, lo que quieras.

De esta manera tendrás un task que reciba los datos y no pierda ni uno mediante un buffer circular, de esta manera no pierdes datos ni se llena la memoria, sino, que en el hipotético caso de que se llene el buffer se pisan los datos mas antiguos (ya procesados).

Otro task se encargara de procesar los datos, de manera inteligente, por ejemplo si estas recibiendo un dato cada 1ms y ese dato no cambia en 50 ms para que guardarlo 50 veces¿ como en el TIPS llebas el tiempo y el periodo de muestreo sabes cuantas veces has recibido el mismo dato,  y para uno analógico puedes meterle una histeresis para determinarlo como un cambio o no.

En cuanto a las variables globales para los datos yo no lo descartaría y vería como se comporta, el task de procesamiento y guardado del dato es de 10 ms y el task de adquisición va a 1 ms no pasa nada porque cada 10 ms se bloque la variable global durante algún ms se perderán datos pero tu los estas pillando cada 10 así que sin problemas.

Pff no se es que hay muchas maneras de hacerlo pero cual es la mejor? Es complicado.

Un saludo.
Visita mi canal para aprender sobre electrónica y programación:

https://www.youtube.com/channel/UCxOYHcAMLCVEtZEvGgPQ6Vw


 

anything