Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    110

    [C]#define MACRO x<<Y ??

    Ciao a tutti,
    non so se è una domanda banale....leggendo questo pezzo di code su internet:
    codice:
    ........
    #include "stdio.h"    
    #include "unistd.h"   
    #include "sys/ioctl.h"
    #include "fcntl.h"    
    #include "time.h"    
    #include "asm/etraxgpio.h"
    
    #define LED_1  1<<25
    #define LED_2  1<<24
    #define LED_3  1<<0
    #define IO_SETGET_OUTPUT  0x13
    ..........
    che vuol dire #define MACRO x<<y??

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Sei sicuro che non fosse

    #define MACRO(x,y) (x<<y)

  3. #3
    Vuol dire che LED_1 nel codice verrà sostituito con 1<<25, LED_2 con 1<<24 e LED_3 con 1<<0. Probabilmente il programma in questione opera con porte hardware e l'attivazione del led 1 corrisponde all'impostazione del 25° bit di una qualche porta a 1 (e lo stesso varrà anche per gli altri led). In ogni caso quel codice non è scritto molto bene: per evitare problemi di precedenza di operatori sarebbe dovuto essere:
    codice:
    #define LED_1  (1<<25)
    #define LED_2  (1<<24)
    #define LED_3  (1<<0)
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ah ... scusa ... non ho compreso che ti riferissi alle righe sui LED ...

    In questo caso sì ... mi associo a quanto ha scritto MItaly ...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    110
    Grazie per le risposte....si come hai detto tu il codice corrisponde a un programmino che gestisce dei led in una scheda fox:
    http://www.areasx.com/index.php?D=1&id=8124

    codice:
    #include "stdio.h"     
    #include "unistd.h"    
    #include "sys/ioctl.h"
    #include "fcntl.h"     
    #include "time.h"     
    #include "asm/etraxgpio.h"
    
    #define LED_1  1<<25
    #define LED_2  1<<24
    #define LED_3  1<<0
    #define IO_SETGET_OUTPUT  0x13
    
    int main(void) {
      int fda;
      int fdg;
      int iomask_a;
      int iomask_b;
      int iomask_g;
      int i;
    
      if ((fda = open("/dev/gpioa", O_RDWR))<0) {
        printf("ERRORE nell'apertura di /dev/gpioa\n");
        return 1;
      }
      if ((fdg = open("/dev/gpiog", O_RDWR))<0) {
        printf("ERRORE nell'apertura di /dev/gpiog\n");
        return 1;
      }
      iomask_a = LED_3;
      ioctl(fda, _IO(ETRAXGPIO_IOCTYPE, IO_SETGET_OUTPUT),&iomask_a);
      iomask_g = LED_1 | LED_2;
      ioctl(fdg, _IO(ETRAXGPIO_IOCTYPE, IO_SETGET_OUTPUT),&iomask_g);
      
    while (1) {
        printf("Test LED\n");
        ioctl(fdg, _IO(ETRAXGPIO_IOCTYPE, IO_SETBITS),LED_1);  //LED 1 ON
        sleep(1);
        ioctl(fdg, _IO(ETRAXGPIO_IOCTYPE, IO_CLRBITS),LED_1);  //LED 1 OFF
        sleep(1);
        ioctl(fdg, _IO(ETRAXGPIO_IOCTYPE, IO_SETBITS),LED_2);
        sleep(1);
        ioctl(fdg, _IO(ETRAXGPIO_IOCTYPE, IO_CLRBITS),LED_2);
        sleep(1);
        ioctl(fda, _IO(ETRAXGPIO_IOCTYPE, IO_SETBITS),LED_3);
        sleep(1);
        ioctl(fda, _IO(ETRAXGPIO_IOCTYPE, IO_CLRBITS),LED_3);
        sleep(1);
      }  
      close(fda);
      close(fdg);
      return 0;
    }
    quindi se ho capito bene nel mio caso dopo iomask_a=LED_3 avrò in iomask_a una seguenza di 0 tranne il primo bit a 1....e dopo iomask_g = LED_1 | LED_2; in iomask_g avrò il risultato dell'or tra una seguenza di bit a 0 tranne il 25° bit che è posto a 1(macro LED_1) e un'altra seguenza di bit posti a 0 tranne il 24° bit che è posto a 1 (macro LED_2).....giusto?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Scrivere

    1<<25

    significa scrivere il valore esadecimale

    0x2000000

    mentre

    1<<24 e' uguale a 0x1000000

    1<<0 e' uguale a 0x1

    Se scrivi

    iomask_g = LED_1 | LED_2

    avrai

    iomask_g = 0x2000000 | 0x1000000

    ovvero

    iomask_g = 0x3000000

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.