Autor Tema: ¿Tablas y arrays en flash? SOLUCIONADO  (Leído 119 veces)

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

Desconectado AcoranTf

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 952
¿Tablas y arrays en flash? SOLUCIONADO
« en: 07 de Diciembre de 2017, 10:29:29 »
Hace tiempo me pregunto si existe en C la posibilidad de definir tablas de datos y/o arrays que contengan datos fijos y se situen en la memoria de programa.
El problema es que algunos PIC con poca RAM, pero suficiente flash, podrian ser utiles en algunos proyectos que requieran de esas tablas.
Creo que en ASM si ocurre asi, definiendo los datos fijos como tablas, pero desconozco si en C existe esa posibilidad.

Saludos.
« Última modificación: 07 de Diciembre de 2017, 16:01:07 por AcoranTf »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 6160
Re:¿Tablas y arrays en flash?
« Respuesta #1 en: 07 de Diciembre de 2017, 11:07:24 »
Código: C
  1. const uint8_t tabla[] = {.......};

El const hace que termine siendo parte de la FLASH, luego la forma de poder leerlo desde la flash se encarga el compilador segun lo que tenga a mano el micro, si con RETLW, con TBL de los PIC18, con FSR de algunos PIC16 o con el mismo modulo de la EEPROM.

Pero en C simplemente lo usas como una variable mas, sin preocuparte de eso.

Ademas crear una tabla en RAM, termina siendo contraproducente, no solo porque ocupa RAM de forma constante, sino que ademas los datos de esa tabla tambien debe ser puestos en la FLASH para poder iniciarlizar la tabla. Asi que como regla general, si no debe modificarse nunca, agregale el const.
« Última modificación: 07 de Diciembre de 2017, 11:10:42 por KILLERJC »

Desconectado AcoranTf

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 952
Re:¿Tablas y arrays en flash?
« Respuesta #2 en: 07 de Diciembre de 2017, 14:30:41 »
Muchas gracias KillerJc, es justo lo que necesitaba. Mirare si es compatible con los PIC pequeños, 12 y 16.

Saludos.

Desconectado AcoranTf

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 952
Re:¿Tablas y arrays en flash?
« Respuesta #3 en: 07 de Diciembre de 2017, 16:00:14 »
Bueno lo acabo de comprobar con un pequeño programa que genera un EPWM para puente H con un PIC12F675 y va perfecto. Solo que aumenta un poco el tiempo de lectura con respecto a cuando estaba en RAM, pero a cambio me ha liberado un 55 % de RAM. De un 69 % cuando estaba en RAM, ha pasado al 14 % y en camio la FLASH antes estaba en un 11 % y ha subido al 14 %.
El proximo reto para este proyecto es portarlo a ASM, ya que debido al tiempo consumido por el programa, se presenta una pequeña deformacion de la señal senoidal de salida y supongo que podra ser mejorada al optimizar los tiempos debido al mejor tratamiento del ASM.
El problema es que nunca he hecho nada con ensamblador de los PIC's. Estoy estudiando un poco.

Saludos.

Desconectado remi04

  • PIC12
  • **
  • Mensajes: 83
Re:¿Tablas y arrays en flash? SOLUCIONADO
« Respuesta #4 en: 07 de Diciembre de 2017, 19:09:06 »
Realmente cuando defines una variable y la inicializas eso se graba en la flash y luego al correr el programa pasa a la ram y de ahi se leerá en adelante, por eso los tiempos de acceso son mas rapido.

  Si defines una variable como constante, igualmente se graba en flash, pero no se carga luego en ram y el acceso es mas lento.

 Pregunto, ¿que mas te da que se ocupe casi el 70% de ram durante el trabajo del programa?  La ram está para eso.

Desconectado AcoranTf

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 952
Re:¿Tablas y arrays en flash? SOLUCIONADO
« Respuesta #5 en: 07 de Diciembre de 2017, 21:21:33 »
El problema no es que ocupe el 69 % de RAM, sino que falte RAM. En este caso concreto no se da, pero tengo otros proyectos en que si. Ten en cuenta que el PIC12F675 solo tiene 64 bytes de RAM.
Por otro lado la diferencia de tiempo consumido por el programa varia muy poco entre los dos casos. El programa es muy simple, las definiciones necesarias, la tabla de 32 bytes y dos rutinas for, en las cuales se activan y desactivan los pines de salida correspondientes y se incluyen los delays necesarios para completar los tiempos del EPWM.

Saludos.