ESP8266 startet ständig neu

OP #5735750
Lesenswert?

Ich arbeite aktuell mit dem espressif NONOS_SDK 3.1 für den ESP8266. 
Gerade bin ich dabei, die Temperaturdaten aus einem BMP280 auszulesen. 
Das klappt soweit schonmal (siehe Anhang).

Meine user_main.cpp sieht so aus:
1
extern "C" {
2
    #include "user_interface.h"
3
    #include "ets_sys.h"
4
}
5

6
#include "I2C_OLED.h"
7
#include "BMP280.h"
8

9
#if ((SPI_FLASH_SIZE_MAP == 0) || (SPI_FLASH_SIZE_MAP == 1))
10
#error "The flash map is not supported"
11
#elif (SPI_FLASH_SIZE_MAP == 2)
12
#define SYSTEM_PARTITION_OTA_SIZE              0x6A000
13
#define SYSTEM_PARTITION_OTA_2_ADDR              0x81000
14
#define SYSTEM_PARTITION_RF_CAL_ADDR            0xfb000
15
#define SYSTEM_PARTITION_PHY_DATA_ADDR            0xfc000
16
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR        0xfd000
17
#elif (SPI_FLASH_SIZE_MAP == 3)
18
#define SYSTEM_PARTITION_OTA_SIZE              0x6A000
19
#define SYSTEM_PARTITION_OTA_2_ADDR              0x81000
20
#define SYSTEM_PARTITION_RF_CAL_ADDR            0x1fb000
21
#define SYSTEM_PARTITION_PHY_DATA_ADDR            0x1fc000
22
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR        0x1fd000
23
#elif (SPI_FLASH_SIZE_MAP == 4)
24
#define SYSTEM_PARTITION_OTA_SIZE              0x6A000
25
#define SYSTEM_PARTITION_OTA_2_ADDR              0x81000
26
#define SYSTEM_PARTITION_RF_CAL_ADDR            0x3fb000
27
#define SYSTEM_PARTITION_PHY_DATA_ADDR            0x3fc000
28
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR        0x3fd000
29
#elif (SPI_FLASH_SIZE_MAP == 5)
30
#define SYSTEM_PARTITION_OTA_SIZE              0x6A000
31
#define SYSTEM_PARTITION_OTA_2_ADDR              0x101000
32
#define SYSTEM_PARTITION_RF_CAL_ADDR            0x1fb000
33
#define SYSTEM_PARTITION_PHY_DATA_ADDR            0x1fc000
34
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR        0x1fd000
35
#elif (SPI_FLASH_SIZE_MAP == 6)
36
#define SYSTEM_PARTITION_OTA_SIZE              0x6A000
37
#define SYSTEM_PARTITION_OTA_2_ADDR              0x101000
38
#define SYSTEM_PARTITION_RF_CAL_ADDR            0x3fb000
39
#define SYSTEM_PARTITION_PHY_DATA_ADDR            0x3fc000
40
#define SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR        0x3fd000
41
#else
42
#error "The flash map is not supported"
43
#endif
44

45
static const partition_item_t at_partition_table[] = {
46
    { SYSTEM_PARTITION_RF_CAL,              SYSTEM_PARTITION_RF_CAL_ADDR,             0x1000},
47
    { SYSTEM_PARTITION_PHY_DATA,             SYSTEM_PARTITION_PHY_DATA_ADDR,           0x1000},
48
    { SYSTEM_PARTITION_SYSTEM_PARAMETER,         SYSTEM_PARTITION_SYSTEM_PARAMETER_ADDR,       0x3000},
49
};
50

51
extern "C" void ICACHE_FLASH_ATTR user_pre_init(void) {
52
    if(!system_partition_table_regist(at_partition_table, sizeof(at_partition_table)/sizeof(at_partition_table[0]),SPI_FLASH_SIZE_MAP)) {
53
    os_printf("system_partition_table_regist fail\r\n");
54
    while(1);
55
  }
56
}
57

58
extern "C" void ICACHE_FLASH_ATTR user_init(void) {
59
    BMP280 bmp_280 = BMP280();
60

61
    while(true) {
62
        int32_t temperature = bmp_280.read_temperature();
63
        os_printf("Temperature: ");
64
        os_printf("%d\r\n", temperature);
65
        os_delay_us(2000000);
66
    }
67
}

Mit dem 2s Delay hatte ich eigentlich gedacht, dem ESP8266 genügend 
Spielraum für interne Angelegenheiten zu geben, die Ausgabe habe ich 
auch angehängt.

Ich komme genau 2 mal dazu die Temperatur auszulesen, dann startet der 
ESP8266 neu.

Hat dazu jemand eine Idee?
Angehängte Dateien:
#5736045
Lesenswert?

Hallo,

ich treibe mich auf den ESPs aus Bequemlichkeit in der ArduinoIDE rum, 
aber trotzdem: was meldet der ESP8266 als Resetgrund (Baudrate ist 
74880)?
Ich habe mich jetzt nicht nach unten gekramt, aber sicher, daß 
os_delay_us die anderen Tasks bedient und nicht nach rund 6s einfach der 
WDT zuschlägt?

Gruß aus Berlin
Michael
Gast #5737022
Lesenswert?

Ich kenne mich mit dem ESP nicht aus.

Zwei Punkte aber trotzdem:

1. Warum läuft die Schleife in der internen Funktion "user_init". Ein 
C-Programm beginnt immer mit "main".

2. Ein Delay ist mir bisher immer als tote Schleife untergekommen. Hier 
wird der Prozessor wirklich die ganze Zeit blockiert.

Ich tippe hier auf Watchdog.
Gast #5737475
Lesenswert?

Max M. schrieb:
> D.h. man sollte quasi alle wiederholenden Tätigkeiten in einen Timer
> auslagern und die Timerfunktion dann auch möglichst schnell abarbeiten?

Nein man nutzt einen Timer als Zeitgeber und stößt die Abarbeitung von 
Aufgaben in der Mainloop, evtl. abhängig von Zeitintervallen, an.

Hängt immer von der Aufgabe und deren Teil-Prioritäten ab.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren