Autor Tema: [SOLUCIONADO]Ayuda con las librerías TCPIP Stack v5.42.08  (Leído 2036 veces)

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

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
[SOLUCIONADO]Ayuda con las librerías TCPIP Stack v5.42.08
« en: 04 de Marzo de 2015, 05:48:20 »
Hola a todos, resulta que estoy utilizando un PIC18F67J50 con un ENC28J60 como tarjeta de red para implementar un sistema ethernet y tengo un problema que no sé como solventar a ver si alguien que tenga mas experiencia en esto me echa una mano.

Con el pic estoy utilizando una memoria externa 25LC1024 que es la que viene por defecto en las librerías.

Si solo implemento el servidor telnet todo va bien, tengo comunicación y todo lo demás, pero si le implemento el servidor web ahí ya no me funciona el asunto.

Siguiendo el rastro del programa donde veo que se queda en espera es en este trozo de código que pertenece a la librería TCP.c
Código: [Seleccionar]
switch(vMedium)
{
#if TCP_ETH_RAM_SIZE > 0
case TCP_ETH_RAM:
ptrBaseAddress = wCurrentETHAddress;
wCurrentETHAddress += sizeof(TCB) + wTXSize+1 + wRXSize+1;
// Do a sanity check to ensure that we aren't going to use memory that hasn't been allocated to us.
// If your code locks up right here, it means you've incorrectly allocated your TCP socket buffers in TCPIPConfig.h.  See the TCP memory allocation section.  More RAM needs to be allocated to the base memory mediums, or the individual sockets TX and RX FIFOS and socket quantiy needs to be shrunken.
#if defined(WF_CS_TRIS)
while(wCurrentETHAddress > TCP_ETH_RAM_BASE_ADDRESS + WFGetTCBSize()/*TCP_ETH_RAM_SIZE*/);
#else
while(wCurrentETHAddress > TCP_ETH_RAM_BASE_ADDRESS + TCP_ETH_RAM_SIZE);
#endif
break;
#endif

#if TCP_PIC_RAM_SIZE > 0
case TCP_PIC_RAM:
ptrBaseAddress = ptrCurrentPICAddress;
ptrCurrentPICAddress += sizeof(TCB) + wTXSize+1 + wRXSize+1;
// Do a sanity check to ensure that we aren't going to use memory that hasn't been allocated to us.
// If your code locks up right here, it means you've incorrectly allocated your TCP socket buffers in TCPIPConfig.h.  See the TCP memory allocation section.  More RAM needs to be allocated to the base memory mediums, or the individual sockets TX and RX FIFOS and socket quantiy needs to be shrunken.
while(ptrCurrentPICAddress > TCP_PIC_RAM_BASE_ADDRESS + TCP_PIC_RAM_SIZE);
break;
#endif

#if TCP_SPI_RAM_SIZE > 1
case TCP_SPI_RAM:
ptrBaseAddress = wCurrentSPIAddress;
wCurrentSPIAddress += sizeof(TCB) + wTXSize+1 + wRXSize+1;
// Do a sanity check to ensure that we aren't going to use memory that hasn't been allocated to us.
// If your code locks up right here, it means you've incorrectly allocated your TCP socket buffers in TCPIPConfig.h.  See the TCP memory allocation section.  More RAM needs to be allocated to the base memory mediums, or the individual sockets TX and RX FIFOS and socket quantiy needs to be shrunken.
while(wCurrentSPIAddress > TCP_SPI_RAM_BASE_ADDRESS + TCP_SPI_RAM_SIZE);
break;
#endif

default:
while(1); // Undefined allocation medium.  Go fix your TCPIPConfig.h TCP memory allocations.
}

se queda esperando en el while(1); //Undefined allocation medium.  Go fix your TCPIPConfig.h TCP memory allocations., según dice ahí, si la traducción no me falla, Indefinida la localización de medium, ve a TCPIPConfig.h localización de la memoria TCP.

yo voy al archivo de configuración y lo que veo es esto

Código: [Seleccionar]
/* TCP Socket Memory Allocation
 *   TCP needs memory to buffer incoming and outgoing data.  The
 *   amount and medium of storage can be allocated on a per-socket
 *   basis using the example below as a guide.
 */
// Allocate how much total RAM (in bytes) you want to allocate
// for use by your TCP TCBs, RX FIFOs, and TX FIFOs.

#define TCP_ETH_RAM_SIZE (3927ul)
#define TCP_PIC_RAM_SIZE (0ul)
#define TCP_SPI_RAM_SIZE (0ul)
#define TCP_SPI_RAM_BASE_ADDRESS (0x00)

// Define names of socket types
#define TCP_SOCKET_TYPES
#define TCP_PURPOSE_GENERIC_TCP_CLIENT 0
#define TCP_PURPOSE_GENERIC_TCP_SERVER 1
#define TCP_PURPOSE_TELNET 2
#define TCP_PURPOSE_FTP_COMMAND 3
#define TCP_PURPOSE_FTP_DATA 4
#define TCP_PURPOSE_TCP_PERFORMANCE_TX 5
#define TCP_PURPOSE_TCP_PERFORMANCE_RX 6
#define TCP_PURPOSE_UART_2_TCP_BRIDGE 7
#define TCP_PURPOSE_HTTP_SERVER 8
#define TCP_PURPOSE_DEFAULT 9
#define TCP_PURPOSE_BERKELEY_SERVER 10
#define TCP_PURPOSE_BERKELEY_CLIENT 11
#define END_OF_TCP_SOCKET_TYPES

#if defined(__TCP_C)
// Define what types of sockets are needed, how many of
// each to include, where their TCB, TX FIFO, and RX FIFO
// should be stored, and how big the RX and TX FIFOs should
// be.  Making this initializer bigger or smaller defines
// how many total TCP sockets are available.
//
// Each socket requires up to 56 bytes of PIC RAM and
// 48+(TX FIFO size)+(RX FIFO size) bytes of TCP_*_RAM each.
//
// Note: The RX FIFO must be at least 1 byte in order to
// receive SYN and FIN messages required by TCP.  The TX
// FIFO can be zero if desired.
#define TCP_CONFIGURATION
ROM struct
{
BYTE vSocketPurpose;
BYTE vMemoryMedium;
WORD wTXBufferSize;
WORD wRXBufferSize;
} TCPSocketInitializer[] =
{
//{TCP_PURPOSE_GENERIC_TCP_CLIENT, TCP_ETH_RAM, 125, 100},
//{TCP_PURPOSE_GENERIC_TCP_SERVER, TCP_ETH_RAM, 20, 20},
{TCP_PURPOSE_TELNET, TCP_ETH_RAM, 200, 150},
{TCP_PURPOSE_TELNET, TCP_ETH_RAM, 200, 150},
{TCP_PURPOSE_TELNET, TCP_ETH_RAM, 200, 150},
//{TCP_PURPOSE_FTP_COMMAND, TCP_ETH_RAM, 100, 40},
//{TCP_PURPOSE_FTP_DATA, TCP_ETH_RAM, 0, 128},
{TCP_PURPOSE_TCP_PERFORMANCE_TX, TCP_ETH_RAM, 200, 1},
{TCP_PURPOSE_TCP_PERFORMANCE_RX, TCP_ETH_RAM, 40, 1500},
//{TCP_PURPOSE_UART_2_TCP_BRIDGE, TCP_ETH_RAM, 256, 256},
{TCP_PURPOSE_HTTP_SERVER, TCP_ETH_RAM, 200, 200},
{TCP_PURPOSE_HTTP_SERVER, TCP_ETH_RAM, 200, 200},
//{TCP_PURPOSE_DEFAULT, TCP_ETH_RAM, 200, 200},
//{TCP_PURPOSE_BERKELEY_SERVER, TCP_ETH_RAM, 25, 20},
//{TCP_PURPOSE_BERKELEY_SERVER, TCP_ETH_RAM, 25, 20},
//{TCP_PURPOSE_BERKELEY_SERVER, TCP_ETH_RAM, 25, 20},
//{TCP_PURPOSE_BERKELEY_CLIENT, TCP_ETH_RAM, 125, 100},
};
#define END_OF_TCP_CONFIGURATION
#endif

