How to places a variable at a specific absolute address?

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How to places a variable at a specific absolute address?

2,281 Views
robertogiovinet
Contributor III

Hello everyone

I'm using CodeWarrior 10.5 from few days. I'm trying to get in touch with Kinetis MCU family, and I'd like to use same approach I always used in the past with S08 and S12 MCU's. I don't like Processor Experts, and I prefer to initialize MCU by particular sub part of a program called at the beginning of the same program, and for doing this operation I refer to registers using the approach used in older CW version, in which, for every derivative, we can find a definition of all the registers we use, and refer to them with acronym, for example to refer to a pin we can write in C "#define GREEN_LED     PTFD_PTFD0", where the bit PTFD0 of the register PTFD is directly accessible.

For doing this in olde CW versions, we find a definition like this:

 

/*** PTFD - Port F Data Register; 0x0000000A ***/

typedef union {

  byte Byte;

  struct {

    byte PTFD0       :1;                                       /* Port F Data Register Bit 0 */

    byte PTFD1       :1;                                       /* Port F Data Register Bit 1 */

    byte             :1;

    byte             :1;

    byte PTFD4       :1;                                       /* Port F Data Register Bit 4 */

    byte PTFD5       :1;                                       /* Port F Data Register Bit 5 */

    byte PTFD6       :1;                                       /* Port F Data Register Bit 6 */

    byte             :1;

  } Bits;

  struct {

    byte grpPTFD :2;

    byte         :1;

    byte         :1;

    byte grpPTFD_4 :3;

    byte         :1;

  } MergedBits;

} PTFDSTR;

 

extern volatile PTFDSTR _PTFD @0x0000000A;

#define PTFD                                 _PTFD.Byte

#define PTFD_PTFD0                     _PTFD.Bits.PTFD0

#define PTFD_PTFD1                     _PTFD.Bits.PTFD1

#define PTFD_PTFD4                     _PTFD.Bits.PTFD4

#define PTFD_PTFD5                     _PTFD.Bits.PTFD5

#define PTFD_PTFD6                     _PTFD.Bits.PTFD6

#define PTFD_PTFD                       _PTFD.MergedBits.grpPTFD

#define PTFD_PTFD_4                    _PTFD.MergedBits.grpPTFD_4

 

 

I've tried to do a similar thing with GCC but I can't find how. First compiler don't let me use @0x000000 method, for forcing a variable a specific asbsolute address. I've found I can use another method

 

/* General Purpose Input/Output (GPIO) */

#define IOPIN0 (*((volatile unsigned long *) 0xE0028000))

.

.

.

IOPIN0 = 0x4;

 

 

But if I try to redefine for example GPIOA register I cannot find how to work with single bit. I like to understand what I'm doing, and really I don't understand why I can't tell the linker that a variable has to have a specific address just like in the older CW versions.

I hope somwbody can help me.

 

For example if I define a type like below:

 

typedef union {

  uint32_t REG32BIT;

  struct {

  uint32_t BIT0        :1;

  uint32_t BIT1        :1;

  uint32_t BIT2        :1;

  uint32_t BIT3        :1;

  uint32_t BIT4        :1;

  uint32_t BIT5        :1;

  uint32_t BIT6        :1;

  uint32_t BIT7        :1;

  uint32_t BIT8        :1;

  uint32_t BIT9        :1;

  uint32_t BIT10       :1;

  uint32_t BIT11       :1;

  uint32_t BIT12       :1;

  uint32_t BIT13       :1;

  uint32_t BIT14       :1;

  uint32_t BIT15       :1;

  uint32_t BIT16       :1;

  uint32_t BIT17       :1;

  uint32_t BIT18       :1;

  uint32_t BIT19       :1;

  uint32_t BIT20       :1;

  uint32_t BIT21       :1;

  uint32_t BIT22       :1;

  uint32_t BIT23       :1;

  uint32_t BIT24       :1;

  uint32_t BIT25       :1;

  uint32_t BIT26       :1;

  uint32_t BIT27       :1;

  uint32_t BIT28       :1;

  uint32_t BIT29       :1;

  uint32_t BIT30       :1;

  uint32_t BIT31       :1;

} Bits;

}REG_MemMap;

 

I would like to define a variable for example

 

REGMemMap REGISTER_GPIOA @0x00000000 at a specific address

 

and the define

 

#define REGISTER_GPIOA_BIT0     REGISTER_GPIOA.Bits.BIT0

 

Something like that.

 

I hope tha someone can help me and give me information about this two (I think for most of you) simple topics.

Thank you very much and exscuse my poor English.

Roberto

Labels (1)
0 Kudos
1 Reply

842 Views
Jorge_Gonzalez
NXP Employee
NXP Employee

Hello Roberto:

I am sorry for your unattended question.

What you mention about the bit declaration is correct, that was possible with Classic CodeWarrior using S08, S12 and I think ColdFire V1 devices, but this is not possible with Kinetis compilers.

The approach to use bit-by-bit the registers should be done via the "Bit Manipulation Engine (BME)". I have not used it widely but the next threads should give you an idea:

Declaration of bit using codeWarrior

Re: Re: bit manipulation engine in KL

Re: Is bit-banding possible on the Kinetis? Any examples?

About how to place variables in a specific memory region, this is not as straightforward as with the @ symbol. You have to define a space in your linker file and locate your variables accordingly. Check the next tutorial by Erich Styger:

Defining Variables at Absolute Addresses with gcc | MCU on Eclipse

Hope this helps, sorry if my reply is not very specific. When I find time I will work on an example about your doubt.


Regards,
Jorge Gonzalez

-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos