Warning: Illegal string offset 'name' in [path]/includes/functions.php on line 6439
pa Ride7 stm32 softa compileri
1 2

thread: pa Ride7 stm32 softa compileri

  1. #1
    Senior Member
    Sep 2006
    2,537

    pa Ride7 stm32 softa compileri

    Ir tāda lieta ka rakstu vienu kodu kas ir uz 2 failiem viens ir fails kurā ir Main() proga un otrā failā ir Interput Service Routines kodi un rodās stūlba situācija ka tas compileris compilējot kodu uzražo reālu brāķi, proti izlaiž kodu rindas tur kur C failā nav redzams mainīgā pielietojums, vai tālākas darbības, kā lai šito noņem, šeit piemērs kur var redzēt ka C kodā kreisā compileris neuzģenerē kodu parastiem mainīgiem:
    int a=6;
    int b= 7;

    int* OnOff = &VOnOff;

    un tālāk if loopu arī neņem un tai vietā ieliek pirmo izvēli, problēma ir tur ka otrs C koda gabals uzliek tā VOnOff mainīgā vērtību uz 1, un pēc katra izsukuma viņu nomaina līdz ar to vaidzētu If loopam strādāt un mainīt GPIO_Pin_8;9 pinus bet tagat debaggojot uz sava Stm32 circle kita nekas nemainās un disasamblerā debagojot pa Asm kodu arī nekas nenotiek, piebildīšu ka Interput Service Routines failā pareizi nocompilējās kods un VOnOff tiek nomainīts un strādā, un neiet, sūdīgi compilējās tieši galveinais Main() fails.
    [attachment=0:36gc8mi9]Stm32compilerFinish.JPG[/attachment:36gc8mi9]

    Ko darīt ??
    vēl piebilde ka tas VOnOff main.h failā ir definēts kā EXTERN u32 VOnOff; es lasīju ka šitā definējot no citiem failiem var tikt klāt pie tā mainīgā, vispār kā pareizāk definēt RAm atmiņā mainīgo un tikt pie tā klāt no dažādiem C failiem ?
     

  2. #2
    Senior Member
    Jan 2007
    1,143

    Re: pa Ride7 stm32 softa compileri

    Pareizak ir padot funckijam ta mainiga pointeri vai ari likt mainigo pie globalajiem.
    Apskaties, ka tavs kods ir nokompilejies. Ka izskatas assamblera tas if.
    Beefs

  3. #3
    Senior Member
    Sep 2006
    2,537

    Re: pa Ride7 stm32 softa compileri

    uztaisīju vēlvienu atsevišķu failu Mainigie.c un h
    :
    #include "stm32f10x_lib.h"
    #include "Mainigie.h"
    
    u32 VOnOff = 0x00;
    
    void LED_blink()
    {
    int* OnOff = &VOnOff;
    
    loop:
      if(*OnOff == 0x00)
          {
           GPIOB->BSRR = GPIO_Pin_8; //Yello Led ON
           GPIOB->BRR = GPIO_Pin_9; //Red LED off
          }
      else
          {
           GPIOB->BRR = GPIO_Pin_8; //Yello Led off
           GPIOB->BSRR = GPIO_Pin_9; //Red LED  ON    
          }
    }
    un tad tagat no Main() izsaucu LED_blink(); funkciju un itkā tagat compileris strādā un compilē kodu pareizi
    bet vispār kautkā baigi Tupi sanāk.
    Pareizak ir padot funckijam ta mainiga pointeri vai ari likt mainigo pie globalajiem.
    kā tu to domā, un ko domā ar globālajiem (#define VOnOff ) vai?
    a kādēļ vispār tādi compilera gļuki, vai ta viņš tik tups, ka neko nesaprot vai ?

  4. #4
    Senior Member
    Sep 2006
    2,537

    Re: pa Ride7 stm32 softa compileri

    pamēģināju tagat uztaisīt pēc jaunā varianta ar jaunu Mainigais.c un H vailu bet bez nekādiem Pointeriem, proti, pa taisno rakstīt un lasīt no Extern VOnOff mainīgā un strādā visar šito Extern mainīgā piemēru es ņēmu no USB paraug koda un cik lasīju kautkādos tutoriālos tad tas Extern definējums itkā ir Globāls visiem failiem, bet tad kad nekas nestrādāja un nekompilējās tad protams ka radās šaubas, un finālā sanāk tā ka tai Failā kurā ir MAIN() funkcija Extern mainīgais Nestrādā, bet citur gan iet.
    rekā tagat izskatās:
    :
    #include "stm32f10x_lib.h"
    #include "Mainigie.h"
    
    u32 VOnOff = 0x00;
    
    void LED_blink()
    {
      if(VOnOff == 0x00) //*OnOff == 0x00)
          {
           GPIOB->BSRR = GPIO_Pin_8; //Yello Led ON
           GPIOB->BRR = GPIO_Pin_9; //Red LED off
          }
      else
          {
           GPIOB->BRR = GPIO_Pin_8; //Yello Led off
           GPIOB->BSRR = GPIO_Pin_9; //Red LED  ON    
          }
    }
    un Interupt.C failā :
    :
    void TIM2_IRQHandler(void)
    {
      TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
    if(VOnOff == 0x00)
            {
        VOnOff = 0x01;        
            }
        else{ VOnOff =0x00;}
    }
    un šādi ziskatās mainīgā.h fails:
    :
    #ifndef __MAINIGIE_H
    #define __MAINIGIE_H
    
    extern u32 VOnOff;
    #endif
    nu sūdīgi ka tas extern u32 VOnOff; nestrādā Main() funkcijas failā, ko tā a?

  5. #5
    Senior Member
    Jan 2007
    1,143

    Re: pa Ride7 stm32 softa compileri

    NEESMU droish, bet man skiet, ka extern pie mainiga definicijas nozime to, ka tas tiek definets citur. Bet visa visuma tai stelei ar manigajiem butu jabut gauzam vienkarsai un vienu mainiga nosaukumu vajadzetu varet tikai vienu reizi includot.
    Beefs

  6. #6
    Junior Member
    Sep 2006
    26

    Re: pa Ride7 stm32 softa compileri

    To mainīgo vajag definēt kā - volatile u32 VOnOff; Tas dos kompilātoram norādi, lai neoptimizē griešanos pie mainīgā. Citādi jau vīņš nekādi nevar zināt, ka kaut kāds tur interrupts paņem un izmaina mainīgo.

  7. #7
    Senior Member
    Sep 2006
    Riga
    3,053

    Re: pa Ride7 stm32 softa compileri


  8. #8
    Senior Member
    Jan 2007
    1,143

    Re: pa Ride7 stm32 softa compileri

    Es ari iedomajos par volatile, bet man liekas, ka sis keywords ir pavisam nesen pievienojies programesanas valodam un vairak ir aktuals .net vide. Bet iespejams, ka kludos.

  9. #9
    Senior Member
    Oct 2007
    629

    Re: pa Ride7 stm32 softa compileri

    Mainiigais VOnOff buutu shai gadiijumaa visur (vai attieciigi kautkur koplietoshanas .h failaa) jaadeklaree kaa "extern volatile u32" un attieciigi vienaa .c failaa kaa "volatile u32", jo simbolam kautkur ir jaarodas (bet tikai vienaa vietaa, preteejaa gadiijumaa linkeris izlamaasies par dublikaatu

    Extern lai pateiktu ka simbols buus jaamapo linkojot nevis kompileejot un volatile lai kompilators neveiktu optimizaacijas saistiibaa ar doto simbolu.
    Shai gadiijumaa kompilatora optimizaacija vareeja visu nochakareet (un visdriizaak arii nochakareeja) vismaz divos veidos:
    1) TIM2_IRQHandler() kodaa izoptimizeet nafig aaraa visu kas saistiits ar VOnOff jo pieshkjirtaa veertiiba dotajaa modulii nekur netiek izmantota;
    2) main() VOnOff veertiibu iekeshot regjistros jo veertiiba dotaa modulja ietvaros netiek mainiita, attieciigi kaut arii atminjaa vinju interrupta handleris nomaina, main() uz to ir pajaat jo vinsh lieto iekeshotu veertiibu un tik dragaa.

    Silti iesaku nafig vispaar atrubiit kompilatoram optimizaacijas visas kameer tu baksties un maacies C... Jo kompilatoram ne vienmeer izdodas pareizi uzmineet ko tad koderis ir iisti domaajis savaa galvaa sarakstot liiku kodu... taakaa shai gadiijumaa nevis "tupais C kompilators kas neko nejeedz" bet gan "tupais koderis kursh nejeedz kompilatoram pateikt ko tad vinsh iisti grib"

  10. #10
    Senior Member
    Sep 2006
    Ogre
    531

    Re: pa Ride7 stm32 softa compileri

    Es ari iedomajos par volatile, bet man liekas, ka sis keywords ir pavisam nesen pievienojies programesanas valodam un vairak ir aktuals .net vide. Bet iespejams, ka kludos.
    Grāmatā par C, kura sarakstīta 1989. gadā ir aprakstīts volatile keywords (tikko pārbaudīju). Nedomāju ka to var uzskatīt par "pavisam nesen". Tajā laikā par .NET neviens pat nefantazēja.

    Par kompilatoru: Nē jamais nav ne tups, ne gļukains. Tieši otrādi - pārāk gudrs - izoptimizē ārā kodu, no kura tāpat nav nekādas jēgas. Par globālajiem mainīgajiem, extern un volatile jeecha jau visu pateica.

    Un kas tas par loop:? C ciklus raksta izmantojot for, while vai do. Ja izmanto labeli, tad nepieciešams arī goto. Vispār jau gan neiesaku to darīt. Nopietni - ar labeļiem un goto var tiešām baigo putru kodā sataisīt (tas gan nenozīmē, ka bez tiem nevar ).
    Ir cilvēki, kam nesanāk. Un labi vien ir, ka nesanāk...

  1. : 72
    : 08-10-2008, 13:30