ARM Technical Support Knowledge Articles

ACCESSING THE USER STACK VIA DPP2

Applies to: L166 Linker/Locator

Answer


Information in this article applies to:


SYMPTOMS

I have reassigned the DPP registers using the DPPUSE directive so that my memory is arranged as follows:

  DPP   VALUE   C166 GROUP
  ========================
   0    0000H   NCONST
   1    0001H   NDATA
   2    0002H   NDATA
   3    0003H   NDATA

  C166 GROUP   START     STOP
  ==============================
  NCONST       000000H   003FFFH
  NDATA        004000H   00FDFFH

When I examine the memory map of my module in the m66 file I see the following:

007D94H   007F93H   000200H   DATA  REL   WORD   ---    5  PUBL  NDATA ?C_USERSTACK

The User Stack is now accessed by DPP1 rather than DPP2. Why is this, how do I tell the compiler that DPP1 accesses the User Stack and how do I force the linker to use DPP2 for User Stack accesses?

CAUSE

The linker is free to place the User Stack anywhere in the NDATA area. Because you have changed the boundries of the NDATA area by reassigning the DPP registers, NDATA can now be accessed by DPP1, DPP2 and DPP3. Therefore, the User Stack can be located so it may be accessed via DPP1, DPP2 or DPP3.

RESOLUTION

When you use the DPPUSE linker directive to reassign the DPP registers, you must also use the NOFIXDPP compiler directive. This ensures that the compiler no longer assumes the User Stack is accessed via DPP2.

You may use the SECTIONS linker directive to force the linker to place the User Stack in a section of memory accessed by DPP2. For example:

SECTIONS(?C_USERSTACK%NDATA(0x8000))

MORE INFORMATION

Article last edited on: 2005-07-15 12:21:22

Rate this article

[Bad]
|
|
[Good]
Disagree? Move your mouse over the bar and click

Did you find this article helpful? Yes No

How can we improve this article?

Link to this article
Copyright © 2011 ARM Limited. All rights reserved. External (Open), Non-Confidential