creo que van por aquí los tiros pero he probado muchas combinaciones pero no doy con la tecla.

Según creo, una vez que implementes el servidor web, con la herramienta MPSF2 que viene en la librería cargarías la web en la memoria SPI vía ethernet ¿Cierto o tengo que cargar el fichero con un programador de eeprom y ese es el problema?.

He de decir que estoy utilizando una PCB desarrollada por mi, nada de desarrollos comerciales
« Última modificación: 12 de Marzo de 2015, 11:15:13 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #1 en: 04 de Marzo de 2015, 13:54:38 »
No sabria que decirte... yo veria como calcula el vMedium y luego cuales son los valores de TCP_ETH_RAM del case para ver por que no esta tomando eso...

Por otra parte veo en el segundo codigo esto:

//{TCP_PURPOSE_GENERIC_TCP_SERVER, TCP_ETH_RAM, 125, 100},

Telnet/http es por TCP, imagino que deberia estar descomentado el server (si lo usas como eso, sino el cliente). y por ultimo, no se por que hay 2 de estas (y no una sola) :

{TCP_PURPOSE_HTTP_SERVER, TCP_ETH_RAM, 200, 200},
{TCP_PURPOSE_HTTP_SERVER, TCP_ETH_RAM, 200, 200},

Es lo unico que veo..

 

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #2 en: 05 de Marzo de 2015, 05:19:08 »
La verdad es que no tengo mucha idea, esta librería viene así y está desarrollada por microchip y se supone que está depurada y testeada, estoy utilizando un ejemplo de la librería y simplemente he activado el servidor web para alojar una página web en una memoria externa 25LC1024, se supone que el ejemplo debería de funcionar sin problemas pero en mi caso no y le hago debugger y sigo el ciclo pero no comprendo muy bien cómo calcula vMedium.

cuando implemento solo el servidor telnet que es el que si que me funciona y sigo el ciclo de trabajo en modo debugger si que entra en el bucle witch y calcula bien el vMedia pero cuando le implemento el servidor web no lo calcula ni teniendo activado el telnet.

Según creo hay algún problema en algún socket TX o RX para el manejo de la información pero no doy con el fallo, por eso preguntaba a ver si hay alguien que haya jugado con esta librería y sepa por donde puede estar el fallo.
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #3 en: 09 de Marzo de 2015, 11:51:52 »
He probado el hardware por separado, tanto la memoria 25LC1024 cómo lo demás y va todo bien, alguna tontería tiene que tener que no funciona.

corrijan me si me equivoco ¿se supone que no hay que grabar la memoria por separado con la página web, si no que cargas el firmware en el micro y luego con la herramienta   MPFS2 le cargas la web? o ¿cómo sería?.

A ver si alguien me echa una mano
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #4 en: 09 de Marzo de 2015, 12:32:21 »


Lo que te está diciendo el mensaje de error es que no has definido ningún medio de almacenamiento para el buffer de trabajo que necesita TCP/IP.

Si miras el primer fuente tienes un SWITCH CASE con 3 posibles opciones, más una por defecto por si no se cumple ninguna. En tu caso, como no has definido ninguna de las 3 opciones, el programa se te va a la opción del error, y allí entra en un bucle infinito.

Mira en los fuentes, donde defines una de las tres opciones posibles, TCP_ETH_RAM, TCP_PIC_RAM o TCP_SPI_RAM. No he profundizado en el fuente, pero supongo que la primera se refiere a los 8K de RAM del ENC28J60, la segunda a la RAM del PIC y la tercera a una RAM externa por SPI.

En resumen, define una de las 3 opciones de almacenamiento del buffer, y te funcionará. Lo más probable es que los tres defines estén en algún .H comentados con //, solo tendrás que quitarle las dos barras a la opción que quieras usar (SOLO UNA). Haz una búsqueda global por todos los fuentes y localizarás de inmediato los defines.

Otra cosa, a veces los defines están a nivel de proyecto, y no en los fuentes, en ese caso edita la configuración del proyecto y añade la definición o métela directamente en un .H.

