concurrency handling

pull/29/head
sq8vps 2023-09-04 10:25:26 +02:00
rodzic c0d90a3793
commit f23d89dadb
1 zmienionych plików z 14 dodań i 5 usunięć

Wyświetl plik

@ -147,15 +147,11 @@ void Ax25ClearReceivedFrameBitmap(void)
void *Ax25WriteTxFrame(uint8_t *data, uint16_t size) void *Ax25WriteTxFrame(uint8_t *data, uint16_t size)
{ {
while(txStage != TX_STAGE_IDLE)
;
if((GET_FREE_SIZE(FRAME_BUFFER_SIZE, txBufferHead, txBufferTail) < size) || txFrameBufferFull) if((GET_FREE_SIZE(FRAME_BUFFER_SIZE, txBufferHead, txBufferTail) < size) || txFrameBufferFull)
{ {
return NULL; return NULL;
} }
txFrame[txFrameHead].size = size; txFrame[txFrameHead].size = size;
txFrame[txFrameHead].start = txBufferHead; txFrame[txFrameHead].start = txBufferHead;
for(uint16_t i = 0; i < size; i++) for(uint16_t i = 0; i < size; i++)
@ -164,10 +160,12 @@ void *Ax25WriteTxFrame(uint8_t *data, uint16_t size)
txBufferHead %= FRAME_BUFFER_SIZE; txBufferHead %= FRAME_BUFFER_SIZE;
} }
void *ret = &txFrame[txFrameHead]; void *ret = &txFrame[txFrameHead];
__disable_irq();
txFrameHead++; txFrameHead++;
txFrameHead %= FRAME_MAX_COUNT; txFrameHead %= FRAME_MAX_COUNT;
if(txFrameHead == txFrameTail) if(txFrameHead == txFrameTail)
txFrameBufferFull = true; txFrameBufferFull = true;
__enable_irq();
return ret; return ret;
} }
@ -175,7 +173,9 @@ void *Ax25WriteTxFrame(uint8_t *data, uint16_t size)
bool Ax25ReadNextRxFrame(uint8_t **dst, uint16_t *size, uint16_t *signalLevel) bool Ax25ReadNextRxFrame(uint8_t **dst, uint16_t *size, uint16_t *signalLevel)
{ {
if((rxFrameHead == rxFrameTail) && !rxFrameBufferFull) if((rxFrameHead == rxFrameTail) && !rxFrameBufferFull)
{
return false; return false;
}
*dst = outputFrameBuffer; *dst = outputFrameBuffer;
@ -187,9 +187,11 @@ bool Ax25ReadNextRxFrame(uint8_t **dst, uint16_t *size, uint16_t *signalLevel)
*signalLevel = rxFrame[rxFrameTail].signalLevel; *signalLevel = rxFrame[rxFrameTail].signalLevel;
*size = rxFrame[rxFrameTail].size; *size = rxFrame[rxFrameTail].size;
__disable_irq();
rxFrameBufferFull = false; rxFrameBufferFull = false;
rxFrameTail++; rxFrameTail++;
rxFrameTail %= FRAME_MAX_COUNT; rxFrameTail %= FRAME_MAX_COUNT;
__enable_irq();
return true; return true;
} }
@ -253,10 +255,12 @@ void Ax25BitParse(uint8_t bit, uint8_t modem)
{ {
rxFrame[rxFrameHead].start = rxBufferHead; rxFrame[rxFrameHead].start = rxBufferHead;
rxFrame[rxFrameHead].signalLevel = ModemGetRMS(modem); rxFrame[rxFrameHead].signalLevel = ModemGetRMS(modem);
__disable_irq();
rxFrame[rxFrameHead++].size = rx->frameIdx; rxFrame[rxFrameHead++].size = rx->frameIdx;
rxFrameHead %= FRAME_MAX_COUNT; rxFrameHead %= FRAME_MAX_COUNT;
if(rxFrameHead == txFrameHead) if(rxFrameHead == rxFrameTail)
rxFrameBufferFull = true; rxFrameBufferFull = true;
__enable_irq();
for(uint16_t i = 0; i < rx->frameIdx; i++) for(uint16_t i = 0; i < rx->frameIdx; i++)
{ {
@ -369,8 +373,10 @@ uint8_t Ax25GetTxBit(void)
if(txStage == TX_STAGE_DATA) //transmitting normal data if(txStage == TX_STAGE_DATA) //transmitting normal data
{ {
transmitNormalData: transmitNormalData:
__disable_irq();
if((txFrameHead != txFrameTail) || txFrameBufferFull) if((txFrameHead != txFrameTail) || txFrameBufferFull)
{ {
__enable_irq();
if(txByteIdx < txFrame[txFrameTail].size) //send buffer if(txByteIdx < txFrame[txFrameTail].size) //send buffer
{ {
txByte = txBuffer[(txFrame[txFrameTail].start + txByteIdx) % FRAME_BUFFER_SIZE]; txByte = txBuffer[(txFrame[txFrameTail].start + txByteIdx) % FRAME_BUFFER_SIZE];
@ -384,6 +390,7 @@ transmitNormalData:
} }
else //no more frames else //no more frames
{ {
__enable_irq();
txByteIdx = 0; txByteIdx = 0;
txBitIdx = 0; txBitIdx = 0;
txStage = TX_STAGE_TAIL; txStage = TX_STAGE_TAIL;
@ -417,9 +424,11 @@ transmitNormalData:
txFlagsElapsed = 0; txFlagsElapsed = 0;
txByteIdx = 0; txByteIdx = 0;
txStage = TX_STAGE_DATA; //return to normal data transmission stage. There might be a next frame to transmit txStage = TX_STAGE_DATA; //return to normal data transmission stage. There might be a next frame to transmit
__disable_irq();
txFrameBufferFull = false; txFrameBufferFull = false;
txFrameTail++; txFrameTail++;
txFrameTail %= FRAME_MAX_COUNT; txFrameTail %= FRAME_MAX_COUNT;
__enable_irq();
goto transmitNormalData; goto transmitNormalData;
} }
} }