Compiler error: Pointer to a __far location

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

Compiler error: Pointer to a __far location

Jump to solution
1,309 Views
sep2kor
Contributor III

Hi,

 

I have written a small piece of code to copy the contents of paged flash memory into Ram.

 

const __far MemSegTable BL_AddressTable =
{
     { 0x00005000uL, 0x00006BFFuL },
     { 0x0000C000uL, 0x0000CFFFuL },
     { 0x00E08000uL, 0x00E0BFFFuL },
     { 0x00E18000uL, 0x00E1BFFFuL },
     { 0x00E28000uL, 0x00E2BFFFuL },
     { 0x00E38000uL, 0x00E3BFFFuL }
};

const __far uint32 BL_PtrToArray[6] =
{
    0xD18000,   /* Address of BL_Array_D1 */
    0xD28000,   /* Address of BL_Array_D2 */
    0xD38000,   /* Address of BL_Array_D3 */
    0xD48000,   /* Address of BL_Array_D4 */
    0xD58000,   /* Address of BL_Array_D5 */
    0xD68000    /* Address of BL_Array_D6 */
};

 

function( )

{

             flashAddress_t                 StartAddress;
             flashMemoryLength_t     PageLength;
             uint32                                 count;
             uint8 const __far *           pBootloaderArray;
             uint8 *                                 pRAMBuffer;

                         StartAddress          =  BL_AddressTable[NumOfBlks][0];
                         PageLength           =  ( BL_AddressTable[NumOfBlks][1] - BL_AddressTable[NumOfBlks][0] + 1 );
                         pBootloaderArray  =  ( uint8 const __far * )((const __far uint32)BL_PtrToArray[NumOfBlks]);
                         pRAMBuffer            =  RAMBuffer;
                         count                       =  0x100;
                         

                         while (count)
                         {
                                         (  * ( ( uint8 * ) pRAMBuffer ) )  =  (  * (  ( uint8 const __far *  ) ( pBootloaderArray ) ) );
                                         ( ( uint8 const __far *) ( pBootloaderArray ) )++;
                                         ( ( uint8 * ) pRAMBuffer )++;
                                         count--;
                         }

 

return();

}


I am getting the following error:

 C1069: Wrong use of far/near/rom/uni/paged in local scope

 

Can anybody help me?

Labels (1)
Tags (1)
0 Kudos
1 Solution
643 Views
CrasyCat
Specialist III

Hello

 

I would not recommend using far qualifier for anything else than a function or a pointer.

If you want to tell the compiler an object is allocated in paged memory you need to define it as follows:

 

#pragma CONST_SEG __GPAGE_SEG myPAGED_CONST
const __far uint32 BL_PtrToArray[6] =
{
    0xD18000,   /* Address of BL_Array_D1 */
    0xD28000,   /* Address of BL_Array_D2 */
    0xD38000,   /* Address of BL_Array_D3 */
    0xD48000,   /* Address of BL_Array_D4 */
    0xD58000,   /* Address of BL_Array_D5 */
    0xD68000    /* Address of BL_Array_D6 */
};

#pragma CONST_SEG DEFAULT

Also I would modify the initialization of pBootloadArray as follows:

pBootloaderArray = ( uint8 const __far * )(BL_PtrToArray[NumOfBlks]);

 

Please refer to TN238.pdf in {Install}\Help\PDF for more information on how to define variable, constants in paged memory.

 

CrasyCat

View solution in original post

0 Kudos
3 Replies
643 Views
sep2kor
Contributor III

Sorry, the code is as written below.

 

uint8 RAMBuffer[0x100];

 

const __far uint32 BL_PtrToArray[6] =
{
    0xD18000,   /* Address of BL_Array_D1 */
    0xD28000,   /* Address of BL_Array_D2 */
    0xD38000,   /* Address of BL_Array_D3 */
    0xD48000,   /* Address of BL_Array_D4 */
    0xD58000,   /* Address of BL_Array_D5 */
    0xD68000    /* Address of BL_Array_D6 */
};

 

function( )

{

             uint32                                 count;
             uint8 const __far *           pBootloaderArray;
             uint8 *                                 pRAMBuffer;

                         pBootloaderArray  =  ( uint8 const __far * )((const __far uint32)BL_PtrToArray[NumOfBlks]);
                         pRAMBuffer            =  RAMBuffer;
                         count                       =  0x100;
                         

                         while (count)
                         {
                                         (  * ( ( uint8 * ) pRAMBuffer ) )  =  (  * (  ( uint8 const __far *  ) ( pBootloaderArray ) ) );
                                         ( ( uint8 const __far *) ( pBootloaderArray ) )++;
                                         ( ( uint8 * ) pRAMBuffer )++;
                                         count--;
                         }

 

return();

}

The error is on lines -

"uint8 const __far *           pBootloaderArray;"

"pBootloaderArray  =  ( uint8 const __far * )((const __far uint32)BL_PtrToArray[NumOfBlks]);"

" (  * ( ( uint8 * ) pRAMBuffer ) )  =  (  * (  ( uint8 const __far *  ) ( pBootloaderArray ) ) ); "

Note: The aarray BL_PtrToArray[ ] is located in paged memory. The array RAMBuffer[ ] is in unpaged memeory.

Can anybody help me?

0 Kudos
644 Views
CrasyCat
Specialist III

Hello

 

I would not recommend using far qualifier for anything else than a function or a pointer.

If you want to tell the compiler an object is allocated in paged memory you need to define it as follows:

 

#pragma CONST_SEG __GPAGE_SEG myPAGED_CONST
const __far uint32 BL_PtrToArray[6] =
{
    0xD18000,   /* Address of BL_Array_D1 */
    0xD28000,   /* Address of BL_Array_D2 */
    0xD38000,   /* Address of BL_Array_D3 */
    0xD48000,   /* Address of BL_Array_D4 */
    0xD58000,   /* Address of BL_Array_D5 */
    0xD68000    /* Address of BL_Array_D6 */
};

#pragma CONST_SEG DEFAULT

Also I would modify the initialization of pBootloadArray as follows:

pBootloaderArray = ( uint8 const __far * )(BL_PtrToArray[NumOfBlks]);

 

Please refer to TN238.pdf in {Install}\Help\PDF for more information on how to define variable, constants in paged memory.

 

CrasyCat

0 Kudos
643 Views
sep2kor
Contributor III

Thanks CrasyCat

0 Kudos