Módulos Rabbit para networking con TCP/IP sobre Ethernet

Anuncio
Core Modules
●
●
●
●
●
Módulos pre-armados: microprocesador
+ RAM + flash [ + Ethernet ] [ + ... ]
Recurso probado en ambientes
conflictivos
Económicos (no DIY MAC)
De fácil implementación: pueden
soldarse o conectarse con un zócalo a
la placa principal.
Más memoria ?
●
●
Program
&
Debug
Reemplazar el core module por
uno de mayor capacidad
Aplicación TCP/IP sobre Ethernet ?
●
●
Conectar el patch-cord
Comenzar a desarrollar la
aplicación
Mundo
exterior
Dynamic C
●
Implementación de C con funciones específicas
para Rabbit
●
Soporte multitarea
●
Manejo de memoria
●
Bibliotecas de funciones
●
RTC, USARTs, I2C master, SPI master/slave, GPS NMEA-0183, math, FFT, etc.
●
Debugging en circuito (C o assembler)
●
Soporte TCP/IP sin regalías, stack maduro (2000)
●
DHCP client, HTTP server con SSI/CGI, FTP, TFTP, ICMP, POP3 client, SMTP client, etc.
Criterios de Aplicación
●
Control industrial
●
Data logging
●
Interfaces de usuario complejas
●
Conexión en red (monitoreo remoto)
●
Comunicaciones packet/frame-oriented
●
Gran cantidad de cálculos matemáticos
●
Atender varias tareas a la vez
●
Tiempo de desarrollo muy reducido
Ethernet
Flash
Program
&
Debug
Micro
...
RAM
Tarjeta SD (mini)
Wi-Fi
Bajo costo (minicores)
5V
9
3,3V
5V-tolerant
10
Low Voltage Blue's
●
3V ↔ 5V !? ¿Qué hago?
●
●
●
Entrar en crisis
Contratar a un ingeniero en electrónica
Usar logic-level translators
–
–
–
74LVX3245 (sí, hay en Cika)
Micro → 74HCT a 5V → periférico
diseñarlo en forma discreta
CPU CISC
Super-clon del Z80
●
●
Registros de 32-bits: PW,
PX, PY, PZ
●
●
punteros tanto en
memoria lógica como
física
puede o no usar MMU
CPU CISC
8-bits con características interesantes de procesamiento en 16 y
32-bits, y un mapa de memoria física de 24-bits (16MB)
●
●
Acceso a memoria tanto en un bus de 8 como de 16-bits
●
Más de 400 instrucciones
●
loops largos
Instrucciones aritméticas, lógicas y de acceso a memoria en 16- y 32bits
●
Modo usuario y modo supervisor
●
●
protección de memoria y stack
Instrucciones para optimizar la encripción de datos
●
●
AES y SSL en 8-bits
Rabbit 5000 (RCM-5xxx): características principales
●
Clock de hasta 100MHz.
●
16-bit internal bus, 128KB RAM on-chip
●
Core 1,8V; 3,3V I/O, no son 5V-tolerant
●
Consumo del core: 0,57 mA/MHz
●
Ports I/O paralelo: 48 líneas de entrada/salida
●
seis ports de 8 bits (A
(A, B, C, D, E y H)
H)
●
versatilidad de asignación de pines a periféricos.
●
CPU y demás periféricos = R4000
●
Ethernet 10/100Base-T integrada y con DMA
●
Wi-Fi 802.11b/g integrada y con DMA
●
TECNOLOGÍA PROPIA, desde 2007 (diseñado en casa)
Rabbit 6000 (RCM-6xxx): características principales
●
Clock de hasta 200MHz
●
Core 1,2V; 3,3V I/O, no son 5V-tolerant
●
Consumo del core: 0,37 mA/MHz
●
1MB fast RAM on-chip (16-bit) + 32KB battery-backed SRAM (16-bit)
●
Ports I/O paralelo: 64 líneas de entrada/salida
●
ocho ports de 8 bits (A
(A, B, C, D, E, F, G y H)
H)
●
4 FIMs
●
CPU y demás periféricos = R5000 (ADC 12-bits, 8 canales)
●
Ethernet 10/100Base-T integrada y con DMA, incluye PHY
●
Wi-Fi 802.11a/b/g integrada y con DMA
●
USB 2.0 Host
Dynamic C
●
Coma flotante, funciones trigonométricas
●
sin(x): 160us (basado en una CPU a 22MHz)
●
suma y multiplicación: 14us
●
raíz cuadrada y división: 40us
●
Soporte multitarea cooperativo simple y eficiente (RTOS disponible)
●
FFT, GPS NMEA-0183, Wiegand, FAT, touchscreen, etc.
●
Debugging en circuito, incluido en los kits de desarrollo
●
●
Web server: SSI,
SSI, CGI o RabbitWeb + #ximport en vez de @#$%~
GRATIS
●
no code size limit, no time limit desde 2008
●
no crack, no astalavista, no Parque Rivadavia
Multitarea cooperativo
en Dynamic C
for(;;){
for(;;){
costate{
costate{
...
...
sentencia de control
sentencia de control
...
...
}
}
costate{
costate{
...
...
sentencia de control
sentencia de control
...
...
}
}
}
}
// cede la ejecución a otros costates
// cede la ejecución a otros costates
// cede la ejecución a otros costates
// cede la ejecución a otros costates
Web server en Dynamic C
#ximport "index.html"
#ximport "index.html"
#ximport "rabbit1.gif"
#ximport "rabbit1.gif"
index_html
index_html
rabbit1_gif
rabbit1_gif
#use "dcrtcp.lib"
#use "dcrtcp.lib"
#use "http.lib"
#use "http.lib"
SSPEC_MIMETABLE_START
SSPEC_MIMETABLE_START
SSPEC_MIME(".html", "text/html")
SSPEC_MIME(".html", "text/html")
SSPEC_MIME(".gif", "image/gif")
SSPEC_MIME(".gif", "image/gif")
SSPEC_MIMETABLE_END
SSPEC_MIMETABLE_END
SSPEC_RESOURCETABLE_START
SSPEC_RESOURCETABLE_START
SSPEC_RESOURCE_XMEMFILE("/", index_html)
SSPEC_RESOURCE_XMEMFILE("/", index_html)
SSPEC_RESOURCE_XMEMFILE("/index.html", index_html)
SSPEC_RESOURCE_XMEMFILE("/index.html", index_html)
SSPEC_RESOURCE_XMEMFILE("/rabbit.gif", reabbit1_gif)
SSPEC_RESOURCE_XMEMFILE("/rabbit.gif", reabbit1_gif)
SSPEC_RESOURCETABLE_END
SSPEC_RESOURCETABLE_END
main()
main()
{
{
sock_init();
sock_init();
http_init();
http_init();
while(1){
while(1){
http_handler();
http_handler();
}
}
}
}
RabbitWeb
Mandar un mail
en Dynamic C
#define FROM
#define FROM
#define TO
#define TO
#define SUBJECT
#define SUBJECT
#define BODY
#define BODY
"scaprile@ellie"
"scaprile@ellie"
"scaprile@ellie"
"scaprile@ellie"
"Rabbit email"
"Rabbit email"
"Estoy aburrido y quiero mandar un mail"
"Estoy aburrido y quiero mandar un mail"
#define USE_SMTP_AUTH
#define USE_SMTP_AUTH
#define SMTP_SERVER
#define SMTP_SERVER
#use "smtp.lib"
#use "smtp.lib"
"192.168.1.50"
"192.168.1.50"
smtp_setauth("myusername", "mypassword");
smtp_setauth("myusername", "mypassword");
smtp_sendmail(TO, FROM, SUBJECT, BODY);
smtp_sendmail(TO, FROM, SUBJECT, BODY);
while(smtp_mailtick()==SMTP_PENDING);
while(smtp_mailtick()==SMTP_PENDING);
Cliente FTP
en Dynamic C:
Data handler
int ftp_datahandler(char * data, int len, longword offset,
int ftp_datahandler(char * data, int len, longword offset,
int flags, void * dhnd_data)
int flags, void * dhnd_data)
{
{
switch (flags) {
switch (flags) {
case FTPDH_IN:
case FTPDH_IN:
return 0;
return 0;
case FTPDH_OUT:
case FTPDH_OUT:
if(tengoquedejardemandar) // dhnd_data me lo dice o , o , etc.
if(tengoquedejardemandar) // dhnd_data me lo dice o , o , etc.
return 0;
return 0;
sprintf(data, "Lo que quiero mandar”);
sprintf(data, "Lo que quiero mandar”);
return(strlen(data));
return(strlen(data));
case FTPDH_END:
case FTPDH_END:
case FTPDH_ABORT:
case FTPDH_ABORT:
return 0;
return 0;
}
}
}
}
return -1;
return -1;
Cliente FTP
en Dynamic C:
envío
ftp_client_setup(resolve(FTP_SERVER),0,USER,PASSWORD,
ftp_client_setup(resolve(FTP_SERVER),0,USER,PASSWORD,
FTP_MODE,FILENAME,NULL,NULL,0);
FTP_MODE,FILENAME,NULL,NULL,0);
ftp_data_handler(ftp_datahandler, &variabledecontrol, 0);
ftp_data_handler(ftp_datahandler, &variabledecontrol, 0);
while(ftp_client_tick()== FTPC_AGAIN);
while(ftp_client_tick()== FTPC_AGAIN);
Comunicación vía UDP
en Dynamic C
udp_Socket s;
udp_Socket s;
udp_open(&s,LOCAL_PORT,DEST_IP,DEST_PORT,NULL);
udp_open(&s,LOCAL_PORT,DEST_IP,DEST_PORT,NULL);
tcp_tick(&s);
tcp_tick(&s);
udp_send(&s,MY_STRING,strlen(MY_STRING));
udp_send(&s,MY_STRING,strlen(MY_STRING));
udp_recv(&s,buffer,size);
udp_recv(&s,buffer,size);
sock_close(&s);
sock_close(&s);
Ethernet o Wi-Fi
en Dynamic C
#define TCPCONFIG 0
#define TCPCONFIG 0
#define USE_ETHERNET
#define USE_ETHERNET
#define MY_IP_ADDRESS
#define MY_IP_ADDRESS
#define MY_NETMASK
#define MY_NETMASK
#define MY_GATEWAY
#define MY_GATEWAY
1
1
"192.168.1.54"
"192.168.1.54"
"255.255.255.0"
"255.255.255.0"
"192.168.1.1"
"192.168.1.1"
#define TCPCONFIG 1
#define TCPCONFIG 1
#define USE_WIFI
1
#define USE_WIFI
1
#define IFC_WIFI_SSID
#define IFC_WIFI_SSID
#define IFC_WIFI_MODE
#define IFC_WIFI_MODE
#define IFC_WIFI_REGION
#define IFC_WIFI_REGION
#define IFC_WIFI_ENCRYPTION
#define IFC_WIFI_ENCRYPTION
"Cika"
"Cika"
IFPARAM_WIFI_INFRASTRUCTURE
IFPARAM_WIFI_INFRASTRUCTURE
IFPARAM_WIFI_REGION_AMERICAS
IFPARAM_WIFI_REGION_AMERICAS
IFPARAM_WIFI_ENCR_NONE
IFPARAM_WIFI_ENCR_NONE
#define MY_IP_ADDRESS "192.168.1.54"
#define MY_IP_ADDRESS "192.168.1.54"
#define _PRIMARY_STATIC_IP MY_IP_ADDRESS
#define _PRIMARY_STATIC_IP MY_IP_ADDRESS
#define MY_NETMASK
"255.255.255.0"
#define MY_NETMASK
"255.255.255.0"
#define _PRIMARY_NETMASK MY_NETMASK
#define _PRIMARY_NETMASK MY_NETMASK
#define MY_GATEWAY
#define MY_GATEWAY
"192.168.1.1"
"192.168.1.1"
Algo que quieran saber ?
En lo posible relacionado con este tema,
o de última que esté a mi alcance, no
me vayan a preguntar por el sentido de
la vida a menos que estén dispuestos a
pagarse más de una cerveza.
Descargar