FreeCalypso > hg > fc-tourmaline
view src/cs/layer1/audio_cust0/l1audio_cust.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 | 4e78acac3d88 |
children |
line wrap: on
line source
/************* Revision Controle System Header ************* * GSM Layer 1 software * L1AUDIO_CUST.H * * Filename l1audio_cust.h * Copyright 2003 (C) Texas Instruments * ************* Revision Controle System Header *************/ #if (AUDIO_TASK == 1) #if (OP_RIV_AUDIO == 0) extern void vocoder_mute_dl (BOOL mute); extern void vocoder_mute_ul (BOOL mute); #endif #if (MELODY_E1) //---------------------------------------- // Melody format E1 constant. //---------------------------------------- // Number of oscillators (fixed value) #define SC_NUMBER_OSCILLATOR 8 // Define the unit of the downloading time (fixed value) #define SC_MELO_DOWNLOAD_TIME_UNIT 4 // unit = 20ms #endif // MELODY_E1 #if (VOICE_MEMO) || (SPEECH_RECO) //---------------------------------------- // Voice memo constant. //---------------------------------------- // Word to indicate the end of the speech data (fixed value). #define SC_VM_END_MASK 0xFBFF #endif // VOICE_MEMO || SPEECH_RECO #if (L1_VOICE_MEMO_AMR) //---------------------------------------- // Voice memo amr constant. //---------------------------------------- // Word to indicate the end of the speech data (fixed value). #define SC_VM_AMR_END_MASK_SIZE 1 #define SC_VM_AMR_END_MASK 0xFF #endif // L1_VOICE_MEMO_AMR #if (SPEECH_RECO) //---------------------------------------- // Speech recognition constant. //---------------------------------------- // Error ID (fixed values) #define SC_NO_ERROR 0 // No error #define SC_BAD_ACQUISITION 1 // Bad acquisition of the word. The word is too long or too short #define SC_TIME_OUT 2 // The DSP task to acquire the word takes to much time #define SC_BAD_UPDATE 3 // Bad update of the model. The model from the database is too different // than the model built during the acquisition. #define SC_BAD_RECOGNITION 4 // This word is out of vocabulary or the best words are too close #define SC_CTO_WORD 5 // A word generated by the CTO algorithm is the best word. #define SC_CHECK_ERROR 6 // The best word isn't the word to update. // Time out (fixed values) #define SC_SR_AQUISITION_TIME_OUT 867 // acquisition time out in fn unit (3s). #define SC_SR_UPDATE_TIME_OUT 500 // update time out in fn unit. #define SC_SR_PROCESSING_TIME_OUT 500 // processing time out in fn unit. // CTO algorithm parameters (tuning value) #define SC_SR_MAX_WORDS_FOR_CTO 4 // Threshold to decide when the CTO algorithm is needed: // if the number of model is less 0r equal to this value, the CTO algo. is enabled. // model constant (fixed values) #define SC_SR_MODEL_FRAME_SIZE 16 // size of the model parameters per audio frames (20 ms). #define SC_SR_MODEL_API_SIZE 1041 // size of the model corrsponding to the longest possible word (1,3 second): // 16 words frames* 1,3s/20ms + 1 = 1041 // the header word of the model gives the size of the model in model frame unit. #define SC_SR_MMI_DB_MODEL_SIZE SC_SR_MODEL_API_SIZE // maximum size of the model in the MMI database. // speech constant (fixed values) #define SC_SR_SPEECH_FRAME_SIZE 20 // size of the speech samples per audio frams (20ms) #define SC_SR_SPEECH_WORD_SIZE 65 // maximum size in speech frame size unit of the word to acquire #define SC_SR_SPEECH_WORD_BEGIN_VAD_LATENCY 35 // time in speech frame size unit to detect that the word begins #define SC_SR_SPEECH_WORD_END_VAD_LATENCY 35 // time in speech frame size unit to detect that the word is finished #define SC_SR_SPEECH_WORD_BEGIN_MARGIN 5 // time in speech frame size unit to add a beginning margin of the word #define SC_SR_SPEECH_WORD_END_MARGIN 5 // time in speech frame size unit to add a end margin of the word #define SC_SR_SPEECH_ENDING_DONE_MARGING 20 // time in speech frame size unit to have the word done status after the word ending status. #define SC_SR_MMI_2_L1_SPEECH_SIZE (SC_SR_SPEECH_WORD_BEGIN_MARGIN + SC_SR_SPEECH_WORD_SIZE + SC_SR_SPEECH_WORD_END_VAD_LATENCY + SC_SR_SPEECH_ENDING_DONE_MARGING) * SC_SR_SPEECH_FRAME_SIZE // size of the speech buffer allocated by MMI to acquire the speech. #define SC_SR_MMI_DB_SPEECH_SIZE (SC_SR_SPEECH_WORD_BEGIN_MARGIN + SC_SR_SPEECH_WORD_SIZE + SC_SR_SPEECH_WORD_END_MARGIN) * SC_SR_SPEECH_FRAME_SIZE + 1 // size of the speech buffer included in a MMI database // "+1" is for the END voice memo mask. // DSP Out-Of-Vocabulary constant (tuning value) #define SC_SR_OOV_SFT_THR 10 // OOV rejection threhold (the lower more rejection) // if this value is equal to 0, ther's no rejection #endif // SPEECH_RECO #if (L1_NEW_AEC) // time interval between 2 AEC debug traces (in TDMA). Must be <= 127 #define SC_AEC_VISIBILITY_INTERVAL 52 #endif #if (FIR) // FIR indication (fixed values) #define DL_FIR 1 // The DL FIR must be updated #define UL_FIR 2 // The UL FIR must be updated #define UL_DL_FIR 3 // The UL&DL FIR must be updated #endif // List of the error returned by the Cust_get_pointer function #define DATA_AVAILABLE 0 // No error is occured #define SESSION_ERROR 1 // Wrong session id #define POINTER_ERROR 2 // Wrong ptr argument #define DATA_AVAIL_ERROR 3 // No more data available #if (AUDIO_MODE) #define GSM_ONLY 0 // GSM normal mode #define BT_CORDLESS 1 // Bluetooth cordless mode #define BT_HEADSET 2 // Bluetooth headset mode #endif #if (MELODY_E2) #define SC_AUDIO_MELODY_E2_MAX_NUMBER_OF_INSTRUMENT 8 // Maximum number of instruments allowed to play in thesame time // (Fixed value) #define SC_AUDIO_MELODY_E2_MAX_SIZE_OF_INSTRUMENT (3807 - C_DEBUG_BUFFER_SIZE) // Melody E2 instrument wave table size in the API memory // (fixed value) #define SC_AUDIO_MELODY_E2_MAX_SIZE_OF_DSP_TRACE (C_DEBUG_BUFFER_SIZE + 1) // DSP API buffer trace size (fixed value) // Note :the melody E2 instrument are overlayed with the DSP buffer trace. The size ofthe trace buffer can // change in order to increase the DSP tracability. In all case, the following rules need to be followed // (when melody E2 is activated): // size of the E2 instruments buffer + size of DSP trace buffer = 2049 // size of the E2 instrument buffers > 1 // size of DSP trace buffer > 1 #endif #endif // AUDIO_TASK // Number of coefficient for each FIR (fixed value) #define MAX_FIR_COEF 31