]> rtime.felk.cvut.cz Git - arc.git/commitdiff
added protection for concurrent execution
authornier <devnull@localhost>
Thu, 6 Oct 2011 17:26:58 +0000 (19:26 +0200)
committernier <devnull@localhost>
Thu, 6 Oct 2011 17:26:58 +0000 (19:26 +0200)
communication/J1939Tp/J1939Tp.c

index 53bd18da9f0a08608f26552217099417c3375658..616ffa283d7b46c3aa0cb5f0f49f7b97fcf16492 100644 (file)
@@ -81,124 +81,123 @@ void J1939Tp_Init(const J1939Tp_ConfigType* ConfigPtr) {
 }\r
 \r
 void J1939Tp_RxIndication(PduIdType RxPduId, PduInfoType* PduInfoPtr) {\r
+       imask_t state;\r
+       Irq_Save(state);\r
        /** @req J1939TP0030 */\r
-       if (globalState.State == J1939TP_OFF) {\r
-               return;\r
-       }\r
-       const J1939Tp_RxPduInfoType* RxPduInfo = 0;\r
-       if (J1939Tp_Internal_GetRxPduInfo(RxPduId, &RxPduInfo) != E_OK) {\r
-               return;\r
-       }\r
-       /*if (J1939Tp_Internal_ValidatePacketType(RxPduInfo) == E_NOT_OK) {\r
-               return;\r
-       }*/\r
-       J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = J1939Tp_Internal_GetChannelState(RxPduInfo);\r
-       switch (RxPduInfo->PacketType ) {\r
-               case J1939TP_REVERSE_CM:\r
-                       J1939Tp_Internal_RxIndication_ReverseCm(PduInfoPtr,ChannelInfoPtr);\r
-                       break;\r
-               case J1939TP_DT:\r
-                       J1939Tp_Internal_RxIndication_Dt(PduInfoPtr,ChannelInfoPtr);\r
-                       break;\r
-               case J1939TP_CM:\r
-                       J1939Tp_Internal_RxIndication_Cm(PduInfoPtr,ChannelInfoPtr);\r
-                       break;\r
-               case J1939TP_DIRECT:\r
-                       J1939Tp_Internal_RxIndication_Direct(PduInfoPtr,ChannelInfoPtr);\r
-                       break;\r
-               default:\r
-                       return;\r
+       if (globalState.State == J1939TP_ON) {\r
+               const J1939Tp_RxPduInfoType* RxPduInfo = 0;\r
+               if (J1939Tp_Internal_GetRxPduInfo(RxPduId, &RxPduInfo) == E_OK) {\r
+                       J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = J1939Tp_Internal_GetChannelState(RxPduInfo);\r
+                       switch (RxPduInfo->PacketType ) {\r
+                               case J1939TP_REVERSE_CM:\r
+                                       J1939Tp_Internal_RxIndication_ReverseCm(PduInfoPtr,ChannelInfoPtr);\r
+                                       break;\r
+                               case J1939TP_DT:\r
+                                       J1939Tp_Internal_RxIndication_Dt(PduInfoPtr,ChannelInfoPtr);\r
+                                       break;\r
+                               case J1939TP_CM:\r
+                                       J1939Tp_Internal_RxIndication_Cm(PduInfoPtr,ChannelInfoPtr);\r
+                                       break;\r
+                               case J1939TP_DIRECT:\r
+                                       J1939Tp_Internal_RxIndication_Direct(PduInfoPtr,ChannelInfoPtr);\r
+                                       break;\r
+                               default:\r
+                                       break;\r
+                       }\r
+               }\r
        }\r
+       Irq_Restore(state);\r
 }\r
 \r
 \r
 void J1939Tp_MainFunction(void) {\r
+       imask_t state;\r
+       Irq_Save(state);\r
        /** @req J1939TP0030 */\r
-       if (globalState.State == J1939TP_OFF) {\r
-               return;\r
-       }\r
-       for (int i = 0; i < J1939TP_CHANNEL_COUNT; i++) {\r
-               J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = &(channelInfos[i]);\r
-               const J1939Tp_ChannelType* Channel = ChannelInfoPtr->ChannelConfPtr;\r
-               J1939Tp_Internal_TimerStatusType timer = J1939TP_NOT_EXPIRED;\r
-               switch (Channel->Direction) {\r
-                       case J1939TP_TX:\r
-                               switch (ChannelInfoPtr->TxState->State) {\r
-                                       case J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM:\r
-                                       case J1939TP_TX_WAITING_FOR_CTS:\r
-                                       case J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK:\r
-                                       case J1939TP_TX_WAIT_DT_CANIF_CONFIRM:\r
-                                       case J1939TP_TX_WAIT_RTS_CANIF_CONFIRM:\r
-                                               timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->TxState->TimerInfo));\r
-                                               if (timer == J1939TP_EXPIRED) {\r
-                                                       timer = J1939TP_NOT_EXPIRED;\r
-                                                       ChannelInfoPtr->TxState->State = J1939TP_TX_IDLE;\r
-                                                       if (ChannelInfoPtr->TxState->CurrentPgPtr != 0) {\r
-                                                               J1939Tp_Internal_SendConnectionAbort(Channel->CmNPdu,ChannelInfoPtr->TxState->CurrentPgPtr->Pgn);\r
-                                                               PduR_J1939TpTxConfirmation(ChannelInfoPtr->TxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+       if (globalState.State == J1939TP_ON) {\r
+               for (int i = 0; i < J1939TP_CHANNEL_COUNT; i++) {\r
+                       J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = &(channelInfos[i]);\r
+                       const J1939Tp_ChannelType* Channel = ChannelInfoPtr->ChannelConfPtr;\r
+                       J1939Tp_Internal_TimerStatusType timer = J1939TP_NOT_EXPIRED;\r
+                       switch (Channel->Direction) {\r
+                               case J1939TP_TX:\r
+                                       switch (ChannelInfoPtr->TxState->State) {\r
+                                               case J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM:\r
+                                               case J1939TP_TX_WAITING_FOR_CTS:\r
+                                               case J1939TP_TX_WAITING_FOR_END_OF_MSG_ACK:\r
+                                               case J1939TP_TX_WAIT_DT_CANIF_CONFIRM:\r
+                                               case J1939TP_TX_WAIT_RTS_CANIF_CONFIRM:\r
+                                                       timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->TxState->TimerInfo));\r
+                                                       if (timer == J1939TP_EXPIRED) {\r
+                                                               timer = J1939TP_NOT_EXPIRED;\r
+                                                               ChannelInfoPtr->TxState->State = J1939TP_TX_IDLE;\r
+                                                               if (ChannelInfoPtr->TxState->CurrentPgPtr != 0) {\r
+                                                                       J1939Tp_Internal_SendConnectionAbort(Channel->CmNPdu,ChannelInfoPtr->TxState->CurrentPgPtr->Pgn);\r
+                                                                       PduR_J1939TpTxConfirmation(ChannelInfoPtr->TxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+                                                               }\r
                                                        }\r
-                                               }\r
-                                               break;\r
-                                       case J1939TP_TX_WAITING_FOR_T1_TIMEOUT:\r
-                                               timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->TxState->TimerInfo));\r
-                                               if (timer == J1939TP_EXPIRED) {\r
-                                                       timer = J1939TP_NOT_EXPIRED;\r
-                                                       ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_DT_BAM_CANIF_CONFIRM;\r
-                                                       J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
-                                                       J1939Tp_Internal_SendDt(ChannelInfoPtr);\r
+                                                       break;\r
+                                               case J1939TP_TX_WAITING_FOR_T1_TIMEOUT:\r
+                                                       timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->TxState->TimerInfo));\r
+                                                       if (timer == J1939TP_EXPIRED) {\r
+                                                               timer = J1939TP_NOT_EXPIRED;\r
+                                                               ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_DT_BAM_CANIF_CONFIRM;\r
+                                                               J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
+                                                               J1939Tp_Internal_SendDt(ChannelInfoPtr);\r
 \r
-                                               }\r
+                                                       }\r
+                                                       break;\r
+                                               default:\r
                                                break;\r
-                                       default:\r
-                                       break;\r
-                               }\r
+                                       }\r
 \r
-                               break;;\r
-                       case J1939TP_RX:\r
-                               switch (ChannelInfoPtr->RxState->State) {\r
-                                       case J1939TP_RX_WAIT_CTS_CANIF_CONFIRM:\r
-                                       case J1939TP_RX_RECEIVING_DT:\r
-                                       case J1939TP_RX_WAIT_ENDOFMSGACK_CANIF_CONFIRM:\r
-                                               timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->RxState->TimerInfo));\r
-                                       default:\r
-                                               break;\r
-                               }\r
-                               if (timer == J1939TP_EXPIRED) {\r
-                                       timer = J1939TP_NOT_EXPIRED;\r
-                                       ChannelInfoPtr->RxState->State = J1939TP_RX_IDLE;\r
-                                       if (Channel->Protocol == J1939TP_PROTOCOL_CMDT) {\r
-                                               J1939Tp_Internal_SendConnectionAbort(Channel->FcNPdu,ChannelInfoPtr->RxState->CurrentPgPtr->Pgn);\r
-                                               PduR_J1939TpRxIndication(ChannelInfoPtr->RxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+                                       break;;\r
+                               case J1939TP_RX:\r
+                                       switch (ChannelInfoPtr->RxState->State) {\r
+                                               case J1939TP_RX_WAIT_CTS_CANIF_CONFIRM:\r
+                                               case J1939TP_RX_RECEIVING_DT:\r
+                                               case J1939TP_RX_WAIT_ENDOFMSGACK_CANIF_CONFIRM:\r
+                                                       timer = J1939Tp_Internal_IncAndCheckTimer(&(ChannelInfoPtr->RxState->TimerInfo));\r
+                                               default:\r
+                                                       break;\r
                                        }\r
-                               }\r
-                       default:\r
-                               break;\r
+                                       if (timer == J1939TP_EXPIRED) {\r
+                                               timer = J1939TP_NOT_EXPIRED;\r
+                                               ChannelInfoPtr->RxState->State = J1939TP_RX_IDLE;\r
+                                               if (Channel->Protocol == J1939TP_PROTOCOL_CMDT) {\r
+                                                       J1939Tp_Internal_SendConnectionAbort(Channel->FcNPdu,ChannelInfoPtr->RxState->CurrentPgPtr->Pgn);\r
+                                                       PduR_J1939TpRxIndication(ChannelInfoPtr->RxState->CurrentPgPtr->NSdu,NTFRSLT_E_NOT_OK);\r
+                                               }\r
+                                       }\r
+                               default:\r
+                                       break;\r
+                       }\r
                }\r
        }\r
