Autor Tema: Ayuda con el manejo de la memoria en dsPIC33f  (Leído 4646 veces)

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

Desconectado falconxls

  • PIC10
  • *
  • Mensajes: 4
Ayuda con el manejo de la memoria en dsPIC33f
« en: 06 de Enero de 2011, 12:20:11 »
Hola que tal, estoy realizando un proyecto con un dsPIC33FJ256GP710 con 256 KB de "program memory" (de los que solo me deja usar 87 kB según la "Memory Usage Gauge"), pretendo manejar 2 arreglos de 16384 elementos word, sin embargo tengo problemas con el manejo de la memoria, ya que solo me permite declrar sin errores un vector tipo "fractional" de 15345 elementos en "program memory" (cuando más elementos compila bien pero al usar el "MPLAB SIM" aparecen traps y da un reset), he estado revisando la data del "MPLAB C30 compiler Runtime" por lo que entiendo se pueden guardar hasta 32K en "const", he configurado las variables para que tengan atributo "far" junto con la "memory model" del "build project" pero no he conseguido avances, supongo que me está faltando algo pero no tengo idea de que podría ser, si pudiera encontrar la manera de definir un bloque de memoria con una dirección de inicio y fin  para acceder con punteros (y que esta no interfiriera con los segmento de memoria predefinidos por el compilador) creo que resolvería el problema pero tengo apenas unos días con esto de con los PICs y aun no conozco bien su arquitectura. Ojala alguien me pueda orientar con respecto al manejo de la memoria, ya que supongo que se puede llegar a manipular gran parte de ella y que seguramente yo lo estoy haciendo erróneamente. Acabo de notar que si uso vectores en RAM, me disminuye el número de elementos que puedo usar en FLASH, no deberían ser independientes?

Les anexo el código con el que estoy empezando.



// Compiler: MPLAB® C30 v3.21
// MPLAB IDE v8.43
//********************      LIBRERIAS      *********************
#include <stdio.h>
#include "string.h"
#include "math.h"
#include "dsp.h"
#include "p33FJ256GP710.h"
#include "libq.h"


//*********      DECLARACION DE VARIABLES    *****************
_FOSCSEL(FNOSC_PRIPLL);                     // oscilador primario (XT, HS, EC) Oscilador con PLL
_FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT);   // "Clock switching" y "Fail safe clock monitor" desabilitado
_FWDT(FWDTEN_OFF);                        // watchdog habilitado/deshabilitado por el usuario


int __attribute__((address(0x800))) ve[2] ={};   // total de words  en RAM


//*********      DECLARACION DE FUNCIONES    *****************


//************      PROGRAMA PRINCIPAL      *********************
int main(void)
   {

     PLLFBD = 0x00A0;   // configuracion del oscilador
     CLKDIV = 0x0048;   // y del PLL a 16 MIPS

   fractional dat1[15345];      // con un solo vaciado
   
     while(1)
      {
         int cuenta;
         for(cuenta=0; cuenta<15345; cuenta++)
               {
                  dat1[cuenta] = 0xFFFF;
               }

         int cuentaa;   
         for(cuentaa=0; cuentaa<15345; cuentaa++)
               {
                  dat1[cuentaa] = 0x0000;
               }
   
      }
   }

 

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Ayuda con el manejo de la memoria en dsPIC33f
« Respuesta #1 en: 06 de Enero de 2011, 12:45:13 »
¿No tendrás que aumentar el tamaño de la memoria de datos en el GLD?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ayuda con el manejo de la memoria en dsPIC33f
« Respuesta #2 en: 06 de Enero de 2011, 13:58:26 »
Hola

256kB de Program memory equivalen a un aproximado de 87,381 instrucciones, no se miden en kB. Cada código de operación de un dsPIC33 ocupa 3 Bytes.

La línea siguiente:

Código: [Seleccionar]
fractional dat1[15345];      // con un solo vaciado
No ocupa Program Memory
, ocupa Data Memory. El dsPIC33FJ256GP710 tiene 30,720 Bytes de RAM.

Si declaras un fractional, su tipo base es un signed int, por lo que cada fractional ocupará 2 Bytes.

15,345 * 2 = 30,690 Bytes

30,690 Bytes son casi el 100% de tu RAM disponible.

Estás eligiendo un dsPIC con menos RAM que la que necesitas. La program memory sirve para almacenar el programa y constantes, no para manejar datos en RAM.

Desconectado falconxls

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda con el manejo de la memoria en dsPIC33f
« Respuesta #3 en: 06 de Enero de 2011, 15:23:20 »
Antes que nada, les doy las gracias por la pronta respuesta.



Hola Nocturno, es muy gratificante que atendieras este post por la leyenda que eres en esta institución.

No había escuchado nada sobre GLD, si me pudieras dar un poco más de información, de ¿qué es? o ¿donde podría encontrar esa documentación?.

Gracias.




