嗨,我正在使用 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 数据内存?或者我可以使用 8000-FFFFh (EDS) 的 Ram 吗?
如果我不设置 eds 的地址,只允许编译器为我决定,
eds int array[2000]属性((space(eds)));
它把它放在
0x1860 _array
这甚至不在从 8000h 到 FFFFh 的 eds 空间中,我在这里有什么严重的误解吗?