[well done]Portierungsproblem: Was will der GCC da sehen?



  • Hallo Forumsbesucher,

    hab' das Limit für's Binary eines embedded- Compilers bei einem Projekt überschritten und dachte mir, es gibt ja auch eine GCC- Toolchain für lau. Der GCC mag mein Projekt aber gar nicht übersetzen (too many errors), besonders an harten Adresszuordnungen hapert es, dfamit ist schon mal Feierabend.

    #include "iodefine.h"
    
    void hw_initialise (void)
    {
    	p0 = 0;
    }
    

    führt zu

    hwinit.c(5) :  error: incompatible types when assigning to type 'volatile union byte_def' from type 'int'
    

    Die betreffenden Zeilen der iodefine.h sehen so aus:

    union byte_def{
    	struct bit_def bit;
    	char	byte;
    };
    #define		p0 	(*(volatile union byte_def *) (0x03e0))			/* Port P0 register */
    

    Meine Versuche aufzulisten, da was zu casten, erspare ich uns mal, ergab mehr oder minder sinnvolle Fehlermeldungen.

    Vermutlich sehe ich grade den Wald vor lauter Bäumen nicht mehr, also könnte vielleicht mal jemand die Kettensäge nehmen und Licht ins Dickicht schaffen?

    Danke! 😃



  • Versuchs mal mit

    #define  p0  (((volatile union byte_def *)0x03e0)->byte)
    


  • Oder halt mit

    ...
    p0.byte = 0;
    ...
    

    Wenn man die iodefine nicht ändern will. Was man eigentlich in dem Fall nicht wirklich will, da sonst das define ja nichtmehr sinnvoll die union abbildet (da man ja hart nur noch auf das member byte zugreifen kann). Scheint eine Erweiterung des "Original"-Compilers zu sein dass man eine union so initialisieren kann. Und p0.byte sollte da auch funktionieren. Denke ich mal.



  • Tim schrieb:

    Wenn man die iodefine nicht ändern will. Was man eigentlich in dem Fall nicht wirklich will, da sonst das define ja nichtmehr sinnvoll die union abbildet (da man ja hart nur noch auf das member byte zugreifen kann). Scheint eine Erweiterung des "Original"-Compilers zu sein dass man eine union so initialisieren kann. Und p0.byte sollte da auch funktionieren. Denke ich mal.

    OK Tim, das haut hin. Hast Dir wenigstens 30 Postings Ruhe vor mir verdient 😉
    Danke!

    Unbefriedigend bleibt, daß ich meinen ganzen HW- Setup mit .byte versorgen müßte. Ist fast so unschön, wie an der iodefine zu pfuschen. Werd' mal morgen damit spielen ...



  • Hmmm, mal Marcus fragen ob ich hier 30 dummy-posts erstellen darf.



  • DerKuchen schrieb:

    Versuchs mal mit

    #define  p0  (((volatile union byte_def *)0x03e0)->byte)
    

    Fast, aber nicht ganz 😉

    error: invalid type argument of '->' (have 'int')
    

    So geht's:

    #define		p0 	(*(volatile union byte_def *) (0x03e0)).byte			/* Port P0 register */
    

    Im Original- Compiler- Template für die Register sah das übrigens so aus:

    #pragma ADDRESS	p0_addr		03e0H		/* Port P0 */
    union byte_def	p0_addr;
    #define	p0		p0_addr.byte
    

    #pragma ADRESS kann der GCC ja nicht und weil p0 schon so schön angelegt war, hab' ich andauernd übersehen, daß im Original das Macro für p0 bereits den byte-Teil der union anspricht. Da war ich wohl schon panikblind 😮 , weil ich gerade ordentlich löhnen durfte, den Debugger für größere Binaries freizuschalten; ein Compiler- Upgrade hätte das Projekt nicht getragen.
    Fragt sich nur noch, warum das beim iodefine vom GCC anders angelegt wurde, aber das ist ein Rätsel, dessen Beantwortung ich nicht ernsthaft erwarte.

    Tim schrieb:

    Hmmm, mal Marcus fragen ob ich hier 30 dummy-posts erstellen darf.

    Besser, Du hilfst 30 Dummies wie mir ...

    Tims Signatur schrieb:

    Vorsicht, dieser Benutzer ist manisch-depressiv und schizoid!

    ... und ich muß darauf bestehen, daß ich "manisch-depressiv oder schizoid" geschrieben hab'. 😉


Log in to reply