Syntax/Datentyp
-
Hey,
um welchen Datentyp handelt es sich bei folgender Initialisierung?
Geh ich recht der Annahme, dass es sich hierbei um einen 4-Byte Datentyp handelt?Initialisierung:
volatile unsigned *gpio;
Zuweisung:
gpio = (volatile unsigned *)gpio_map;
Der Gesammte Code ist unter
http://elinux.org/RPi_Low-level_peripherals
zu finden, Abschnitt GPIO Code examples - erstes Bsp. in C
Danke!
-
Wieso fragst du? Überprüfe es doch selbst!
#include <stdio.h> #include <limits.h> int main(void) { volatile unsigned *gpio; printf("Size of pointer in bytes: %zu\n", sizeof(gpio)); printf("Size of pointee in bits: %zu\n", sizeof(gpio) * CHAR_BIT); printf("Size of pointee in bytes: %zu\n", sizeof(*gpio)); printf("Size of pointee in bits: %zu\n", sizeof(*gpio) * CHAR_BIT); }
-
3x3cuter schrieb:
Geh ich recht der Annahme, dass es sich hierbei um einen 4-Byte Datentyp handelt?
...volatile unsigned *gpio;
Du hast ein
unsigned int
Typ.
Wie groß der ist, ist System und Compilerabhängig.
-
Gut, danke.
-> 4 Byte auf meinem Pi.
Jetzt hat der Pi allerdings mehr wie 32 ansteuerbare Pins. z.B. Pin 34 soll gesetzt werden. Dann gibt für mich die letzte Zeile keinen Sinn mehr, kann mir das jemand erklären?#define GPIO_SET *(gpio+7) // sets bits which are 1 ignores bits which are 0 #define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0 ... g=34; GPIO_SET = 1<<g;
-
Wenn du diese Zeile geschrieben hast und nicht weißt, wie du die anderen Pins setzt, definiere doch ein zweites Makro für das andere GPIO-Register (siehe Datenblatt, Seite 90 und 95):
#define GPIO_SET2 *(gpio+8) // ... GPIO_SET2 = 1U << 2; // oder GPIO_SET2 = 1U << (g - 32);
Oder schreibe eine Funktion:
#define GPSET0 *(gpio+7) #define GPSET1 *(gpio+8) static void gpio_set(unsigned pin) { assert(pin <= 53); if (pin < 32) GPSET0 = 1U << pin; else GPSET1 = 1U << (pin - 32); } // ... gpio_set(34);
Ungetestet, da kein Raspberry Pi.
-
Danke für die Mühe!
Ich sollte wohl etwas bestrebter an die Sache ran gehen..