¿Por qué se usa AVR en Arduino?


41

¿Por qué Arduino usa AVR? Entiendo que son el procesador oficial, pero no hay una razón por la que el código no se pueda portar a un ARM o una arquitectura Freescale que no sea el costo, ¿verdad? Mientras haya memoria integrada, pensé que podría haber una migración fácil a esas partes.

Veo una gran cantidad de ARM en la industria (parece que cada vendedor está empujando uno a sus diseños) y me preguntaba por qué no había más aceptación en el mundo de los desarrolladores de Arduino.


44
¿Quién es tu mercado? Si está tratando de vender algo grande en la industria, entonces querrá un ARM, porque si Atmel se cae, no le queda nada si está usando el AVR. Con ARM, hay muchos otros proveedores que ofrecen reemplazos casi directos. La mayor complejidad de la ARM es un problema menor con los buenos ingenieros que con los aficionados que no saben lo básico. Si está vendiendo a aficionados, la curva de aprendizaje será demasiado pronunciada, la potencia del procesador no se utilizará y SMT será una pared de ladrillos imaginada. ¿A quién le preocupan los clientes aficionados o posibles empleadores? Por favor aclarar.
Kevin Vermeer

9
No estoy tratando de ser ofensivo, pero la pregunta es una pregunta. Atmel tiene más de 25 años, tiene un mercado muy exitoso que no sea ARM, AVR en sí mismo es una plataforma muy exitosa. ¿Cuáles son las posibilidades de que tal empresa caiga? Esto suena como decir: "No use Windows, ¿qué pasa si MicroSoft se cae?"
Rick_2047

Estoy de acuerdo con sus otros dos puntos, a saber, que si tiene un mercado de aficionados, es poco probable que se utilice toda la potencia de ARM y que SMT sea una pared de ladrillos.
Rick_2047

2
¿No hay un Arduino Due con un uC SAM3XE (ARM 32 bits) en él? Porque, tengo uno en mi mano en este momento ...
Doombot

1
Me gustaría señalar que "hoy en día" en realidad hay placas basadas en ARM que se pueden programar utilizando Arduino (bibliotecas e IDE). Teensy 3.2 es un excelente ejemplo de esto. sparkfun.com/products/13736
Paul

Respuestas:


32

¿A alguien le importa lo que estás desarrollando?

Si y no. He estado desarrollando AVR32 para un proyecto en particular, y el entorno de desarrollo (en particular el ciclo de compilación / programa / depuración) es horrendo en comparación con, por ejemplo, PIC32.

A los clientes no les importa, excepto por el costo y el mantenimiento, y en el caso de un sistema tipo arduino, a los programadores no les importaría porque el entorno de arduino y el ciclo de desarrollo es mucho mejor que la configuración actual de AVR32.

Me pregunto porque hay un contingente tan fuerte para AVR en la familia Arduino. Entiendo que son el procesador oficial, pero no hay una razón por la que el código no se pueda portar a un ARM o una arquitectura Freescale que no sea el costo, ¿verdad? Mientras haya memoria integrada, pensé que podría haber una migración fácil a esas partes.

No hay ninguna razón por la que no se pueda usar otro procesador , pero hay una muy buena razón por la que han elegido un dispositivo de 8 bits de gama baja en lugar de un dispositivo ARM, MIPS, PowerPC, etc.

Si ha mirado la configuración incluso para los brazos de gama baja, es un orden de magnitud más complejo (mapeo de memoria, almacenamiento en caché, etc.) que un procesador de 8 bits. Pero aún más importante: en ese momento no había procesadores DIP, y estos estaban destinados a ser utilizados y construidos por artistas y piratas informáticos, no necesariamente técnicos e ingenieros electrónicos que se sienten cómodos incluso con un TQFP de 48 pines.

La razón por la que se eligió el AVR sobre el PIC es que el PIC realmente no tiene un compilador de C libre, de código abierto y ampliamente utilizado, entre otras cosas (el puerto SDCC no está maduro).

Veo una gran cantidad de ARM en la industria (parece que cada vendedor está empujando uno a sus diseños) y me preguntaba por qué no había más aceptación en el mundo de los desarrolladores de Arduino. Pensamientos?

