Autor Tema: Mis experiencias con Teensy 3.6  (Leído 12835 veces)

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

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Mis experiencias con Teensy 3.6
« en: 14 de Mayo de 2017, 15:11:02 »
Voy a ir publicando mis experiencias con la placa Teensy 3.6.

Esta placa nace de un proyecto lanzado en Kickstarter en octubre de 2016 que mejora modelos anteriores. El modelo Teensy 3.6 es el más potente que existe en la actualidad. Contiene un microcontrolador ARM Cortex M4F de NXP/Freescale a 180MHz y tiene un formato adecuado para hacer pruebas en protoboard:



La placa está preparada para ser programada desde el entorno Arduino, por lo que es muy sencillo comenzar a programarla desde cero. Esto no significa que sea un procesador sencillo, por lo que tendré que ir desentrañando sus registros internos a medida que vaya avanzando. En este tema iré publicando los progresos, junto a programas de ejemplo que sean útiles para comprender su funcionamiento interno.


Documentación:
Procesador ARM Cortex M4F de NXP modelo K66FX1M0VMD18
  Datasheet
  Reference Manual
  Kinetis SDK v.1.3 API Reference Manual

Pinout:

* Teensy36_pinout.jpg
(193.99 kB, 699x632 - visto 856 veces)



Un saludo.
« Última modificación: 14 de Mayo de 2017, 15:46:06 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
« Última modificación: 17 de Mayo de 2017, 15:33:59 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mis experiencias con Teensy 3.6
« Respuesta #2 en: 14 de Mayo de 2017, 15:12:15 »
Mensaje reservado

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mis experiencias con Teensy 3.6
« Respuesta #3 en: 14 de Mayo de 2017, 15:34:37 »
Activar led a máxima velocidad
El primer programa está destinado a conocer la velocidad de la placa y a manejar las entradas y salidas sin las librerías de Arduino, para comprobar la velocidad que se puede conseguir.

Activar led con librerías estandar:
Código: C
  1. int const ledPin = 13;
  2.  
  3. void setup() {                
  4.   pinMode(ledPin, OUTPUT);    
  5.   while(1) {
  6.     digitalWrite(ledPin, HIGH);   // turn the LED on (HIGH is the voltage level)
  7.     digitalWrite(ledPin, LOW);    // turn the LED off by making the voltage LOW
  8.   }
  9. }
  10.  
  11. void loop() {}

El periodo medido en el pin 13 es de 339ns (unos 61 ciclos de reloj a 180MHz)


Activar led con escritura directa a la salida:
Código: C
  1. const int ledPin = 13;
  2.  
  3. void setup() {
  4.   pinMode(ledPin, OUTPUT);
  5.   while(1) {
  6.     *portSetRegister(ledPin) = 1;
  7.     *portClearRegister(ledPin) = 1;
  8.   }
  9. }
  10.  
  11. void loop() {}

Ahora el periodo medido en el pin 13 es de solo 44.4ns (8 ciclos de reloj a 180MHz)

Un saludo.
« Última modificación: 14 de Mayo de 2017, 15:41:01 por Picuino »

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Mis experiencias con Teensy 3.6
« Respuesta #4 en: 14 de Mayo de 2017, 16:33:58 »
El overhead the C++?
-
Leonardo Garberoglio

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Mis experiencias con Teensy 3.6
« Respuesta #5 en: 14 de Mayo de 2017, 17:58:28 »
Qué hacen la teensy en concreto? He leído algo de que es compatible con el IDE de Arduino pero no lo acabo de comprender. Disculpas si la pregunta es obvia para la mayoría :(
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mis experiencias con Teensy 3.6
« Respuesta #6 en: 14 de Mayo de 2017, 19:04:19 »
manwenwe:
No entiendo bien la pregunta. Teensy es una serie de placas.
La Teensy 3.6, que es la que estoy probando, tiene un ARM Cortex M4F.
Aquí te explica más su autor: https://www.kickstarter.com/projects/paulstoffregen/teensy-35-and-36

elgarbe:
No sé porqué oscila tan despacio. No es por el C++. He probado a escribir directamente en la memoria y pasa lo mismo. Yo esperaba que el tiempo total fuese de 4 ciclos (2 para escribir set y 2 para reset).

Este programa escribe directamente en memoria y funciona también con un periodo de 8 ciclos de reloj:
Código: C
  1. #define GPIO_PTR(reg, bit, offset) *(volatile uint8_t *)((((uint32_t)&(reg) - 0x40000000) * 32 + (bit) * 4 + 0x42000000) + offset * 4)
  2. #define PIN13_SET   GPIO_PTR(CORE_PIN13_PORTREG, CORE_PIN13_BIT, 32)
  3. #define PIN13_RESET   GPIO_PTR(CORE_PIN13_PORTREG, CORE_PIN13_BIT, 64)
  4.  
  5. void setup() {
  6.   pinMode(13, OUTPUT);
  7.   while(1) {
  8.     PIN13_SET = 1;
  9.     PIN13_RESET = 1;
  10.   }
  11. }
  12.  
  13. void loop() {}

Un saludo.
« Última modificación: 14 de Mayo de 2017, 19:06:44 por Picuino »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mis experiencias con Teensy 3.6
« Respuesta #7 en: 14 de Mayo de 2017, 19:22:41 »
Pasa el dissasembly

Desconectado elgarbe

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Mis experiencias con Teensy 3.6
« Respuesta #8 en: 14 de Mayo de 2017, 19:48:11 »
8 no es ilógico.
61 tiene que ser por todo el imbrincado sistema de funciones que debe usar hasta que escribe el registro.
Hasta donde sabía, en ARM no es como en PIC, por mas que parezca que va a tardar 2 ciclos puede tardar más, ARM tiene prefech y un monton de cosas más que te pueden cambiar un poco las cosas.
En algo tan simple no sé.

sds.
-
Leonardo Garberoglio

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Mis experiencias con Teensy 3.6
« Respuesta #9 en: 14 de Mayo de 2017, 19:53:32 »
.

Prueba con DMA.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Mis experiencias con Teensy 3.6
« Respuesta #10 en: 14 de Mayo de 2017, 20:49:14 »
Hasta donde sabía, en ARM no es como en PIC, por mas que parezca que va a tardar 2 ciclos puede tardar más, ARM tiene prefech y un monton de cosas más que te pueden cambiar un poco las

Exacto, por eso le dije que pase el disassembly. Respecto al prefetch por ser el loop tan pequeño deberia cargarse completamente y no necesitar hacer otro, ya que estaria guardado por completo en la memoria esa.

Ademas por como se debe llamar a la funcion:

Código: C
  1. *portSetRegister(ledPin) = 1;
  2.     *portClearRegister(ledPin) = 1;

Imagino que ademas hace una AND o algo asi... Sino no tiene sentido pasarle el 1 y el ledPin, si fuera directo al registro, que muchos poseen registros de Set y registros de Reset, deberia ser algo asi:

Código: C
  1. *RegistroSET = ledPin;
« Última modificación: 14 de Mayo de 2017, 20:52:31 por KILLERJC »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mis experiencias con Teensy 3.6
« Respuesta #11 en: 15 de Mayo de 2017, 04:17:38 »
Intentaré pasar a línea de comandos para ver el disassembly.
portClearRegister(pin) es una macro que devuelve la dirección de memoria donde se apaga el pin al escribir 1. Cada bit tiene varias direcciones de memoria asociadas para activarle, desactivarle, etc. escribiendo directamente en un byte. Así no hace falta usar instrucciones de tipo bit ni operaciones lógicas.
Un saludo.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Mis experiencias con Teensy 3.6
« Respuesta #12 en: 15 de Mayo de 2017, 04:41:24 »
manwenwe:
No entiendo bien la pregunta. Teensy es una serie de placas.
La Teensy 3.6, que es la que estoy probando, tiene un ARM Cortex M4F.
Aquí te explica más su autor: https://www.kickstarter.com/projects/paulstoffregen/teensy-35-and-36

Justo a esto que comenta el autor me refería:

The Arduino IDE is the primary method used to program Teensy.  Like prior models, my goal for Teensy is the best possibility compatibility with all Arduino functions and widely used libraries.

Aunque el micro es carete el precio de la placa no se justificaría sólo con eso sino que debe haber algo más por detrás. Y parece que ese algo es que se puede usar el IDE y las librerías de Arduino con un micro más potente de Freescale (se me hace raro decir NXP :-) ). ¿es eso no?. Parece muy buena idea pero sigo sin entenderlo del todo bien: ¿qué han cambiado del IDE de Arduino para que funcione con esa placa? ¿las librerías de más bajo nivel y ya está?. Es que desconocía que eso se pudiese hacer...

Saludos!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Mis experiencias con Teensy 3.6
« Respuesta #13 en: 15 de Mayo de 2017, 10:08:57 »
Arduino es un Fork de Wiring, que a su vez está basado en Processing. Son proyectos de código abierto y por lo tanto es sencillo realizar modificaciones, versiones o añadir módulos.

En este caso han diseñado un módulo para el entorno Arduino, llamado Teensyduino, que añade un compilador GCC para ARM, algunas opciones más en los menús del IDE Arduino y librerías de hardware y de usuario.
Las librerías de hardware hacen que la misma instrucción funcione igual en todos los micros. Por ejemplo digitalWrite(pin, level) escribe un pin de salida. Los pines se nombran con números naturales (no se dividen en puertos) y la función realiza todas las operaciones necesarias para abstraer al usuario de la capa de hardware. En ese sentido las librerías de hardware son como pequeñas HAL.

Además, el módulo Teensyduino añade librerías de usuario para trabajar con audio y muchas más funciones.

Es esa integración con Arduino y ese conjunto de herramientas de audio y librerías las que hacen que Teensy tenga un valor y un precio añadido.

En mi caso en seguida me meto en el código máquina y en los registros, pero prefiero tener un punto de partida de nivel 0 del que partir.

De todas formas no resulta difícil pasar las librerías a Eclipse o a otro entorno y trabajar fuera de Arduino.

Saludos.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re:Mis experiencias con Teensy 3.6
« Respuesta #14 en: 15 de Mayo de 2017, 10:36:17 »
Gracias Picuino. Lo desconocía. Está chulo el concepto. He visto un montón de placas ARM tipo RPI con un micro auxiliar como el de Arduino. Lo que creo que estaría muy chulo, si no existe ya, es que adaptaran el IDE de arduino a algún procesador de los que llevan un Cortex M4 o M7 auxiliar para tiempo real. Sería la caña poder pasarle mensajes al procesador desde el microcontrolador para que haga cosas y así ahorrarte parte de desarrollo bajo Linux. Sólo pienso en alto jeje

Saludos.
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -


 

anything