Массив EDIC PIC24F, вызывающий перехват адреса
Привет, я использую 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;
}
Но даже до того, как программа достигнет основного (я установил точку останова сразу после основного, она никогда не попадет туда), я получаю адресную ловушку. я использую 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
Почему использование EDS вызывает ошибку адреса в моем SFR?
Вот моя карта:
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)
Вот адрес массива в пространстве ЭЦП
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, и это происходит до того, как основной вход
Я совсем растерялся, может кто-нибудь уточнить это для меня? в соответствии с таблицей устройств, которую я использую, http://ww1.microchip.com/downloads/en/DeviceDoc/30009312b.pdf, мой чип имеет оперативную память 8k, но на странице 47 оперативная память 8k идет с 0800h до 27FEh. Согласно этой странице, у меня все еще есть память EDS от 8000h до FFFFh, которую я могу использовать для буферов, верно? Так что я запутался, я ограничен до 8 КБ оперативной памяти? или я могу использовать баран из 8000-FFFFh (EDS)?
если я не установлю адрес для eds и просто позволю компилятору решать за меня,
атрибут eds int array [2000] ((пробел (eds)));
это помещает это в
0x1860 _array
это даже не в пространстве eds, которое составляет от 8000h до FFFFh, я получаю серьезное недоразумение здесь?