Hola migsantiago, es bueno encontrarse a un compatriota, pero mejor aun tener a un experto en estos bichos.


Había notado que cuando declaraba el vector de la siguiente forma:

Código: [Seleccionar]
fractional dat1[15345] = {0};

Había un aumento  de la "Program Memory" de 393 Bytes a 15744 Bytes lo cual es una diferencia de 15351 Bytes que es muy cercana al total de elementos del vector, lo raro es que como es word deberían ser el doble de Bytes no?, en la "Memory Usage Gauge" me marca que está usando "Program Memory" en vez de la "Data Memory".

Hasta donde sabía (muy poco) tenía entendido que en "Program Memory" se guardaban instrucciones y constantes, por eso tenía la idea de que podría declarar un vector en "Program Memory" y usar un vector de respaldo en "Data Memory", esto debido a que necesito 2 vectores del mismo tamaño para hacer las operaciones.

Lo que me hacía pensar que si se podría realizar esto era la siguiente información que aparece después de darle "make"

Program Memory  [Origin = 0x200, Length = 0x2aa00]
  section                    address   length (PC units)   length (bytes) (dec)
.text                        0x200                0x90            0xd8  (216)
.const                       0x290              0x77e2          0xb3d3  (46035)
.text                       0x7a72                0x88            0xcc (204)
.dinit                      0x7afa                 0x2             0x3  (3)
.isr                        0x7afc                 0x2             0x3  (3)
Total program memory used (bytes):         0xb57d  (46461) 17%

Pensaba que si estaba ocupando el 17% podría haber alguna forma de meterle más datos si usaba atributos far o algo que me ayudara a declarar espacios grandes de memoria en la "Program Memory".



Efectivamente si declaro de esta forma el vector

Código: [Seleccionar]
int __attribute__((address(0x800))) ve[15340];

La "Memory Usage Gauge" me informa que he usado 30680 B de un total de 30720 y que corresponden al número de elementos que he declarado por ser words, ocupando casi el 100% de su capacidad.


Me parece que hasta el momento microchip no tiene otro dsPIC con más RAM, por lo que tendría que usar una memoria RAM externa o usar un PIC24 con más RAM, si tienen alguna idea será bienvenida.


Por cierto donde puedo encontrar los comandos para resaltar cuando pongo código o para insertar un scrollbar, sería útil para no hacer las paginas muy grandes.

Gracias.




Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ayuda con el manejo de la memoria en dsPIC33f
« Respuesta #4 en: 06 de Enero de 2011, 15:40:16 »
Usa el selector de PICs de Microchip:

http://www.microchip.com/maps/microcontroller.aspx

Hay un dsPIC33 con 96kB de RAM.

Desconectado falconxls

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda con el manejo de la memoria en dsPIC33f
« Respuesta #5 en: 06 de Enero de 2011, 16:45:37 »
Hola migsantiago

Me parece que estas confundiendo los pics, los de 96k en RAM son
 PIC24FJ128DA206
 PIC24FJ128DA210
 PIC24FJ128GB206
 PIC24FJ128GB210
 PIC24FJ256DA206
 PIC24FJ256DA210
 PIC24FJ256GB206
 PIC24FJ256GB210

Pero en dsPIC33 solo hay hasta 30K que son

dsPIC33FJ256GP710A
dsPIC33FJ256MC710A

Es curioso que al buscar en "Family" 16 Bit DSC salga el PIC24FJ256GB210

Aunque en la data no cuenta con las instrucciones de de un DSC.


Alguna otra idea?

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ayuda con el manejo de la memoria en dsPIC33f
« Respuesta #6 en: 07 de Enero de 2011, 11:43:49 »
Hola migsantiago

Me parece que estas confundiendo los pics, los de 96k en RAM son
 PIC24FJ128DA206
 PIC24FJ128DA210
 PIC24FJ128GB206
 PIC24FJ128GB210
 PIC24FJ256DA206
 PIC24FJ256DA210
 PIC24FJ256GB206
 PIC24FJ256GB210

Pero en dsPIC33 solo hay hasta 30K que son

dsPIC33FJ256GP710A
dsPIC33FJ256MC710A

Es curioso que al buscar en "Family" 16 Bit DSC salga el PIC24FJ256GB210

Aunque en la data no cuenta con las instrucciones de de un DSC.


Alguna otra idea?


Vaya fallo del buscador de Microchip.

¿Por qué no pruebas con un PIC32?

Desconectado falconxls

  • PIC10
  • *
  • Mensajes: 4
Re: Ayuda con el manejo de la memoria en dsPIC33f
« Respuesta #7 en: 13 de Enero de 2011, 13:43:44 »
La idea era o más bien es usar un dsPIC por la instrucción MAC que acorta los tiempos entre operaciones. Se ven muy bien esos PIC32 pero creo que mejor voy a usar una memoria externa, puesto que no cuentan con el modulo DSP.

Gracias por las respuestas.