Estoy desarrollando un dispositivo de procesamiento de protocolo personalizado basado en MCU. Mi protocolo es algo similar a I2C y utiliza bit bitging en lugar de la implementación de hardware. He hecho un prototipo basado en Atmega328P, principalmente debido a un montón de ayuda en línea y tableros de desarrollo baratos. Cuando todo comenzó a funcionar, descubrí que no estoy satisfecho con la velocidad máxima de la lógica de procesamiento del protocolo. Aunque la mayoría de las instrucciones se procesan en 1T en Atmega328P, y tiene una latencia ISR razonablemente rápida (solo 4T), el principal problema es que se agregan muchas instrucciones push / pop para conservar / restaurar registros.
Ahora, estoy considerando alguna otra arquitectura de MCU, que me permitirá ejecutar mi código más rápido. Espero que la MCU moderna basada en el núcleo 8051 sea una opción.
EMF8
, por ejemplo, puede ejecutarse a 50-75MHz, igual que ARM, puede ejecutar el 70% de las instrucciones en 1T. A pesar de que tomará 9T + 9T entrar y salir de ISR, espero que no sea necesario empujar / abrir tantos registros, ya que puede trabajar directamente con RAM, sin el uso obligatorio de registros (como en Cortex). Por alguna razón, AT89
ni siquiera aparecen en la lista del sitio web de Microchip después de que Atmel se haya hecho cargo. Hay otros disponibles, pero no sé cómo se pueden comparar.
Cortex-M0(+)
es otra opción, pero hay personas en Internet que se quejan de la gran latencia de los ISR, aunque según ARM debería ser eficiente y eficiente. Aunque me permitirá ejecutar el código 3 veces más rápido en 48MHz, lo más probable es que sufra el mismo problema que Atmega328P, ya que tuvo que presionar / abrir muchos registros. Tampoco creo que me vaya a beneficiar la arquitectura de 32 bits, ya que mi código no utiliza ningún tipo de cálculo y se basa principalmente en tipos uint_8t
.
Espero que las personas tengan experiencia con los nuevos 8051 y puedan dar su opinión.
=== EDITAR para proporcionar más detalles ===
- El protocolo es síncrono, usa 2 pines: uno para el reloj, uno para los datos.
- ISR está en cambio de pin, sin embargo, con
AVR
no puedo tener ISR separados para reloj y datos, ya que ambos pines están en el mismo puerto. Tengo más lógica en ISR para identificar qué pin ha cambiado. - En 16MHz cronometrado
atmega
estoy teniendo 10kbps (kilobit) con lógica completa en ISR y 50kbps con el mínimo. Establecí que 25us después de que el pin toggle en master sea suficiente para que el esclavo procese el cambio con el mínimo de lógica. 10us no es suficiente, empieza a faltar el reloj. - El código se implementa en C puro sin ASM. Todos los push / pops se insertan por
avr-gcc
. Puedo ver en la descompilación que todos los registrosr18-r31
se conservan / restauran.