Principalmente se debe a la facilidad de uso: complejidad, fácil de soldar, costo y al hecho de que no es necesario. A los desarrolladores les gusta la idea de tener mucha potencia, pero al final del día, cuando todo lo que necesitas hacer es mover algunos servos y encender algunas luces con un FFT de gama baja, un procesador de 8 bits está bien.

Incluso los BRAZOS de córtex de gama baja que salen en paquetes de 28 pines siguen siendo SOIC, no DIP.

Entonces el AVR tenía todas las características correctas:

  • Fácil de soldar
  • Fácil de obtener por correo en todo el mundo
  • Compilador GCC C gratuito
  • Fácil de entender el procesador y la configuración y uso de periféricos
  • Barato
  • Ubicuo: mucha gente y experiencia en torno a la familia AVR

En gran medida, esto sigue siendo cierto: no conozco un ARM en formato dip, y los adaptadores lo hacen significativamente más caro que el AVR. En su mayor parte, los fabricantes no creen que un procesador de 32 bits empaquetado DIP sea muy rentable.


Hay uno, la hélice Parallax. Tiene ocho CPU de 32 bits en el chip y viene en paquetes DIL, QFP y QFN.
Leon Heller

55
Esto es perfecto. AVR sobre PIC debido a licencias, y AVR sobre ARM debido a la simplicidad del software y la cadena de herramientas y la capacidad de soldadura. Para sus propios proyectos, esto puede no aplicarse. Sin embargo, si desea desarrollar un ARM-duino, eche un vistazo a los otros proyectos similares. No se dan cuenta como lo ha hecho el AVR. Esto también puede deberse al entorno de desarrollo de Arduino.
Kevin Vermeer

¿Qué herramientas AVR32 está utilizando? Utilizo IAR en AVR32 y MSP y he encontrado este entorno altamente capaz. El costo no es un problema en un entorno profesional, equivalente a menos que el costo de contratar a un ingeniero durante una semana.
uɐɪ

Esta afirmación sobre las herramientas se puede superar: Arduino usa gcc que también tiene un puerto AVR32 disponible.
Chris Stratton el

1
NXP ahora tiene algunos ARM Cortex-M0 en un paquete DIP. Pienso de la familia LPC11xx. Me imagino que su mercado objetivo es extremadamente barato, de baja calidad, PCB de un solo lado, en electrodomésticos.
Marko


16

Como parece que estás buscando opiniones, aquí están mis $ .02. Si estoy trabajando en un ARM o AVR es importante (y, por lo tanto, me importa), principalmente en función de lo que estoy tratando de hacer. Hay casos de uso en los que un AVR tiene sentido, y hay aquellos en los que un ARM sí. En general, también hay una compensación que se hace entre, por ejemplo, AVR y PIC.

En primer lugar, aunque probablemente me meteré en problemas por decir esto, el "fuerte contingente en la familia Arduino" es una especie de minoría vocal. La mayoría de las personas arduino (usuarios) con las que me he encontrado son del tipo que preferiría tratar su hardware de la misma manera en que crearían un script de Python para hacer algo divertido, a menudo con un menor nivel de comprensión de las complejidades involucradas que ellos. tendrían cuando harían "de numpy import foo". Si bien hay algo de mérito en la forma de hacer las cosas de Arduino, también hay muchas posibilidades de críticas.

Creo que vale la pena mirar los AVR, aparte del ecosistema Arduino. El contingente de Arduino también se ha beneficiado en gran medida de las razones que hicieron que el AVR sea un estándar de facto para los aficionados, un manto que PIC ha asumido cada vez más, incluso antes de que Arduino apareciera. Los competidores directos del AVR serían el PIC y, en cierta medida, el MSP430, que está ganando terreno debido en gran medida al fuerte impulso de marketing de TI combinado con sus herramientas de subsidio.

Ecosistema

Como se ha mencionado en otras respuestas, el AVR es la única familia que tiene una forma limpia y estandarizada de pasar de cero a hola mundo usando herramientas gratuitas. El puerto avr-gcc, las piezas que hacen que la cadena de herramientas winavr, una gran cantidad de esquemas de programador con complejidad y características variables, pero aún vinculados por la autoridad derivada de ser respaldado por avrdude, hacen que sea mucho más fácil que tratar de hacer funcionar la cadena de herramientas.

