Skip to content

Commit 9e02ed3

Browse files
doru91fuxiaoming-lumi
authored andcommitted
[MATTER-1208] Allow skipping the recalibration process
Skip the recalibration process in ISR context if PDM buffers are in use. Signed-off-by: Doru Gucea <doru-cristian.gucea@nxp.com>
1 parent 60d803c commit 9e02ed3

File tree

3 files changed

+62
-8
lines changed

3 files changed

+62
-8
lines changed

src/k32w0/platform/flash_pdm.c

+42-5
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747

4848
static ramBufferDescriptor *ramDescr = NULL;
4949
static osaMutexId_t pdmMutexHandle = NULL;
50+
static bool_t pdmMutexTaken = FALSE;
5051

5152
#if PDM_SAVE_IDLE
5253
static bool_t settingsInitialized = FALSE;
@@ -130,11 +131,13 @@ void otPlatSettingsDeinit(otInstance *aInstance)
130131

131132
#if ENABLE_STORAGE_DYNAMIC_MEMORY
132133
mutex_lock(pdmMutexHandle, osaWaitForever_c);
134+
pdmMutexTaken = TRUE;
133135
if (ramDescr->buffer)
134136
{
135137
otPlatFree(ramDescr->buffer);
136138
ramDescr->buffer = NULL;
137139
}
140+
pdmMutexTaken = FALSE;
138141
mutex_unlock(pdmMutexHandle);
139142
mutex_destroy(pdmMutexHandle);
140143

@@ -148,9 +151,20 @@ otError otPlatSettingsGet(otInstance *aInstance, uint16_t aKey, int aIndex, uint
148151
OT_UNUSED_VARIABLE(aInstance);
149152
rsError ramStatus = RS_ERROR_NONE;
150153

151-
mutex_lock(pdmMutexHandle, osaWaitForever_c);
154+
if (!OSA_InIsrContext())
155+
{
156+
mutex_lock(pdmMutexHandle, osaWaitForever_c);
157+
pdmMutexTaken = TRUE;
158+
}
159+
152160
ramStatus = ramStorageGet(ramDescr, aKey, aIndex, aValue, aValueLength);
153-
mutex_unlock(pdmMutexHandle);
161+
162+
if (!OSA_InIsrContext())
163+
{
164+
pdmMutexTaken = FALSE;
165+
mutex_unlock(pdmMutexHandle);
166+
}
167+
154168
return mapRamStorageStatus(ramStatus);
155169
}
156170

@@ -165,7 +179,11 @@ otError otPlatSettingsSet(otInstance *aInstance, uint16_t aKey, const uint8_t *a
165179
uint16_t lengthOfAlreadyExistingValue = 0;
166180
#endif
167181

168-
mutex_lock(pdmMutexHandle, osaWaitForever_c);
182+
if (!OSA_InIsrContext())
183+
{
184+
mutex_lock(pdmMutexHandle, osaWaitForever_c);
185+
pdmMutexTaken = TRUE;
186+
}
169187

170188
#if ENABLE_STORAGE_DYNAMIC_MEMORY
171189
/* avoid resizing in case ramDescr already contains aValue whose length is >= aValueLength */
@@ -183,7 +201,11 @@ otError otPlatSettingsSet(otInstance *aInstance, uint16_t aKey, const uint8_t *a
183201
otEXPECT_ACTION((PDM_E_STATUS_OK == pdmStatus), error = OT_ERROR_NO_BUFS);
184202

185203
exit:
186-
mutex_unlock(pdmMutexHandle);
204+
if (!OSA_InIsrContext())
205+
{
206+
pdmMutexTaken = FALSE;
207+
mutex_unlock(pdmMutexHandle);
208+
}
187209
return error;
188210
}
189211

@@ -194,6 +216,7 @@ otError otPlatSettingsAdd(otInstance *aInstance, uint16_t aKey, const uint8_t *a
194216
otError error = OT_ERROR_NONE;
195217

196218
mutex_lock(pdmMutexHandle, osaWaitForever_c);
219+
pdmMutexTaken = TRUE;
197220

198221
#if ENABLE_STORAGE_DYNAMIC_MEMORY
199222
ramStatus = ramStorageResize(ramDescr, aKey, aValue, aValueLength);
@@ -206,6 +229,7 @@ otError otPlatSettingsAdd(otInstance *aInstance, uint16_t aKey, const uint8_t *a
206229
otEXPECT_ACTION((PDM_E_STATUS_OK == pdmStatus), error = OT_ERROR_NO_BUFS);
207230

208231
exit:
232+
pdmMutexTaken = FALSE;
209233
mutex_unlock(pdmMutexHandle);
210234
return error;
211235
}
@@ -218,13 +242,15 @@ otError otPlatSettingsDelete(otInstance *aInstance, uint16_t aKey, int aIndex)
218242
otError error = OT_ERROR_NONE;
219243

220244
mutex_lock(pdmMutexHandle, osaWaitForever_c);
221-
ramStatus = ramStorageDelete(ramDescr, aKey, aIndex);
245+
pdmMutexTaken = TRUE;
246+
ramStatus = ramStorageDelete(ramDescr, aKey, aIndex);
222247
otEXPECT_ACTION((RS_ERROR_NONE == ramStatus), error = mapRamStorageStatus(ramStatus));
223248

224249
pdmStatus = PDM_SaveRecord((uint16_t)kNvmIdOTConfigData, ramDescr);
225250
otEXPECT_ACTION((PDM_E_STATUS_OK == pdmStatus), error = OT_ERROR_NO_BUFS);
226251

227252
exit:
253+
pdmMutexTaken = FALSE;
228254
mutex_unlock(pdmMutexHandle);
229255
return error;
230256
}
@@ -234,13 +260,24 @@ void otPlatSettingsWipe(otInstance *aInstance)
234260
OT_UNUSED_VARIABLE(aInstance);
235261

236262
mutex_lock(pdmMutexHandle, osaWaitForever_c);
263+
pdmMutexTaken = TRUE;
237264
memset(ramDescr->buffer, 0, ramDescr->header.maxLength);
238265
ramDescr->header.length = 0;
239266
PDM_vDeleteDataRecord(kNvmIdOTConfigData);
267+
pdmMutexTaken = FALSE;
240268
mutex_unlock(pdmMutexHandle);
241269
}
242270

