Assembler del ULP del ESP32

Hola, utilizo la tarjeta ** al Thinker esp32**

Estoy intentando compilar un programa en el assembler del ULP y no consigo el programa objeto, ni desde el mismo IDE ni compilando fuera, me saltan errores como si no conociera según que códigos.
Cuando uso las MACRO, si que funcionan pero como en todas partes dicen que son obsoletas, pues quiero intentar hacer correr el procesador de bajo consumo con el assembler compilado.

Primero creando una nueva pestaña en el IDE " Sketch_ULP.S " la procesa pero me da una serie de errores de codigo, los mismos que si ese fichero lo compilo fuera con el programa xtensa-esp32-elf-as.exe

Os paso el codigo del Sketch_ULP.S

      .global entry
entry:
     move     r3, r0
     ld       r0, r3, 0
     add      r0, r1, 1
     st       r0, r3, 0
     HALT
     WAKE

En la serie de errores sale como si hubiera códigos que no conoce. El "add" si que lo reconoce, este como ejemplo no lo reconoce.

"C:\Arduino_CAM\Button_Test_ULP\Sketch_ULP.S:5: Error: unknown opcode or format name 'move' "

Y el codigo del Sketch.ino


// Programa para pruebas del ULP
//
#include "driver/rtc_io.h"
#include "esp_sleep.h"
#include "esp32/ulp.h"
#include "EEPROM.h"
//
// EEPROM.write(0,valor)  // Escritura EEPROM 
// EEPROM.read(0)         // Lecturas EEPROM
//
//__attribute__((aligned(4))) static uint32_t ulp_data[10] ; // Reserva memmoria????
extern "C" {
 // #include "ulp_miprograma.h"  //  este es el programa compilado desde el 

  extern const uint8_t ulp_main_bin_start ;
  extern const uint8_t ulp_main_bin_end ;
}
 
void setup() {
Serial.begin(115200) ;  
const ulp_insn_t program[] = {
// aqui iban las Macro I_MOVE........   
  };
size_t load_addr = 0;
size_t size = sizeof(program)/sizeof(ulp_insn_t);
ulp_process_macros_and_load (load_addr, program, &size ) ;
ulp_run (load_addr) ;
}

void loop() {
Delay  (1000);
}
Diria que el  **xtensa-esp32-elf-as.exe** no reconoce todos los neumonics del procesador ULP. ¿ puede que para Arduino haya otros?

Alguien me puede ayudar como compilar y cargar en el ULP.

Gracias por anticipado

He encontrado por ahi un código muy simple

#include <Arduino.h>

// put function declarations here:
extern "C" int	assemblyAdd(int a, int b);

void setup() 
{}

void loop() {
  
  volatile uint32_t i = 99;
  volatile uint32_t e = 0;
  

  e = assemblyAdd(i, (uint32_t) 10);

  while(1);
}

y el .S

                .global assemblyAdd

assemblyAdd:     entry   a1, 48
                add     a2, a3, a2
                retw.n

y funciona.

Dato del assembler:109

cuando lo intento con tu código assembler da los errores que citas.

Prueba con

Hola Surbyte, gracias por tu interés.

Pero por lo que voy viendo y avanzando, esa compilación funciona, pero por lo que parece utiliza el programa xtensa-esp32-elf-as.exe de Arduino, en realidad esta compilando el código assembler del los cores principales, o sea los Xtensa, Ref " Instruction Set Architecture (ISA ) " y no el código del ULP que es el que estoy interesado en programar.

En conclusión deberíamos de conseguir el ejecutable para el ensamblador del ULP, que ya empiezo a dudar que lo tenga Arruino incorporado.

Todos los inputs que tengo me llevan a que debería de compilar el código del ULP fuera y conseguir el .obj e incorporarlo ya compilado al Arduino, pero esto según he leído es de alto nivel , aparte de trabajar con Python......o sea un calvario. Si no hay otro remedio habrá que pasar por eso.

Según parece para hacer esto hay que trabajar con los programas de ESP-IDF de los cuales, al final consigues el .obj y/o .o que necesito, mas las etiquetas globales de enlace entre procesadores.

Seguiré intentándolo y os tendré informados cuando lo consiga, no obstante si alguien ya ha pasado por este calvario, le agradecería que me lo dijera y así acortamos el camino.

Creo que este post es muy interesante si llegamos al final, ya que eso nos permitirá poder utilizar el ULP para dormir y despertar el sistema desde el entorno Arduino, funcion muy interesante.

Gracias

Buenas noches

Tal como he comentado en el foro, hay instrucciones que si que las coge, y una de ellas era el ADD.
pero tal como te digo en el foro, son del Xtensa.

Dejare este tema unos dias para enfriar la cabeza y me dedicaré con el tiempo de latencia de las INT.

Cuando lo tenga lo publico tal como me propusiste.

Buenas noches

Javier Valero

Missatge de Surbyte via Arduino Forum <notifications@arduino.discoursemail.com> del dia dj., 8 d’ag. 2024 a les 0:30:

Cambia de framework, usa el de Expressif, claro que vas a tener que hacer un gran cambio.

Fíjate si te sirve (si ya no lo has hecho)

Gracias Maximo, esta fue mi primera esperanza, pero aunque leí que para windows no funcionaba, intenté procesarlo, eso sí en el Arduino 1.x.x ya que en el 2.x.x no te deja crear ventanas con .s minúscula.

Al final no funcionó..... lo único que tuve que volver a cargar la versión de arduino 1.x.x .......
No se si en Linux funciona, pero si funciona es una gran utilidad, la cual según parece, programas en C++ y te la compila en ULP..... un chollo.

Gracias por vuestro interés.

Javier valero

Gracias Surbyte, me temo que acabare ahí, pero....... tengo que coger aire...

Gracias

javier Valero

No termino de entender...
¿Necesitas archivos .c o .S?

Solo por curiosidad. :wink:

Perdona quería decir .s minúscula.

sorry. lo reedito. gracias.

Hola Moderadores.

Quisiera traducir este post al ingles y reescribirlo en su foro. A ver si tengo mas suerte antes de ir a Expressif, tal como me sugirió Surbyte

Me podéis indicar como he de proceder para no duplicar hilos?

Gracias por anticipado

Hilo cerrado a pedido del Autor.
Recomendaciones, todo lo que postees en el foro en inglés en ese idioma, que no se te escape ni un solo comentario. Hasta cambia las variables a inglés.