El ecosistema del PIC es una pesadilla, con cualquier cantidad de compiladores, herramientas de programación, ensambladores, lo que sea que tenga. Muchos de ellos no son compatibles entre sí. La mayoría de ellos son pagados. No todos son buenos. Más importante aún, no hay un estándar de facto. Las alternativas de código libre / abierto (digamos, SDCC) dejan mucho que desear, pero más que eso, no han logrado adquirir un estado de estándar de facto como avr-gcc y compañía. Incluso con la cadena de herramientas de software desarrollada, al menos tendría que invertir en un programador de algún tipo. El PICkit puede costar aproximadamente $ 20, pero cuando tiene que descubrir cómo comprarlo en línea (tarjetas de crédito, envíos internacionales, problemas de divisas), puede ser un factor decisivo para los aficionados. No hay una buena

MSP430 es marginalmente mejor, principalmente porque es más nuevo (al menos en términos de popularidad): hay mucho menos ruido con el que lidiar. TI le envía muestras de IC con una eficiencia que no he visto en ningún otro lugar. mspgcc está en buen estado, e incluso hay un software de depuración de código abierto que no es difícil de encontrar o configurar. Sin embargo, el problema es que no es tan amigable para los aficionados como lo es el AVR. Aún tiene el problema del Programador, que es más caro de lo que necesitaría comprar para un PIC. La operación de suministro de 3.3v pone una barrera percibida para las personas que están acostumbradas a la lógica de 5v. Y no se escala en DIP: hay disponibles de gama baja, pero no una vez que alcanzas las fichas más desarrolladas.

Facilidad de uso

DIP vs SMD, creo, es una distinción más importante de lo que a menudo se acredita. Un DIP IC se puede utilizar en una placa de pruebas, placas de uso general, como se llamen donde vive, etc. Un IC SMD requiere necesariamente una ejecución de fabricación o la compra de placas adaptadoras que no siempre son fáciles de obtener en el tamaño o la forma que desee.

La calidad de la hoja de datos, las notas de aplicación y la legibilidad de las mismas también marcan la diferencia. Atmel parece hacer un trabajo marginalmente mejor en eso. Por supuesto, esa es una evaluación altamente subjetiva.

Los AVR pueden usar un RC interno, mientras que los PIC a menudo no. se requieren un cristal, lo que hace Dicey ligeramente cuando se combina con una escasez de confianza.

Los AVR también parecían más amigables con la programación en el sistema en comparación con los PIC hace unos años, aunque fácilmente podría estar equivocado allí.

AVR vs ARM

Sin embargo, su pregunta tenía que ver con AVR vs ARM. Como dije al principio, AVR y ARM ocupan diferentes espacios en el espectro. Si tiene algo que puede hacer con un AVR, ¿por qué querría hacerlo con un ARM? Los ARM son más caros, requieren un mayor número de piezas, consumen más energía, crean códigos más complicados, necesitan procesos de fabricación más caros. Soldar un TQFP de 100 pines es más costoso que soldar un DIP / SOIC de 40 pines, dependiendo de cómo mida el costo. Es posible que esto no se cumpla si está produciendo en grandes volúmenes y utilizando técnicas de producción amigables con eso, pero si lo está haciendo, entonces la diferencia de precio será aún más convincente para ir con la solución más barata.

Como controlador de acceso para la piratería general en la casa o lo que sea, diría que AVR es más fácil de usar porque: - Más estandarizado desde una perspectiva de aficionado, más código que puedo reutilizar desde Internet porque no hay tantos variaciones del compilador y variaciones entre nombres de registro y API entre miembros de la familia. (Intente portar el código LPC ARM al hardware ATMEL ARM, verá lo que quiero decir): el código se vuelve intrínsecamente más complicado (lo hace. Realmente). - La cadena de herramientas requiere trabajo adicional para la configuración. - Hace que la interfaz sea un poco más fácil. Los ARM generalmente lo llevarán a 3v3 o 1v8 Logic, lo que hace que la interacción con otros juguetes sea un poco problemática. - Más barato: obtener un chip ARM en la ferretería local no es una opción para mí donde vivo, obtener un AVR es.