Si como supongo estás usando esa memoria 25LC1024  SPI para almacenar el buffer, entonces añade al proyecto el correspondiente #define TCP_SPI_RAM y arreglado.
« Última modificación: 09 de Marzo de 2015, 13:07:59 por planeta9999 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #5 en: 09 de Marzo de 2015, 13:39:52 »
estan definidas planeta.. fijate en su segundo codigo que es el TCPIPConfig.h. ahi esta definidio y tiene un valor

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #6 en: 09 de Marzo de 2015, 14:02:09 »
estan definidas planeta.. fijate en su segundo codigo que es el TCPIPConfig.h. ahi esta definidio y tiene un valor

¿ Donde está definido TCP_ETH_RAM ?, está definido TCP_ETH_RAM_SIZE.

Lo que he comentado antes no sería correcto, porque no se chequea con un IF si TCP_ETH_RAM está definido, sino que el CASE compara vMedium con el valor asignado a las 3 definiciones, para ejecutar el código, pero no veo donde se define el valor de TCP_ETH_RAM, TCP_PIC_RAM y TCP_SPI_RAM

 
« Última modificación: 09 de Marzo de 2015, 14:06:48 por planeta9999 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #7 en: 09 de Marzo de 2015, 15:06:58 »
Si perdon. Yo asumi que eso esta definido y es una constante para que el case funcione, como no agrego todo el codigo seguro que eso esta en algun .h del TCP.c


Por eso yo habia puesto:

Citar
No sabria que decirte... yo veria como calcula el vMedium y luego cuales son los valores de TCP_ETH_RAM del case para ver por que no esta tomando eso...

a lo que el respondio:

Citar
sigo el ciclo pero no comprendo muy bien cómo calcula vMedium.

Como no tengo el codigo no puedo hacer nada.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #8 en: 09 de Marzo de 2015, 15:55:14 »
Hola a todos.

Están definidas en el archivo de cabecera TCPIP.h de esta manera

Código: [Seleccionar]
/*******************************************************************
 * Memory Configuration
 *   The following section sets up the memory types for use by
 *   this application.
 *******************************************************************/
// Represents data stored in Ethernet buffer RAM
#define TCP_ETH_RAM 0u
// The base address for TCP data in Ethernet RAM
#define TCP_ETH_RAM_BASE_ADDRESS (BASE_TCB_ADDR)
// Represents data stored in local PIC RAM
#define TCP_PIC_RAM 1u
// The base address for TCP data in PIC RAM
#define TCP_PIC_RAM_BASE_ADDRESS ((PTR_BASE)&TCPBufferInPIC[0])
// Represents data stored in external SPI RAM
#define TCP_SPI_RAM 2u

De todas maneras las librerías son muy grandes y si alguien quiere estudiarlas mejor pues aquí tiene el enlace a la descarga:

http://www.microchip.com/pagehandler/en-us/devtools/mla/archives.html

Con la que estoy trabajando es la:
Version: v2013-06-15

Yo he probado a añadir incluso más parámetros tal que así:
Código: [Seleccionar]
{TCP_PURPOSE_HTTP_SERVER, TCP_SPI_RAM, 200, 200},
{TCP_PURPOSE_HTTP_SERVER, TCP_SPI_RAM, 200, 200},

y
Código: [Seleccionar]
{TCP_PURPOSE_HTTP_SERVER, TCP_PIC_RAM, 200, 200},
{TCP_PURPOSE_HTTP_SERVER, TCP_PIC_RAM, 200, 200},

Los he puesto todos juntos, por separado, y muchas más combinaciones y nada de nada


A mi lo que me extraña es que se supone que las librerías están configuradas para hacer esto más cómodo y simple, tiene una herramienta que se llama TCPIP Configuration Wizard que te ayuda a configura los complementos automáticamente añadiendo o quitando tan solo con un simple clik sin tener que estar andando con todo esto, pero no sé que pasa que solo me funciona el servidor telnet.

no sé si descargar otra versión más antigua a ver si es algún problema de versiones.

El micro que estoy utilizando es el PIC18F67J50
« Última modificación: 09 de Marzo de 2015, 15:57:53 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #9 en: 09 de Marzo de 2015, 15:59:19 »


