PIC24F EDS阵列导致地址陷阱

时间:2014-10-08 09:38:28

标签: c embedded microchip pic24

您好我正在使用PIC24fj128gc006。我的数据存储空间不足,所以我试图使用EDS空间分配一些缓冲区。这是我的声明:

#define BUF_BASE    0x010000L
__eds__ float envelopStaticBuff[envelop_size] __attribute__ ((address(BUF_BASE), space(eds))) ;

我将其传递给此方法作为参数“ eds float * staticBuffer”

bool ProcessDataToEnvelop_StaticMem(int16_t *data, int dataLength, __eds__ float *staticBuffer, int staticBufferLength, int *staticBufferCounter)
{
    uint16_t numShifts = (dataLength - _energyWindow) / _energyWindowShift;
    uint32_t newEnergySegment;

    //get first energy point
    newEnergySegment = calculate_energy_absolute(data, _energyWindowShift, _energyWindow - 1);
    staticBuffer[(*staticBufferCounter)++] = (float)(newEnergySegment + _prevEnergyShiftSegment) / (dataLength * 2);
    _prevEnergyShiftSegment = newEnergySegment;

    //return true if full
    if ((*staticBufferCounter) >= staticBufferLength) return true;

    //get energy points of remaining shifts
    for (int i=0; i<numShifts; i++) {
        newEnergySegment = calculate_energy_absolute(data,
                                               _energyWindow + i * _energyWindowShift,
                                               _energyWindow + (i + 1) * _energyWindowShift - 1);
        staticBuffer[(*staticBufferCounter)++] = (float)(_prevEnergyShiftSegment + newEnergySegment) / (dataLength * 2);
        _prevEnergyShiftSegment = newEnergySegment;

        //return true if full
        if ((*staticBufferCounter) >= staticBufferLength) return true;
    }

    //return false if not full yet
    return false;
}

但即使在程序到达main之前(我在main之后设置了一个断点,它永远不会到达那里),我得到一个地址陷阱。我在地址陷阱中断中使用getErrLoc()

void __attribute__((interrupt, no_auto_psv)) _AddressError(void)
{
        errLoc=getErrLoc();
        INTCON1bits.ADDRERR = 0; //Clear the trap flag
// while (1);
}

并且在调试模式下,返回的errLoc是0x0256,这甚至不是我的程序存储器的开始,我是否正确地说它是SFR?

在我的地图文件中:

0x0256 U3RXREG = 0x256
0x0256 _U3RXREG = 0x256

为什么在我的SFR中使用EDS导致地址错误?

这是我的地图:

Program Memory [Origin = 0x200, Length = 0x155f6]

section address length (PC units) length (bytes) (dec)
------- ------- ----------------- --------------------
.text 0x200 0x2696 0x39e1 (14817)
.const 0x2896 0x1f4 0x2ee (750)
.text 0x2a8a 0x42a4 0x63f6 (25590)
.dinit 0x6d2e 0x2ba 0x417 (1047)
.text 0x6fe8 0x19a 0x267 (615)
.init.delay32 0x7182 0x1c 0x2a (42)

                     Total program memory used (bytes): 0xa76d (42861) 32%


Data Memory [Origin = 0x800, Length = 0x2000]

section address alignment gaps total length (dec)
------- ------- -------------- -------------------
.nbss 0x800 0 0xcec (3308)
.nbss 0x14ec 0 0xac (172)
.ndata 0x1598 0 0x20 (32)
.nbss 0x15b8 0 0x22 (34)
.data._iob 0x15da 0 0x26 (38)
_0x19b0f185435011c 0x1600 0 0x30 (48)
.data._powers_ 0x1630 0 0x160 (352)
.data.dpowers 0x1790 0 0x140 (320)
.bss 0x18d0 0 0x8a (138)
.data 0x195a 0 0x54 (84)
.bss 0x19ae 0 0x16 (22)
.data.__C30_UART 0x19c4 0 0x2 (2)
.bss 0x19c6 0 0x2 (2)
.heap 0x19c8 0 0xa00 (2560)

                        Total data memory used (bytes): 0x1bc8 (7112) 86%


Dynamic Memory Usage

region address maximum length (dec)
------ ------- ---------------------
heap 0x19c8 0xa00 (2560)
stack 0x23c8 0x438 (1080)

                        Maximum dynamic memory (bytes): 0xe38 (3640)

这是EDS空间中数组的地址

0x8000 _PMCMD
0x8001 _PMALIGN
0x8002 _PMDATA
0x10000 _envelopStaticBuff <--this one

请解释为什么会这样。任何帮助,将不胜感激。谢谢!

我使用模拟器创建了一个新项目,以隔离问题

/******************************************************************************/
/* Global Variable Declaration                                                */
/******************************************************************************/
#define BUF_BASE    0x008000L   //PIC24F uses 24bit address
__eds__ float array[100] __attribute__((section("internal_array"), address(BUF_BASE), eds));

/******************************************************************************/
/* Main Program                                                               */
/******************************************************************************/

int16_t main(void)
{

    /* Configure the oscillator for the device */
    ConfigureOscillator();

    /* Initialize IO ports and peripherals */
    InitApp();

    /* TODO <INSERT USER APPLICATION CODE HERE> */
    int i;
    for(i=0;i<100;i++){
        array[i] = (float)i/100;
    }

    while(1)
    {

    }
}

同样的事情发生了,地址陷阱发生在errLoc = 0x0258,它发生在main进入之前

我很困惑有人可以为我澄清一下吗? 根据我正在使用的设备表http://ww1.microchip.com/downloads/en/DeviceDoc/30009312b.pdf,我的芯片有8k数据RAM,但在第47页,8k数据RAM从0800h到27FEh。根据该页面,我仍然有从8000h到FFFFh的EDS内存,我可以用于缓冲区吗?所以我很困惑,我上限到8k数据RAM吗?或者我可以使用8000-FFFFh(EDS)的Ram?

如果我没有设置编辑的地址,只允许编译器为我决定,

eds int array [2000] attribute ((space(eds)));

它把它放在

0x1860 _array

这甚至不是编辑空间,从8000h到FFFFh,我在这里遇到了一些严重的误解吗?

0 个答案:

没有答案