1
No recuerdo ningún PIC, aparte de algunas partes de OTP donde los bits del fusible fueron preprogramados como parte de las pruebas de fábrica (la única forma de confirmar que el modo LP, XT o HS funcionó fue configurar el chip para ese modo) eso requirió un cristal. Algunos requirieron una resistencia externa y una tapa para usar el modo RC, y tenían especificaciones bastante aproximadas sobre la frecuencia que produciría, pero no recuerdo ningún PIC sin una opción de diseño para RC interno o externo. ¿He olvidado alguna?
supercat

En realidad, el costo de ARM / AVR está bastante cerca de un lavado de recursos comparables. Y los paquetes que se usarían en un entorno de producción no son necesariamente tan diferentes, ya que probablemente serían las variantes QFP o QFN de cualquiera de los dos. El circuito de soporte requerido también es bastante comparable.
Chris Stratton el

@ Chris: Cuando tomas en cuenta los recursos que proporciona cada chip, diría que ARM saldrá más barato casi siempre. Dicho esto, el punto es que en situaciones en las que AVR tiene sentido en un entorno de producción, es donde no se necesitan los caballos de fuerza y ​​/ o las campanas y silbatos que un ARM trae a la mesa. Cuando se pesan los recursos utilizados en lugar de los recursos disponibles, el AVR sale más barato. No creo que la circuitería de soporte sea comparable (1 condensador de tantalio frente a 4, y otra espiral similar). ARM no es una bestia cara tanto como puede ser excesivo.
Chintalagiri Shashank

@supercat: Quizás. Tendría que comprobarlo. Nunca me pareció obvio las pocas veces que lo miré. Sin embargo, sé que al menos algunos dsPIC pueden volver a ser internos, si los configura correctamente, pero incluso eso requirió un poco de conjeturas y engaños para descubrirlos. Las hojas de datos de Microchip dejan mucho que desear, en mi opinión, pero, de nuevo, depende del mercado que esté viendo.
Chintalagiri Shashank

@ChintalagiriShashank: ignorando los otros periféricos y solo mirando los tamaños de flash y ram, hay ofertas de ARM que son bastante competitivas con, por ejemplo, el ATMEGA328p. Y no se distraiga demasiado con las tapas de derivación. Por un lado, el tantalio puede tener sentido como filtro de suministro, pero las tapas de derivación reales son depósitos locales de menor valor para los requisitos de conmutación de alta frecuencia y, por lo tanto, pueden ser cerámicas SMT baratas. Además, lo que impulsa la necesidad es la frecuencia de conmutación de reloj y E / S: a una frecuencia de reloj comparable, el ARM no necesitará todas las tapas de derivación recomendadas.
Chris Stratton el

12

Parte del motivo del gran interés de la comunidad en Arduino es la estandarización física. A pesar de lo complicado que es el diseño físico, al incluir una opción de expansión estandarizada, los desarrolladores de Arduino permitieron a las personas encontrar sus propias soluciones. Si desea reemplazar la placa base Arduino con otra placa que utiliza un microcontrolador diferente, puede hacerlo. IIRC, alguien ya ha construido una placa basada en PIC que utiliza el factor de forma Arduino. (La placa PIC Ardunio no tiene el mismo factor de forma, pero por lo demás es similar).

Otra razón del éxito del Arduino está en su apertura: la mayoría de los microcontroladores basados ​​en PIC estaban cerrados; Utilizaron implementaciones de hardware patentadas, por lo que si desea rediseñar la placa para que se ajuste mejor a un espacio específico, no tuvo suerte. Utilizaron firmware personalizado y herramientas de desarrollo patentadas, por lo que si tenía errores o deseaba ampliar las capacidades, no tenía suerte. Con Arduino, cada pieza del rompecabezas está abierta: puede comprar piezas en cualquier lugar, reorganizarlas según lo necesite, mejorar o modificar el firmware Y las herramientas de desarrollo. Puede comenzar de manera simple con el IDE de Arduino, pero aún puede cambiar a C o Ensamblado en cualquier momento que lo necesite.

Personalmente, me gusta el Arduino porque tiene muchas cosas "correctas": no es demasiado costoso, no está bloqueado en herramientas propietarias, es fácil comenzar, tiene mucha capacidad y tiene una gran comunidad de usuarios , que continúa expandiéndose y haciendo cosas interesantes.