Haz un Debug a ver que valor toma vMedium, y otro punto de ruptura a la rutina que lo calcula.

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #10 en: 09 de Marzo de 2015, 20:16:06 »
Ya lo hice, se supone que vMedium tiene que tomar un valor entre 0 y 3 que son los case del switch, cuando solo implemento el telnet, el valor de vMedium toma el valor de TCP_ETH_RAM que es 0 y si entra la rutina.

Código: [Seleccionar]
switch(vMedium)
{
#if TCP_ETH_RAM_SIZE > 0
case TCP_ETH_RAM:
ptrBaseAddress = wCurrentETHAddress;
wCurrentETHAddress += sizeof(TCB) + wTXSize+1 + wRXSize+1;
// Do a sanity check to ensure that we aren't going to use memory that hasn't been allocated to us.
// If your code locks up right here, it means you've incorrectly allocated your TCP socket buffers in TCPIPConfig.h.  See the TCP memory allocation section.  More RAM needs to be allocated to the base memory mediums, or the individual sockets TX and RX FIFOS and socket quantiy needs to be shrunken.
#if defined(WF_CS_TRIS)
while(wCurrentETHAddress > TCP_ETH_RAM_BASE_ADDRESS + WFGetTCBSize()/*TCP_ETH_RAM_SIZE*/);
#else
while(wCurrentETHAddress > TCP_ETH_RAM_BASE_ADDRESS + TCP_ETH_RAM_SIZE);
#endif
break;

y puedo comprobar que en las sentencias
Código: [Seleccionar]
vMedium = TCPSocketInitializer[i].vMemoryMedium;
wTXSize = TCPSocketInitializer[i].wTXBufferSize;
wRXSize = TCPSocketInitializer[i].wRXBufferSize;
vMedium toma el valor de TCP_ETH_RAM  y wTXSize toma el valor numérico del tamaño del socket que es primer 200 de esta sentencia
Código: [Seleccionar]
TCP_PURPOSE_TELNET, TCP_ETH_RAM, 200, 150 y wRXSize toma el segundo valor de 150, entonces cuando llega al case si que se ejecuta esas parte del código y le prototipo empieza a funcionar bien

Pero cuando implemento cualquiera de las otras dos case pues vMedium toma un valor indeterminado con lo cual no pertenece vMedium a ninguno de los case y se salta la comprobación de socket y se queda en el while().
da igual que implemente telnet junco con web, al parecer cuando implemento web o ftp o cualquier otro servidor anula TCP_ETH_RAM.

No sé si me estoy explicando bien, si hace falta puedo hacer unas capturas

EDITO: E cometido un error al poner la sentencia  :oops:, me confundí y puse esta
Código: [Seleccionar]
TCP_PURPOSE_HTTP_SERVER, TCP_ETH_RAM, 200, 200 pero en verdad es esta
Código: [Seleccionar]
TCP_PURPOSE_TELNET, TCP_ETH_RAM, 200, 150, lo siento  :shock: ya está corregido  :)
« Última modificación: 10 de Marzo de 2015, 05:04:31 por Thulsa Doom »
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...

Desconectado Thulsa Doom

  • PIC24F
  • *****
  • Mensajes: 771
    • https://electronicadicto.wordpress.com/
Re: Ayuda con las librerías TCPIP Stack v5.42.08
« Respuesta #11 en: 12 de Marzo de 2015, 11:14:32 »
Bueno, pues está solucionado, :-/ :-/ :-/ ((:-)) ((:-))

Resulta que algo toqué en las librerías que no arrancaba el sistema en modo web.

Desinstalé las librerías, las instalé de nuevo, hice un proyecto desde 0 utilizando una demo de las que hay y ahora va bien, con algunas cosas que no funcionan bien como lo de cambiarle la ip a modo estático desde la web, aunque se la cambies siempre pilla una totalmente diferente a la que to he seleccionado, a ver si doy con la solución.

Gracias por la ayuda
Más códigos y desarrollos en https://electronicadicto.wordpress.com/ date una vuelta y curiosea un rato...


 

anything