Hi,
ich versuche derzeit ein wenig in die Materie von FreeRTOS einzutauchen.
Das klappt soweit auch ganz gut, das Prinzip hab ich verstanden und
nicht kommunikative Dinge funktionieren soweit auch nachvollziehbar.
Jetzt habe ich gestern versucht, einen BME280 (Umweltsensor von Bosch)
der I2C unterstüzt zu integrieren und bin dabei nach der Empfehlung des
entsprechenden GitHub Repos vorgegangen (Pointer des BME280 Device auf
entsprechende Funktionen für I2C).
Dafür verwendete ich folgende API die offiziell von Bosch stammt:
https://github.com/BoschSensortec/BME280_driver
Was soll ich sagen, kompilieren tut es, allerdings hänge ich kurz nach
dem starten des Debuggings in einer Schleife fest wo er den Systemtick
erwartet.
Ich nutze die HAL von ST sowie FreeRTOS. Falls jemand helfen kann stelle
ich auch gerne meinen (relevanten) Code ein. Ich bin mir relativ sicher
dass es nichts mit der API von Bosch zu tun hat, sondern eher das mir
das entsprechende Wissen fehlt wie man Kommunikation wie I2C o.ä
vernünftig in FreeRTOS umsetzt :/.
Das ganze passiert auf einem BluePill Board (mit echtem STM32^^ liegt
schon ne Weile hier herum). Verkabelung sollte soweit stimmen.
Schonmal vielen Dank.
Vorname N. schrieb:> Pointer des BME280 Device auf> entsprechende Funktionen für I2C
Das ruft nach Klärungsbedarf. Da müsstest du schon etwas
genauer und verbindlicher werden.
"Pointer des BME280 Device" klingt schon sehr nach Geschwurbel.
Die Sprache die hier zur Kommunikation verwendet wird ist
der Quellcode ....
Ich habe das so verstanden, dass die API von Bosch die I2C Funktionen
der Hal selbstständig aufruft in dem ich die entsprechenden Pointer des
structs bme280 auf diese zeigen lasse.
1
structbme280_dev
2
{
3
/*< Chip Id */
4
uint8_tchip_id;
5
6
/*< Interface function pointer used to enable the device address for I2C and chip selection for SPI */
7
void*intf_ptr;
8
9
/*< Interface Selection
10
* For SPI, intf = BME280_SPI_INTF
11
* For I2C, intf = BME280_I2C_INTF
12
* */
13
enumbme280_intfintf;
14
15
/*< Read function pointer */
16
bme280_read_fptr_tread;
17
18
/*< Write function pointer */
19
bme280_write_fptr_twrite;
20
21
/*< Delay function pointer */
22
bme280_delay_us_fptr_tdelay_us;
23
24
/*< Trim data */
25
structbme280_calib_datacalib_data;
26
27
/*< Sensor settings */
28
structbme280_settingssettings;
29
30
/*< Variable to store result of read/write function */
31
BME280_INTF_RET_TYPEintf_rslt;
32
};
Das gesamte SetUp sieht dann so aus:
1
structbme280_devdev;
2
int8_trslt=BME280_OK;
3
uint8_tdev_addr=BME280_I2C_ADDR_PRIM;
4
5
dev.intf_ptr=&dev_addr;
6
dev.intf=BME280_I2C_INTF;
7
dev.read=user_i2c_read;
8
dev.write=user_i2c_write;
9
dev.delay_ms=user_delay_ms;
10
11
rslt=bme280_init(&dev);
Wenn ich beim Debuggen durch das Programm skippe funktioniert auch alles
problemlos bis ich diese Funktion aufrufe:
Er springt auch problemlos in die I2C HAL Funktion, landet dann aber
einen Takt später in der SysTick Funktion und kommt da nicht mehr raus.
Eine Ausgabe erhalte ich auch nicht obwohl das durch die implementierte
print Funktion in der oben geschriebenen Funktion eigentlich passieren
sollte (Wenn das Device was gesendet hat und das empfangen wurde).
Johannes S. schrieb:> Da sind also Wrapper nötig die diese Argumente nehmen und dann die> entsprechende HAL Funktion aufrufen.
Ok, ergibt Sinn. Leider hab ich sowas noch nie gemacht :/ Wie wäre hier
jetzt das vorgehen? Grundsätzlich verstehe ich glaube ich schon was das
Problem ist, allerdings frage ich mich grade wie ich das umsetzen soll.
Auf jeden Fall schonmal vielen Dank :)
Ich glaube ich habs jetzt verstanden. Ich zeige quasi auf eine Funktion
mit den entsprechenden ÜBergabeparametern wie in der oben genannten
Definition und rufe dann IN dieser Funktion die eigentliche HAL Funktion
mit den Parametern auf, richtig?
Falls irgend jemand hier nochmal drüber stolpern sollte und das selbe
Problem hat: Ich hab es tatsächlich gelöst :)
Für eine direkte Registeradressierung innerhalb des Slave muss man die
MemRead /Write Funktionen nehmen. Die Wrapper können dann z.B. so
ausschauen:
Harry L. schrieb:> Macht das Leben sehr viel einfacher...
Mir erschliesst sich bis heute nicht warum man auf einem F103
ein wie auch immer gestaltetes RTOS verwendet um einen popeligen
Sensor zu steuern oder auszulesen. Auch nicht gezeigte Zusatz-
Funktionalität macht es noch nicht plausibel sich den Overhead
eines Betriebssystems auf einen mini kleinen Controller anzutun.
hard werker schrieb:> Mir erschliesst sich bis heute nicht warum man auf einem F103> ein wie auch immer gestaltetes RTOS verwendet um einen popeligen> Sensor zu steuern oder auszulesen. Auch nicht gezeigte Zusatz-> Funktionalität macht es noch nicht plausibel sich den Overhead> eines Betriebssystems auf einen mini kleinen Controller anzutun.
Vielleicht um wie der TO schrieb
Vorname N. schrieb:> derzeit ein wenig in die Materie von FreeRTOS einzutauchen
Muss ja nicht immer den "grossen" Sinn machen aber lernen kann man
daraus und darum geht es anscheinend dem TO.
Ciao Hans
Hans schrieb:> Muss ja nicht immer den "grossen" Sinn machen aber lernen kann man> daraus und darum geht es anscheinend dem TO.
Genau so ist es. Das BluePill Board lag hier noch rum und das Thema RTOS
interessierte mich schon länger :)
hard werker schrieb:> Mir erschliesst sich bis heute nicht warum man auf einem F103> ein wie auch immer gestaltetes RTOS verwendet
Also im Vergleich zu vielen 8-Bit oder 16-Bit Mikrocontroller ist selbst
ein "popeliger" und steinalter STM32F103 ein Monster und steckt wegen
des grossen RAM's, Flash und hoher CPU Taktfrequenz den Overhead für
FreeRTOS locker weg, auch wenn man nur ein paar LED's blinken lassen
will.