1
Enumeraste muy buenas razones por las que los aficionados a los microcontroladores como Arduino, pero la pregunta era sobre ARM vs AVR. Arduino fue mencionado debido a su decisión de seleccionar la serie AVR de MCU para su implementación. Creo que algunas respuestas más relevantes se encuentran debajo de tu publicación; por ejemplo, el hecho de que Atmel admite su serie AVR con un compilador de C. Sin embargo, buena información para alguien que no está familiarizado con Arduino.
ozmo

7

Una ventaja importante de ATmel uCs es que hay un compilador gratuito disponible para Linux, PC y Mac. Agregue a eso una simple GUI multiplataforma y tendrá un sistema de desarrollo gratuito que se ejecuta en todas las plataformas.

El costo es un factor importante para las juntas de aficionados. Como desea tener un precio inicial en el rango de $ 30, debe tener un costo uC que no sea más que un par de dólares.

ARM sería un excelente candidato para los tableros de gama alta. Muchas compañías licencian el núcleo ARM y agregan periféricos. Creo que hay compiladores gratuitos para Linux, PC y MAC.

Me gusta mucho el Freescale Coldfire para tablas de gama alta. Trabajé en una placa para equipos de prueba que usaban un 5206e. Agregamos algunos convertidores DRAM y A / D y D / A de alta precisión. Fue una solución rentable. No he comparado recientemente Coldfire con la amplia variedad de ARM.

Algunos de los uC Freescale de 8 bits son buenos, pero no estoy seguro de si tienen herramientas gratuitas.


44
Gracias por el útil comentario, pero las 8 líneas de 'firma' son un poco extremas, estos sitios basados ​​en stackoverflow tienden a despreciar la publicidad de sus propios sitios en sus respuestas.
davr

55
@jluciani, si desea anunciar sus otros sitios web, coloque los enlaces en su perfil, no en sus respuestas. Después de todo, su blog no es la respuesta a esta pregunta ...
Craig Trader

5

Estoy de acuerdo con el paquete de inmersión, no estoy de acuerdo con que los brazos sean más difíciles de configurar, los lpcs lo son, pero no son el único niño en el bloque de brazos (el atmel en sí mismo). Por lo que recuerdo y experimenté, Atmel fue y quizás aún es más amigable para los desarrolladores. La mariposa AVR les ayudó mucho a atraer más usuarios a su base de usuarios feliz y de buen tamaño. El PIC fue doloroso en muchos sentidos, las herramientas AVR estaban allí, la programación fue muy fácil y no le costó mucho más que algunos cables y un conector de radio shack. Las herramientas están disponibles y son gratuitas, pero no tan fáciles como mainline gcc, donde se encuentran las soluciones de brazo y pulgar. Mucho antes de que saliera el arduino, el AVR era el chip elegido para proyectos de hobby.

Nada puede competir con ARM en este momento. Para cualquier otro procesador que toque en un día, toque algunos ARM como mínimo. Para algunos, casi todo lo que tocas usa un BRAZO. Es un ajuste natural como el asesino de 8 bits, puede obtener un rendimiento mucho mejor que un 8 bits para el mismo tamaño, precio, etc. Las herramientas son mucho mejores, el conjunto de instrucciones es mucho más limpio que la mayoría de su competencia, por lo que se ejecuta el mismo código que mucho más rápido, etc. Debido a que cualquiera y su hermano pueden incrustar un ARM y no está encerrado en una compañía como pic, avr, msp430, hay una amplia variedad de soluciones y tantas formas diferentes de lidiar con las mezclas de microcontroladores rom / ram y la tabla de vectores de interrupción. Lamentablemente, la solución más popular es la más dolorosa. Prueba un sam7 o algo así o un stellaris.

El problema no es siempre el procesador, algunos chips tienen problemas conocidos, otros tienen otros problemas conocidos. algunos pueden no ofrecer un pin io de colector abierto con un pull up débil y tendrías que colocar el hardware fuera del chip para interactuar con algo, donde otro puede tener eso disponible en uno o todos los pines. Recomiendo probar el campo, probar las diferentes compañías y soluciones para que cuando desee poca potencia pueda usar fácilmente un msp430, desee potencia de procesamiento en un pequeño chip que vaya con el brazo o si desea hacer un proyecto abierto que espera otros construirán en su garaje si lo puedes basar en un arduino.

