munmap auf volatile-zeiger
-
hallo!
ich habe eine datenstruktur mit volatile-zeiger die auf mittels mmap eingebundenen speicher verweisen sollen; quasi
struct RegisterStruct { uint32_t *ledregister; uint32_t *moderegister; uint32_t *frequencyregister; uint32_t *amplituderegister; volatile uint32_t *channel1iregister; volatile uint32_t *channel1qregister; volatile uint32_t *channel2iregister; volatile uint32_t *channel2qregister; int memfd; int intfd; };
funktioniert auch alles scheinbar.
an anderer stelle möchte ich den speicher dann wieder aus dem programm entfernen, also u.a.
rc = munmap(rs->channel1iregister, sysconf(_SC_PAGESIZE));
woraufhin mir der compiler dann folgende warnung (bzw. für die anderen pointer eben auch) ausgibt:
/usr/include/arm-linux-gnueabihf/sys/mman.h:76:12: note: expected ‘void *’ but argument is of type ‘volatile uint32_t * {aka volatile unsigned int *}’
extern int munmap (void *__addr, size_t __len) __THROW;frage: kann ich das einfach casten, muss ich da eine andere funktion nehmen, soll ich die warnungen einfach ignorieren?
-
Du bekommst die Warnung vom Compiler weil der pointer volatile markiert ist. Ein static cast auf void* ist ok hier.
-
Ein
static_cast
aufvoid*
wird nur nicht gehen. Aber in diesem Fall ist auch der nötigeconst_cast
OKWobei es fast C sein muss wenn der Compiler nur ne Warning gibt. Und da es in C eh nur "den" Cast gibt...
-
ich habe gar nicht gesehen, dass man mir geantwortet hat......
ja es ist C. wenn ich das einfach auf void * umcaste, funktioniert das ja auch (scheinbar, glaube ich.....). aber jetzt ist es natürlich so, dass volatile ja einen bestimmten zweck hat, nämlich optimierungen auf variablen, die sich außerhalb des programmablaufes ändern könnten, zu unterbinden, und irgendwie hatte bzw. habe ich da angst, dass da nachher irgendwelche fiesen programmfehler auftreten könnten, weshalb ich einfach einmal nachfragen wollte.
-
Das ist OK, das kannst du ohne Bedenken casten.