logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Keil C: Różnice w kompilacji z włączonymi opcjami assemblera w kodzie wynikowym

krzysiek40 08 Lip 2004 09:49 3213 16
REKLAMA
  • #1 731980
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    Ostatnio otrzymalem taka wskazowkę:

    Najedź w lewym okienku na nazwę Twojego pliku źródłowego. Prawym przyciskiem myszy i wybierz "Options for ...".
    Tam, w zakładce Properties wyłącz "Assemble SRC files" oraz "Generate assembler SRC file".
    Jak to jest włączone to program się kompiluje inaczej. W pamięci umieszczane jest wszystko kolejno. Wówczas robisz tak, jak TDV zasugerował. Niestety, żeby robić wstawki asemblerowe musisz mieć te opcje włączone.
    Jeżeli te opcje są wyłączone, funkcje umieszczane są w pamięci zgodnie ze zdrowym rozsądkiem.

    Marmur99

    tymczasem gdy tak robie to w kodzie wynikowym *.hex nic sie nie zmienia:

    prosze by mi ktos skompilowal cos takiego tymi dwoma sposobami i pokazal roznice

    #include <reg51.h>

    void main(void) {
    EX0=1;
    EA=1;
    IT0=1;

    while(1);
    }

    void add(void) interrupt 0 {
    P1++;
    }
  • REKLAMA
  • #2 733679
    marmur99
    Poziom 17  
    Posty: 285
    Pomógł: 5
    Ocena: 4
    Ale słuchaj, czy ten program działa tak, jak sobie tego życzysz?
    Przy takim programie nie zobaczysz różnicy przy kompilowaniu z "Assemble ..." a bez tego. Pisałem Ci w poprzednim poście jaka jest różnica. Żeby sprawdzić czy program działa prawidłowo (i jak został poskładany) uruchom sobie debuggera. Tam najlepiej wychwycisz różnicę pomiędzy kompilacjami.

    Marmur99
  • #3 738626
    Vassili Zaicev
    Poziom 12  
    Posty: 27
    A co to w ogole jest P1?
    A INT0 to przerwanie zewnetrzne ?
  • REKLAMA
  • #4 739443
    Vassili Zaicev
    Poziom 12  
    Posty: 27
    Nie wiem co to za przerwanie int0, P1 to prawdopodobnie 8-bit port nr 1 , ale lepiej sprawdz definicje bo to moze byc tez "ala ma kota".

    Jesli podejmujesz obsluge przerwania to powinienes dmuchac na zime i dbac o te znaczniki.
    Jak na moj gust Powinienes na koncu obslugi przerwania wyzerowac flage jego zgloszenia.
  • #5 752362
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    w debuggerze nie wideze zadnej roznicy chyba ze nie wiem na co patrzec.
    a czy moglby mi ktos skompilowac ten program i przeslac hex-a alb bin-a tak bym mogl go wgrac w proca i wtedy zobaczyc?
  • REKLAMA
  • #6 758011
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    wreszcie po pol roku zmagan przerwania mi dzialaja ale pod reisonance a z keil chyba sie pozegnam :)
  • #7 758052
    SACZI
    Poziom 16  
    Posty: 302
    Pomógł: 6
    Ocena: 14
    krzysiek40, ja tez walczyłem z przerwaniami i udało mi się to przebrnąć. Problem okazał sie prosty; chodzi oczywiście o napisanie funkcji obsługi przerwania.
    Polecam Ci jednak Keila z tego względu, że używaja go profesjonaliści. Nie znam żadnego elektronika, który pisałby w innym niz Keil kompilatorze na '51. Sam równiez uczyłem sie na Keilu i jeżeli przyjdzie mi pracowac, również będe chciał uzywac Keila.
    Nie mam nic przeciwko innym kompilatorom (a mam chyba większość: Reisonance, Tasking, Ashlilng, IAR), ale Keil wydaje mi sie najlepszy.
  • #8 758346
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    to moze w keilu trzeba ustawic jakies opcje o kturych nie wiem coz jeszcze z nim powalcze

    a mozesz mi napisac funkcje przerwania ktora obsluguje np to co w pierwszym poscie napisalem bo w reisonance to dziala bez zadnych zmian ?
  • #9 758456
    Vassili Zaicev
    Poziom 12  
    Posty: 27
    Znam dobrze jezyk C ale mikrokontrolery poznaje od niedawna.
    W 51-kach zewnetrzne przerwania jednak czyszcza swoje flagi sprzetowo (wlasnie doczytalem..)
    Wiec blad masz na pewno w konfigu a nie w ISR-routine.
  • #10 758587
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    w takim razie jak to skonfigurowac ???
  • #11 758595
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    Zapodaj tu pliki .hex uzyskane z keila i reisonace.
    Jaki masz programator?
  • #12 758654
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    tak wyklada reisinance

    :03000000020006F5
    :0300030002001DDB
    :0F000600758110E4787FF6D8FD75A0FF02001514
    :08001500D2AFD288D2A880FE10
    :0E001D00C0E0C0D075D0080590D0D0D0E03241
    :00000001FF

    a tak keil

    :08080C00D2AFD288D2A880FE11
    :03000300020814DC
    :030814000590321A
    :03000000020800F3
    :0C080000787FE4F6D8FD75810702080C33
    :00000001FF
    Załączniki:
    • reisonance.txt (164 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
    • keil.txt (136 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #13 758702
    Tdv
    Poziom 34  
    Posty: 2237
    Pomógł: 150
    Ocena: 53
    A używasz pewnie programatora PROGAT czy jakoś tak się to nazywało??
    To wina leży po stronie programatora, a nie kompilatora. Zawartość hex'a ma postac:
    :iiaaaattddddddddddddcc gdzie:
    ii - ilosc danych w rekordzie,
    aaaa adres od którego należy zacząć upychać w pamięci dany rekord,
    tt - typ rekordu,
    dddd - dane (jest ich tyle ile wskazuje ii),
    cc - suma kontrolna rekordu.

    Jak widać hex wynikowy z Keila ma rekordy poukładane nie po kolei według adresów (reisonance ma po kolei z adresami).

    Oryginalny hex keila (dodaje numerki linii:

    1 :08080C00D2AFD288D2A880FE11
    2 :03000300020814DC
    3 :030814000590321A
    4 :03000000020800F3
    5 :0C080000787FE4F6D8FD75810702080C33
    6 :00000001FF

    Poukładaj je w kolejności 4,2,5,1,3,6 , czyli:
    :03000000020800F3
    :03000300020814DC
    :0C080000787FE4F6D8FD75810702080C33
    :08080C00D2AFD288D2A880FE11
    :030814000590321A
    :00000001FF

    I powinno zadziałać:D.

    BTW to ten temat wałkowałem na elektrodzi już kilkanaście razy, ostatnio nawet kolega po objaśnieniach zorganizował w C program na PC, który segreguje plik hex według rosnących adresów.
    Zapodał mi linka ze źródłem do niego ale napisał, że do własnego użytku, więc nie będę go tu umieszczał.
    Postarm się zaraz ustalić kto to jest i podać jakieś namiary.

    Obiecane namiary:
    użytkownik arcu https://www.elektroda.pl/rtvforum/uzytkownik24298.html
  • REKLAMA
  • #14 759005
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    rzeczywiscie uzywam progata (zapomnialem dopisac). naprawde wielkie dzieki przerwania spedzaly mi sen z powiek a teraz wszystko sie wyjasnilo. bede sie z tym bawil. pozdrawiam :)
  • #15 759055
    SACZI
    Poziom 16  
    Posty: 302
    Pomógł: 6
    Ocena: 14
    krzysiek40, ja Twój programik zapisałem tak:
    
    #include <reg51.h>
    
    void add(void) interrupt 0 
    {
    	IT0 = 0;
    	P1++;
    }
    
    void main(void)
    {
    	EA=1;
    	EX0=1;
    	IT0=1;
    
    	while(1)
    		{
    			;
    		}
    }
    

    różnica polega na zerowaniu znacznika przerwania (mimo, że jest zerowany sprzętowo) po przyjęciu jego zgłoszenia.

    Po kompilacji plik HEX wyglada tak:
    
    :03000300020814DC
    :05081400C288059032CE
    :08080C00D2AFD2A8D28880FE11
    :03000000020800F3
    :0C080000787FE4F6D8FD75810702080C33
    :00000001FF
    

    czyli znowu jest jakies inne ułożenie adresów.


    PS Tdv, podaj z łaski swojej linki do dyskusji na ten temat. Zaciekawiło mnie to zagadnienie.
  • #16 759087
    Vassili Zaicev
    Poziom 12  
    Posty: 27
    To bardzo ciekawe co pisze TDV, najprawdopodobniej to jest wlasnie przyczyna , w pracy uzywam Keila bardzo czesto i nie mialem wiekszych problemow z przerwaniami.
    W domu programuje na razie tylko AT89S52, i np timer dziala bez problemu.
    Uzywam programatora AEC_ISP, dosowski.

    Jesli IT0 jest flaga tego przerwania to na pewno zapis :
    EA=1;
    IT0=1;
    jest pozbawiony sensu
    sensowniej byloby:
    IT0 = 0;
    EA = 1;
  • #17 759126
    krzysiek40
    Poziom 22  
    Posty: 629
    Pomógł: 9
    Ocena: 11
    a czy moglby ktos zamiescic lub wyslac mi krzysiek400(_at_)op.pl taki program do sortowania. na stronie praktycznego elektronika jest ale z tego co widze to w wersji niskompilowanej a ja nie mam kompilatora pascala

Podsumowanie tematu

✨ Dyskusja dotyczy różnic w kompilacji programów w Keil C dla mikrokontrolerów 8051 przy włączonych i wyłączonych opcjach generowania plików assemblera ("Assemble SRC files" i "Generate assembler SRC file"). Wskazano, że włączenie tych opcji zmienia sposób rozmieszczenia funkcji w pamięci, jednak w prostym przykładzie przerwania różnice w pliku wynikowym *.hex mogą być niewidoczne. Zalecane jest użycie debuggera do analizy różnic w kodzie wynikowym. Poruszono problem obsługi przerwań zewnętrznych INT0 i konieczności zerowania flagi przerwania, mimo że w 8051 jest to realizowane sprzętowo. Użytkownicy podkreślili, że konfiguracja przerwań i programator (np. PROGAT) mają wpływ na działanie programu i poprawność wgrywania kodu. Przykładowo, pliki hex generowane przez Keil mogą mieć rekordy ułożone niezgodnie z kolejnością adresów, co może powodować problemy z programatorem. Zaproponowano ręczne uporządkowanie rekordów hex lub zmianę konfiguracji programatora. W dyskusji pojawiły się także porównania Keil z innymi kompilatorami (Reisonance, Tasking, IAR), gdzie Keil jest rekomendowany jako profesjonalne narzędzie. Podsumowując, różnice w kompilacji z włączonymi opcjami assemblera wpływają na układ kodu w pamięci, ale prawidłowa konfiguracja przerwań i programatora jest kluczowa dla poprawnego działania programu.
Wygenerowane przez model językowy.
REKLAMA