La conclusión es que su pregunta realmente depende de su aplicación y de cómo la escribe y del rendimiento y los recursos que le interesan. De la misma manera que gcc o firefox se ejecutarán en muchas plataformas y procesadores diferentes, ciertamente puede escriba su aplicación C para ejecutarla en una amplia variedad de microcontroladores ... SI... tiene una capa de abstracción específica de microcontrolador, que tiene un costo. si los microcontroladores tienen características similares y tienen las características que necesita y planifica con anticipación e incorpora esas. Si la siguiente plataforma tiene suficiente memoria / recursos. Está más interesado en la portabilidad que en el rendimiento, etc. Posiblemente deba planificar esto con anticipación. o al menos en el primer cambio de A a B, usted rediseña el software, si / cuando hay un tercer cambio de B a C es menos doloroso.


Nada puede competir con ARM en este momento. <- En la industria. En el mundo de los aficionados, AVR sigue siendo muy, muy fuerte, y lo será durante mucho tiempo.
Kevin Vermeer

Absolutamente de acuerdo, un mundo avr es una locura popular, otro mundo en el que están los productos que compramos y usamos, donde está el dinero, es otra cosa. Entonces, para divertirse en casa, aprenda uno, para su trabajo diario, aprenda el otro y juegue todo el día y toda la noche.
old_timer

4

Sé que dijiste "aparte del costo", pero realmente eso es lo más importante para los aficionados. No necesita más de un UART o más de un SPI en lo que se supone que es una plataforma barata y genérica. Una vez que comience a necesitar velocidades de> 20 mhz, realmente debería buscar una configuración personalizada (ymmv, por supuesto)


3

Un par de pequeños puntos no mencionados en los otros comentarios:

  • Un Arduino está destinado a proyectos de E / S a pequeña escala, agregando una pequeña cantidad de inteligencia a un circuito. Por lo general, son dispositivos de un solo subproceso, en tiempo real, donde un ARM sería muy desperdiciado. Por supuesto, hay muchas opciones para las placas ARM, pero el caso de uso suele ser diferente: por lo general, se inician en un sistema operativo a gran escala.

  • Al enfocarse en este caso de uso a pequeña escala, todo lo demás se vuelve más fácil: conteo de pines, componentes de soporte, consumo de energía, etc.

Dicho esto, para el caso de uso objetivo del Arduino, no es como si lo estuvieras haciendo un tugurio. Un procesador de 16MHz es muy duro para su reloj despertador con un cazador LED integrado (o lo que sea :)


2

Arduino está disponible en otros procesadores. Mira el ChipKit de Microchip, por ejemplo. Que usa un PIC 32.


Lo siento, Olin, el título fue un intento incorrecto mío de editar la pregunta, hecha desde su cuerpo. Debería ser más correcto ahora.
clabacchio

1

Segundo intento (el título de la publicación original y la pregunta de hace +3 años cambiaron desde la respuesta original):

Pollo y huevo, pero especialmente durante los últimos años (2007 ARM lanzó la arquitectura Cortex-M), las MCU de 32 bits han crecido en popularidad y los proveedores han sido mejores para proporcionar un acceso más rápido y fácil para la comunidad de EE al diseñar en> 8- bit micros (mejores herramientas sw, herramientas gratuitas, más ejemplos ...).

Como Atmel, junto con otros 100, también ofrece dispositivos Cortex-M y ha actualizado su cadena de herramientas para admitir AVR a ARM, además de la relación de larga data, se proporciona la ruta de actualización de Arduino (?). Pero, las alternativas aparecen y parecen involucrar intentos alternativos para ganar su parte del pastel "aficionado": por ejemplo, mbed por NXP / ARM, y recientemente "CoAction Hero",: Junta de 32 bits de código abierto ARM Cortex-M3 en KickStarter .

Reflexión final, 3 años después de la pregunta inicial: cuando todos los proveedores ofrezcan núcleos Cortex-M de 32 bits, ¿podría el Arduino dejar de ser Atmel?

Respuesta original: Alf-Egil Bogen, uno de los cofundadores de Atmel AVR, analiza algunos de los antecedentes del movimiento de la industria de núcleos ARM de 8 bits a 32 bits en su video blog aquí http: //blog.energymicro. com / 2013/04/24 / avr2arm / .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.