243271
#if gRadioUsePdm_d && PDM_SAVE_IDLE
272+
273+
/* in case BLE ISR tries to do a recalibration, make sure that the Ram Buffer Mutex is not
274+
* taken, otherwise execution will be stuck in a FreeRtos assert.
275+
*/
276+
bool should_skip_recal()
277+
{
278+
return (OSA_InIsrContext() && pdmMutexTaken && idleMutexIsTaken());
279+
}
280+
244281
bool bRadioCB_WriteNVM(uint8_t *pu8DataBlock, uint16_t u16Len)
245282
{
246283
return (otPlatSettingsSet(NULL, PDM_ID_RADIO_SETTINGS, pu8DataBlock, u16Len) == OT_ERROR_NONE);

src/k32w0/platform/pdm_ram_storage_glue.c

+19-3
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ static tsQueueEntry asQueue[MAX_QUEUE_SIZE];
6666
static uint8_t u8QueueWritePtr;
6767
static uint8_t u8QueueReadPtr;
6868
static osaMutexId_t asQueueMutex;
69+
static bool_t asQueueMutexTaken;
6970

7071
static uint8_t u8IncrementQueuePtr(uint8_t u8CurrentValue);
7172

@@ -348,7 +349,11 @@ PDM_teStatus FS_eSaveRecordDataInIdleTask(uint16_t u16IdValue, ramBufferDescript
348349
}
349350
#endif
350351

351-
mutex_lock(asQueueMutex, osaWaitForever_c);
352+
if (!OSA_InIsrContext())
353+
{
354+
mutex_lock(asQueueMutex, osaWaitForever_c);
355+
asQueueMutexTaken = TRUE;
356+
}
352357

353358
/* Instead of updating PDM immediately we queue request until later. If
354359
* queue is full, performs first write in queue synchronously, to avoid
@@ -381,7 +386,11 @@ PDM_teStatus FS_eSaveRecordDataInIdleTask(uint16_t u16IdValue, ramBufferDescript
381386
u8QueueWritePtr = u8IncrementQueuePtr(u8QueueWritePtr);
382387
}
383388

384-
mutex_unlock(asQueueMutex);
389+
if (!OSA_InIsrContext())
390+
{
391+
asQueueMutexTaken = FALSE;
392+
mutex_unlock(asQueueMutex);
393+
}
385394

386395
return status;
387396
}
@@ -402,8 +411,10 @@ void FS_vIdleTask(uint8_t u8WritesAllowed)
402411
while ((u8QueueReadPtr != u8QueueWritePtr) && (u8WritesAllowed > 0))
403412
{
404413
mutex_lock(asQueueMutex, osaWaitForever_c);
414+
asQueueMutexTaken = TRUE;
405415
memcpy(&currentEntry, &asQueue[u8QueueReadPtr], sizeof(tsQueueEntry));
406-
u8QueueReadPtr = u8IncrementQueuePtr(u8QueueReadPtr);
416+
u8QueueReadPtr = u8IncrementQueuePtr(u8QueueReadPtr);
417+
asQueueMutexTaken = FALSE;
407418
mutex_unlock(asQueueMutex);
408419

409420
ramBuffer = currentEntry.pvDataBuffer;
@@ -446,4 +457,9 @@ void FS_vIdleTask(uint8_t u8WritesAllowed)
446457
}
447458
}
448459

460+
bool_t idleMutexIsTaken()
461+
{
462+
return asQueueMutexTaken;
463+
}
464+
449465
#endif /* PDM_SAVE_IDLE */

src/k32w0/platform/pdm_ram_storage_glue.h

+1
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ ramBufferDescriptor *getRamBuffer(uint16_t nvmId, uint16_t initialSize);
6666
#if PDM_SAVE_IDLE
6767
PDM_teStatus FS_eSaveRecordDataInIdleTask(uint16_t u16IdValue, ramBufferDescriptor *pvDataBuffer);
6868
void FS_vIdleTask(uint8_t u8WritesAllowed);
69+
bool_t idleMutexIsTaken();
6970
#endif /* PDM_SAVE_IDLE */
7071

7172
#if PDM_SAVE_IDLE

0 commit comments

Comments
 (0)