+       Irq_Restore(state);\r
 }\r
 void J1939Tp_TxConfirmation(PduIdType RxPdu) {\r
+       imask_t state;\r
+       Irq_Save(state);\r
        /** @req J1939TP0030 */\r
-       if (globalState.State == J1939TP_OFF) {\r
-               return;\r
-       }\r
-       const J1939Tp_RxPduInfoType* RxPduInfo = 0;\r
-       if (J1939Tp_Internal_GetRxPduInfo(RxPdu, &RxPduInfo) != E_OK) {\r
-               return;\r
-       }\r
-\r
-       const J1939Tp_ChannelType* Channel = J1939Tp_Internal_GetChannel(RxPduInfo);\r
-       J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = J1939Tp_Internal_GetChannelState(RxPduInfo);\r
-       switch (Channel->Direction) {\r
-               case J1939TP_TX:\r
-                       J1939Tp_Internal_TxConfirmation_TxChannel(ChannelInfoPtr, RxPduInfo);\r
-                       break;\r
-               case J1939TP_RX:\r
-                       J1939Tp_Internal_TxConfirmation_RxChannel(ChannelInfoPtr, RxPduInfo);\r
-                       break;\r
-               default:\r
-                       break;\r
+       if (globalState.State == J1939TP_ON) {\r
+               const J1939Tp_RxPduInfoType* RxPduInfo = 0;\r
+               if (J1939Tp_Internal_GetRxPduInfo(RxPdu, &RxPduInfo) == E_OK) {\r
+                       const J1939Tp_ChannelType* Channel = J1939Tp_Internal_GetChannel(RxPduInfo);\r
+                       J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = J1939Tp_Internal_GetChannelState(RxPduInfo);\r
+                       switch (Channel->Direction) {\r
+                               case J1939TP_TX:\r
+                                       J1939Tp_Internal_TxConfirmation_TxChannel(ChannelInfoPtr, RxPduInfo);\r
+                                       break;\r
+                               case J1939TP_RX:\r
+                                       J1939Tp_Internal_TxConfirmation_RxChannel(ChannelInfoPtr, RxPduInfo);\r
+                                       break;\r
+                               default:\r
+                                       break;\r
+                       }\r
+               }\r
        }\r
-\r
+       Irq_Restore(state);\r
 }\r
 static inline const J1939Tp_ChannelType* J1939Tp_Internal_GetChannel(const J1939Tp_RxPduInfoType* RxPduInfo) {\r
        return &(J1939Tp_ConfigPtr->Channels[RxPduInfo->ChannelIndex]);\r
@@ -504,57 +503,61 @@ Std_ReturnType J1939Tp_CancelReceiveRequest(PduIdType RxSduId) {
 }\r
 /** @req J1939TP0096 */\r
 Std_ReturnType J1939Tp_Transmit(PduIdType TxSduId, const PduInfoType* TxInfoPtr) {\r
+       imask_t state;\r
+       Irq_Save(state);\r
        #if J1939TP_DEV_ERROR_DETECT\r
        if (globalState.State == J1939TP_OFF) {\r
                J1939Tp_Internal_ReportError(J1939TP_TRANSMIT_ID,J1939TP_E_UNINIT);\r
        }\r
        #endif\r
+       Std_ReturnType r = E_OK;\r
        /** @req J1939TP0030 */\r
-       if (globalState.State == J1939TP_OFF) {\r
-               return E_NOT_OK;\r
-       }\r
-       J1939Tp_Internal_PgInfoType* PgInfo;\r
-\r
-       if (J1939Tp_Internal_GetPg(TxSduId,&PgInfo) == E_NOT_OK) {\r
-               return E_NOT_OK;\r
-       }\r
-       const J1939Tp_PgType* Pg = PgInfo->PgConfPtr;\r
-       J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = PgInfo->ChannelInfoPtr;\r
-       /** @req J1939TP0101 **/\r
-       if (ChannelInfoPtr->TxState->State != J1939TP_TX_IDLE) {\r
-               return E_NOT_OK;\r
-       }\r
-       if (TxInfoPtr->SduLength <= 8) { // direct transmit\r
-               PduInfoType* ToSendTxInfoPtr;\r
-               PduR_J1939TpProvideTxBuffer(Pg->NSdu, &ToSendTxInfoPtr, TxInfoPtr->SduLength);\r
-               PduIdType CanIfPdu = Pg->DirectNPdu;\r
-               ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM;\r
-               ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\r
-               CanIf_Transmit(CanIfPdu,ToSendTxInfoPtr);\r
-       } else {\r
-               uint8 pf = J1939Tp_Internal_GetPf(Pg->Pgn);\r
-               J1939Tp_ProtocolType protocol = J1939Tp_Internal_GetProtocol(pf);\r
-               switch (protocol) { /** @req J1939TP0039*/\r
-                       case J1939TP_PROTOCOL_BAM:\r
-                               ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_BAM_CANIF_CONFIRM;\r
-                               ChannelInfoPtr->TxState->TotalMessageSize = TxInfoPtr->SduLength;\r
-                               ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\r
-                               ChannelInfoPtr->TxState->SentDtCount = 0;\r
-                               J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
-                               J1939Tp_Internal_SendBam(ChannelInfoPtr,TxInfoPtr);\r
-                               break;\r
-                       case J1939TP_PROTOCOL_CMDT:\r
-                               ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_RTS_CANIF_CONFIRM;\r
-                               ChannelInfoPtr->TxState->TotalMessageSize = TxInfoPtr->SduLength;\r
-                               ChannelInfoPtr->TxState->PduRPdu = TxSduId;\r
-                               ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\r
-                               ChannelInfoPtr->TxState->SentDtCount = 0;\r
-                               J1939Tp_Internal_SendRts(ChannelInfoPtr,TxInfoPtr);\r
-                               J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
-                               break;\r
+       if (globalState.State == J1939TP_ON) {\r
+               J1939Tp_Internal_PgInfoType* PgInfo;\r
+               r = J1939Tp_Internal_GetPg(TxSduId,&PgInfo);\r
+               if (r == E_OK) {\r
+                       const J1939Tp_PgType* Pg = PgInfo->PgConfPtr;\r
+                       J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr = PgInfo->ChannelInfoPtr;\r
+                       /** @req J1939TP0101 **/\r
+                       if (ChannelInfoPtr->TxState->State != J1939TP_TX_IDLE) {\r
+                               r = E_NOT_OK;\r
+                       }\r
+                       if (r == E_OK) {\r
+                               if (TxInfoPtr->SduLength <= 8) { // direct transmit\r
+                                       PduInfoType* ToSendTxInfoPtr;\r
+                                       PduR_J1939TpProvideTxBuffer(Pg->NSdu, &ToSendTxInfoPtr, TxInfoPtr->SduLength);\r
+                                       PduIdType CanIfPdu = Pg->DirectNPdu;\r
+                                       ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_DIRECT_SEND_CANIF_CONFIRM;\r
+                                       ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\r
+                                       CanIf_Transmit(CanIfPdu,ToSendTxInfoPtr);\r
+                               } else {\r
+                                       uint8 pf = J1939Tp_Internal_GetPf(Pg->Pgn);\r
+                                       J1939Tp_ProtocolType protocol = J1939Tp_Internal_GetProtocol(pf);\r
+                                       switch (protocol) { /** @req J1939TP0039*/\r
+                                               case J1939TP_PROTOCOL_BAM:\r
+                                                       ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_BAM_CANIF_CONFIRM;\r
+                                                       ChannelInfoPtr->TxState->TotalMessageSize = TxInfoPtr->SduLength;\r
+                                                       ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\r
+                                                       ChannelInfoPtr->TxState->SentDtCount = 0;\r
+                                                       J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
+                                                       J1939Tp_Internal_SendBam(ChannelInfoPtr,TxInfoPtr);\r
+                                                       break;\r
+                                               case J1939TP_PROTOCOL_CMDT:\r
+                                                       ChannelInfoPtr->TxState->State = J1939TP_TX_WAIT_RTS_CANIF_CONFIRM;\r
+                                                       ChannelInfoPtr->TxState->TotalMessageSize = TxInfoPtr->SduLength;\r
+                                                       ChannelInfoPtr->TxState->PduRPdu = TxSduId;\r
+                                                       ChannelInfoPtr->TxState->CurrentPgPtr = Pg;\r
+                                                       ChannelInfoPtr->TxState->SentDtCount = 0;\r
+                                                       J1939Tp_Internal_SendRts(ChannelInfoPtr,TxInfoPtr);\r
+                                                       J1939Tp_Internal_TxSessionStartTimer(ChannelInfoPtr->TxState,J1939TP_TX_CONF_TIMEOUT);\r
+                                                       break;\r
+                                       }\r
+                               }\r
+                       }\r
                }\r
        }\r
-       return E_OK;\r
+       Irq_Restore(state);\r
+       return r;\r
 }\r
 static inline void J1939Tp_Internal_SendBam(J1939Tp_Internal_ChannelInfoType* ChannelInfoPtr,const PduInfoType* TxInfoPtr) {\r
        uint8 cmBamData[BAM_RTS_SIZE];\r