AVR-GCC

Collapse
X
 
  • Kellaaeg
  • Show
Clear All
new posts
  • feelgood
    Liige
    • 01/2002
    • 143

    #1

    AVR-GCC

    Oskab keegi öelda mis on allolevas koodis valesti, et "while" tsükkel ei katke? Katkestus juhtub kindlalt ning ka kood käivitatakse kenasti. Kas võib olla, AVR GCC'l on mingi imelik muutuja skoobi teema?

    Kompiileriks on, nagu mainitud, AVR GCC mida olen kasutanud alles paar päeva ning pole veel päris põhjalikult süveneda jõudnud. CodeVision AVRiga sarnane kood nagu oleks toiminud.

    Tänud ette.

    --
    Kood:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    unsigned char lipp;
    
    SIGNAL (SIG_INTERRUPT0) { // Katkestus
     lipp = 1;
    }
    
    int main() {
     // Võtame arvesse katkestused INT0 ning INT1
     // Katkestused juhtuvad madala nivoo puhul.
    
     GIMSK = 0xC0;
     GIFR = 0xC0;
    
     while (!lipp) {
      // Teeme midagi ning ootame, et katkestus tuleks
     }
    
     // ... muud kood 
    
    }
  • doktorms
    Liige
    • 12/2001
    • 371

    #2
    Ehk nii?!
    Kood:
    include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    
    unsigned int lipp;
    
    SIGNAL (SIG_INTERRUPT0) { // Katkestus
     lipp = 1;
    }
    
    int main() {
     // Võtame arvesse katkestused INT0 ning INT1
     // Katkestused juhtuvad madala nivoo puhul.
    
     GIMSK = 0xC0;
     GIFR = 0xC0;
    
     while (!lipp=1) {
      // Teeme midagi ning ootame, et katkestus tuleks
     }
    
    
    
    
     // ... muud kood 
    
    }
    C kohta võid abi siit leida:

    http://computer.howstuffworks.com/c.htm[B]

    Comment

    • feelgood
      Liige
      • 01/2002
      • 143

      #3
      Originally posted by doktorms@Jun 7 2004, 21:11
      Ehk nii?!
      Ei. Selline konditsioon nagu "(!lipp = 1)" ei saa kohe mingil juhul töötada. Pigem siis "(lipp != 1)" aga hetkel teeb see sama välja mis "(!lipp)". Proovitud on mõlemaga.

      Samuti pole antud juhul vahet kas on kasutuses char (0-255) või int (0-65535). Kindluse mõttes sai jällegi proovitud muidugi mõlemaga. Ainult 0 ja 1 väärtuse jaoks on tegelikult mõlemad tüübid liialt suured. Praegu testimiseks sobivad küll, eks pärast optimeerib nii et mitu lippu asub ühes baidis koos.

      Ning C peaks nagu enamvähem käpas olema, vähemalt i386 platvormil. :/ Samuti toimis mäletamist mööda sarnane syntax CodeVision AVR C's kenasti. Mingi AVR GCC spetsiifiline asi?

      Comment

      • feelgood
        Liige
        • 01/2002
        • 143

        #4
        Ma olen pime. Ma ei saa aru kuidas mul AVR GCC FAQs just see (esimene) punkt kahe silma vahele jäi. Oligi skoobi ning optimeerimise küsimus. Õige kasutus oleks nii:
        Kood:
        volatile unsigned char lipp;

        Comment

        • TaaviJ
          Liige
          • 06/2004
          • 3

          #5
          Õige ta on kasutada volatile keywordi. See ei luba kompilaatoril optimiseerimist kasutada ja muutuja kirjutatakse peale omistamist kohe mällu.
          Kindlam oleks ka muutuja algväärtustamine kas definitsioonis või eraldi ennem kasutamist.

          #define TRUE 1
          #define FALSE 0

          volatile unsigned char cLipp = FALSE ;
          Taavi Jantson

          Comment

          Working...