Hi All,
I have a curious corruption of a failry large ram buffer defined in my project running on a Teensy 4.1 with numerous libraries, high speed ISR driven by ADC interrupts etc.
This one has got me stumped as it is reliably corrupting it seems after a particular index, but not all of the data from that point onwards.
Data is defined in an array as such;
I have tried using volatile in the remote hope this may assist but to no avail.
Loop responsible for writing to the array:
This array is then passed to functions that either print to the serial port or write to file (essentially the same).
I also have a local function that I used to debug this further and this uses the array directly, where the error does not occur.
So it looks like the problem is something to do with the pointer or how I am passing the address of the array to these other functions.
function header for file writing;
Since writing from this buffer using the buffer directly does not have an issue, am I seeing a problem with the default pointer not being suitable to address the large array properly? ( it 204000 bytes in size)
Should I be using something like a far or huge pointer? (is this still required?)
I have a curious corruption of a failry large ram buffer defined in my project running on a Teensy 4.1 with numerous libraries, high speed ISR driven by ADC interrupts etc.
This one has got me stumped as it is reliably corrupting it seems after a particular index, but not all of the data from that point onwards.
Data is defined in an array as such;
C++:
DMAMEM volatile int16_t i2cAdcLogBuffer[LSADC_LOG_BUFFER_SIZE*17];
I have tried using volatile in the remote hope this may assist but to no avail.
Loop responsible for writing to the array:
Code:
//--------------------------------------------------
if ((millis() > pollingTimers.lsAdcPollingTimer)&&(i2cAdcBufferIndex < (long)(LSADC_LOG_BUFFER_SIZE*17))){
pollingTimers.lsAdcPollingTimer = millis() + loggerConfiguration.pollingPeriodLsAdc;
//loop through the 4 possible lsADC devices
i2cAdcLogBuffer[i2cAdcBufferIndex++] = (uint16_t)(millis() - loggerStatus.logStartTime)/10; // update time
for (j=0;j<2;j++){
if ((ads7828Devices[j].data.found==1)&&(ads7828Devices[j].data.use==1)&&(ads7828Devices[j].data.log==1)){
// take readings of i2c ADC devices installed
for(i=0;i<8;i++){
//while(!Wire2.availableForWrite()){}
//i2cAdcLogBuffer[i2cAdcBufferIndex++] = ads7828Devices[j].interface.read(i);
i2cAdcLogBuffer[i2cAdcBufferIndex++] = i2cAdcsamples + i;
}
}
}
i2cAdcsamples++;
}
This array is then passed to functions that either print to the serial port or write to file (essentially the same).
I also have a local function that I used to debug this further and this uses the array directly, where the error does not occur.
So it looks like the problem is something to do with the pointer or how I am passing the address of the array to these other functions.
function header for file writing;
C++:
void writeLogi2cAdc(FsFile* file, loggerConfigType* configuration, experimentDetailsType* experimentDetails, peripheralStatusType* peripheralStatus, int16_t* dataArray, uint16_t samples, time_t t);
Since writing from this buffer using the buffer directly does not have an issue, am I seeing a problem with the default pointer not being suitable to address the large array properly? ( it 204000 bytes in size)
Should I be using something like a far or huge pointer? (is this still required?)