FreeCalypso > hg > fc-tourmaline
view src/g23m-fad/tcpip/include/rvm_priorities.h @ 220:0ed36de51973
ABB semaphore protection overhaul
The ABB semaphone protection logic that came with TCS211 from TI
was broken in several ways:
* Some semaphore-protected functions were called from Application_Initialize()
context. NU_Obtain_Semaphore() called with NU_SUSPEND fails with
NU_INVALID_SUSPEND in this context, but the return value wasn't checked,
and NU_Release_Semaphore() would be called unconditionally at the end.
The latter call would increment the semaphore count past 1, making the
semaphore no longer binary and thus no longer effective for resource
protection. The fix is to check the return value from NU_Obtain_Semaphore()
and skip the NU_Release_Semaphore() call if the semaphore wasn't properly
obtained.
* Some SPI hardware manipulation was being done before entering the semaphore-
protected critical section. The fix is to reorder the code: first obtain
the semaphore, then do everything else.
* In the corner case of L1/DSP recovery, l1_abb_power_on() would call some
non-semaphore-protected ABB & SPI init functions. The fix is to skip those
calls in the case of recovery.
* A few additional corner cases existed, all of which are fixed by making
ABB semaphore protection 100% consistent for all ABB functions and code paths.
There is still one remaining problem of priority inversion: suppose a low-
priority task calls an ABB function, and some medium-priority task just happens
to preempt right in the middle of that semaphore-protected ABB operation. Then
the high-priority SPI task is locked out for a non-deterministic time until
that medium-priority task finishes its work and goes back to sleep. This
priority inversion problem remains outstanding for now.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 26 Apr 2021 20:55:25 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/**************************************************************************** * * * Name rvm_priorities.h * * * * Function this file priorities defintitions for basic SWEs * * It includes a file rvm_ext_priorities.h where are defined * * "custom" priorities. * * * * Version 0.1 * * * * Date Modification * * ------------------------------------ * * 10/11/2000 Create * * * * Author Cristian Livadiotti (c-livadiotti@ti.com) * * * * (C) Copyright 2000 by Texas Instruments Incorporated, All Rights Reserved* ****************************************************************************/ #ifndef __RVM_PRIORITIES_H_ #define __RVM_PRIORITIES_H_ #include "rvm_ext_priorities.h" /* PRIORITIES SETTING: */ /* All user priority should be set under 250: */ /* Higher values are reserved */ /* ** Bluetooth Priorities: ** All set to same value, except ATP (not a task) and HCI (valid on PC only) */ #define RVM_HCI_TASK_PRIORITY (250) #define RVM_L2CAP_TASK_PRIORITY (240) #define RVM_BTCTRL_TASK_PRIORITY (240) #define RVM_RFCOMM_TASK_PRIORITY (240) #define RVM_SPP_TASK_PRIORITY (240) #define RVM_SDP_TASK_PRIORITY (240) #define RVM_HSG_TASK_PRIORITY (240) #define RVM_DUN_GW_TASK_PRIORITY (240) #define RVM_FAX_GW_TASK_PRIORITY (240) #define RVM_ATP_UART_TASK_PRIORITY (240) #define RVM_ATP_TASK_PRIORITY (255) /* ** Drivers and Services Priorities ** Note: FFS priority should be lower than every user */ #define RVM_SPI_TASK_PRIORITY (39) #define RVM_TTY_TASK_PRIORITY (240) #define RVM_AUDIO_TASK_PRIORITY (245) #define RVM_AUDIO_BGD_TASK_PRIORITY (246) #define RVM_RTC_TASK_PRIORITY (248) #define RVM_FFS_TASK_PRIORITY (250) #define RVM_TRACE_TASK_PRIORITY (251) #define RVM_DAR_TASK_PRIORITY (245) #define RVM_ETM_TASK_PRIORITY (249) #define RVM_MKS_TASK_PRIORITY (255) #define RVM_KPD_TASK_PRIORITY (10) #define RVM_MPM_TASK_PRIORITY (242) #define RVM_RNET_WS_TASK_PRIORITY (80) #define RVM_RNET_RT_TASK_PRIORITY (240) #define RVM_DCM_TASK_PRIORITY (240) #define RVM_MFW_TASK_PRIORITY (245) /* ** RV Test Menu and Dummy Tasks Priorities */ #define RVM_RVTEST_MENU_TASK_PRIORITY (240) #define RVM_DUMMY_TASK_PRIORITY (80) //#define IDLE_TASK_PRIORITY (80) /* A-M-E-N-D-E-D! */ #define RVM_INVKR_TASK_PRIORITY (240) /* A-M-E-N-D-E-D! */ #define RVM_TE1_TASK_PRIORITY (240) /* A-M-E-N-D-E-D! */ #define RVM_TE2_TASK_PRIORITY (240) /* A-M-E-N-D-E-D! */ #define RVM_TE3_TASK_PRIORITY (240) /* A-M-E-N-D-E-D! */ #define RVM_TE4_TASK_PRIORITY (240) /* A-M-E-N-D-E-D! */ #define RVM_TE5_TASK_PRIORITY (240) /* A-M-E-N-D-E-D! */ #define RVM_TE6_TASK_PRIORITY (240) /* A-M-E-N-D-E-D! */ #define RVM_TMS_TASK_PRIORITY (200) /* A-M-E-N-D-E-D! */ #endif /* __RVM_PRIORITIES_H_ */