This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Use of "Off-chip XData Memory"?

Hi,

I'm running a small testapp to see if my 80c32 uP is running fine.
Therefore, I toggle P1_0 and next to this, I'm writing a value to a var defined in external RAM.

The RAM starts at address 0x0 and is 2kB long, so the end is at 0x7FF.
I define those ranges via 'Options - Options for Target 'Target 1' - Target' - Off-chip Xdata memory.

However, I see something very strange: when I declare my variable (for fun) at a fixed location outside the given range (e.g. unsigned char xdata testvar _at_ 0x850;), then I don't get a warning, even if I'm working outside the range.
Most strange of all, the variable is written and read correctly too (I'm toggling another pin if comparison is failing and I'm observing this pin with a scope, but I don't see any toggling => value exchange seems to be correct...)!

Can't understand this...

Anyone any idea?

--Geert

Parents
  • "I would be interested in seeing if there is a simple solution that could easily pick up on typo's where a pointer is defined pointing to an address outside the system's xram address and is automatically picked up by the compiler."

    First, you need to distinguish a pointer from a variable defined with Keil's _at_ keyword extension.

    A pointer is a standard 'C' mechanism for accessing memory addresses by indirection at run-time;
    The _at_ keyword extension is merely a way to "manually" fix the location of a variable at compile time.

    I think the assumption is that if you specify a variable's location using _at_, then you know what you're doing and take full responsibility for it.
    For other variables, you are letting the Linker/Locator do the placement in memory - therefore you want to be able to tell it how much RAM you have, and for it to be able to tell you if it can't fit everything into the space you've told it.

    You might well have some "special" memory addresses (eg, memory-mapped preipherals) that you'd want to access via _at_, but would not want to give the Linker/Locator the chance to go putting any old variables there!

Reply
  • "I would be interested in seeing if there is a simple solution that could easily pick up on typo's where a pointer is defined pointing to an address outside the system's xram address and is automatically picked up by the compiler."

    First, you need to distinguish a pointer from a variable defined with Keil's _at_ keyword extension.

    A pointer is a standard 'C' mechanism for accessing memory addresses by indirection at run-time;
    The _at_ keyword extension is merely a way to "manually" fix the location of a variable at compile time.

    I think the assumption is that if you specify a variable's location using _at_, then you know what you're doing and take full responsibility for it.
    For other variables, you are letting the Linker/Locator do the placement in memory - therefore you want to be able to tell it how much RAM you have, and for it to be able to tell you if it can't fit everything into the space you've told it.

    You might well have some "special" memory addresses (eg, memory-mapped preipherals) that you'd want to access via _at_, but would not want to give the Linker/Locator the chance to go putting any old variables there!

Children
No data