Ardupilot, atmega1280 y barómetro

0

Estoy trabajando en un proyecto y necesito saber dónde se almacena la información tomada por el sensor del barómetro. Pienso en el eeprom, pero ¿exactamente dónde? ¿Hay una dirección específica o memoria de registro?

Mi objetivo es hacer el ataque de ROP en el sistema.

Compilé el código ArduPlane (solo la parte de Ardupilot relativa al avión y no a la estación de tierra), luego encontré el .elf y yo hicimos el comando

avr-objdump -S arduplane.elf > arduplane.lss

y ahora tengo la instrucción de todo el arduplane. En la sección del sensor encontré la función

static int32_t read_barometer(void){
   barometer.read();
   return altitude_filter.apply(barometer.get_atitude()*100.0);
}

que en el lss se convirtió:

static void init_barometer(void)
{
    697e:   cf 93           push    r28
    6980:   df 93           push    r29
    barometer.calibrate(mavlink_delay);
    6982:   cc e8           ldi r28, 0x8C   ; 140
    6984:   dc e0           ldi r29, 0x0C   ; 12
    6986:   ce 01           movw    r24, r28
    6988:   6b e5           ldi r22, 0x5B   ; 91
    698a:   7e e4           ldi r23, 0x4E   ; 78
    698c:   0e 94 f6 8d     call    0x11bec ; 0x11bec <_ZN7AP_Baro9calibrateEPFvmE>
    }
    void            set_compass(Compass *compass) {
        _compass = compass;
    }
    void            set_barometer(AP_Baro *barometer) {
        _barometer = barometer;
    6990:   d0 93 8b 07     sts 0x078B, r29
    6994:   c0 93 8a 07     sts 0x078A, r28
    ahrs.set_barometer(&barometer);
    gcs_send_text_P(SEVERITY_LOW, PSTR("barometer calibration complete"));
    6998:   81 e0           ldi r24, 0x01   ; 1
    699a:   90 e0           ldi r25, 0x00   ; 0
    699c:   64 ec           ldi r22, 0xC4   ; 196
    699e:   7f e0           ldi r23, 0x0F   ; 15
    69a0:   0e 94 a4 34     call    0x6948  ; 0x6948 <_ZL15gcs_send_text_P12gcs_severityPK11prog_char_t>
}
    69a4:   df 91           pop r29
    69a6:   cf 91           pop r28
    69a8:   08 95           ret

¿Los registros r29 y r28 están dedicados al barómetro?

¿Son 0x078B y 0x78A las direcciones de pila para la información?

    
pregunta DarkCoffee

1 respuesta

1

Supuesto : La pregunta se refiere al ahora descontinuado ArduPilot Mega APM-1, que utiliza el microcontrolador atmega1280.

La información del sensor barométrico no se almacena explícitamente en ninguna parte del código AFAIK, a menos que esté registrando parámetros de ubicación, en cuyo caso su código define dónde se almacenará.

El valor absoluto barométrico instantáneo se obtiene mediante barometer.read() . Esto devuelve la presión absoluta detectada por el barómetro, que puede tener un valor limitado, ya que deben tenerse en cuenta los valores de temperatura y calibración.

La transformada de altitud de la lectura barométrica se obtiene mediante read_barometer() que devuelve un int32_t en centímetros. Este valor depende adicionalmente de la línea de base calibrada desde barometer.read() al reiniciar o iniciar, e incorpora cálculos relacionados con la temperatura.

Es sencillo agregar código para registrar el valor del barómetro en una variable o matriz volátil, usando el IDE de Arduino.

Al especular que el requisito de valor de barómetro proviene de algunos fallos de lectura barométrica aleatorios observados en uso, este es un problema conocido en versiones anteriores, y aún parece que permanece en la versión 2.5, pero se ha reducido mucho o se ha resuelto: en esto.

Recomendaciones si este es el problema:

  • Actualice a la versión 2.5 del software
  • Después de la puesta en marcha, espere unos 5 minutos para que la electrónica se estabilice en la temperatura, luego presione reiniciar para reiniciar y recalibrar todos los sensores.
respondido por el Anindo Ghosh

Lea otras preguntas en las etiquetas