void sem_server() { Sem_request request; Semaphore* sem; int tid; int status; status = RegisterAs( SEMAPHORE_SERVER_NAME ); assert( status == REGISTER_AS_SUCCESS ); while( 1 ) { status = Receive( &tid, ( char* )&request, sizeof( request ) ); assert( status == sizeof( request ) ); sem = request.sem; switch( request.type ) { case SEM_RELEASE: sem->count += 1; status = Reply( tid, ( char* )&status, sizeof( status ) ); assert( status == SYSCALL_SUCCESS ); break; case SEM_AC_ALL: if( sem->count > 0 ) { sem->count = 1; } // Fall through case SEM_ACQUIRE: status = rbuf_put( &sem->wait_queue, ( uchar* )&tid ); assert( status == ERR_NONE ); break; } while( sem->count > 0 && ! rbuf_empty( &sem->wait_queue ) ) { sem->count -= 1; rbuf_get( &sem->wait_queue, ( uchar* )&tid ); status = Reply( tid, ( char* )&status, sizeof( status ) ); assert( status == SYSCALL_SUCCESS ); } } }
/** * \brief Passes CAN message data and VEH_IO data to the output stream * @param canMsg1 pointer to a packet of CAN message data * @param u64Can1EpochTime1 Time the message arrived * @param canMsg2 pointer to a packet of CAN message data * @param u64CanEpochTime2 Time the message arrived * @param u8IoDir 8-bit value representing the direction of the IO pins (Input:1, Output:0) * @param u8IoVal 8-bit value representing the value currently on the IO pins. * @return T if data is in a valid format and if there is space available in the output stream buffers */ uint8_t CCOM_TxCmd00(CAN_msg_t *canMsg1, uint64_t u64CanEpochTime1, CAN_msg_t *canMsg2, uint64_t u64CanEpochTime2, uint8_t u8IoDir, uint8_t u8IoVal) { uint8_t bOk = 1; T_CCOM_ID00 id00Packet; uint8_t i; uint32_t u32PutAddr; Clear_ID00_Packet(&id00Packet); /* Check to see if there is room in the output stream buffers */ if(rbuf_full(&ccomBuf)){ return 0; } id00Packet.u16Header = ID00_HEADER; id00Packet.u8Id = ID00; id00Packet.u8IoDir = u8IoDir; id00Packet.u8IoVal = u8IoVal; id00Packet.u8BufSize = ccomBuf.count; if(NULL == canMsg1) { id00Packet.u8Dat = ID00_IO_ONLY; } else if(canMsg2 != NULL) { id00Packet.u8Dat = ID00_CAN_MSG1_AND_2_AND_IO; /* CAN MESSAGE 1 */ id00Packet.u32CanId1 = canMsg1->id; id00Packet.u8CanDlc1 = canMsg1->len; id00Packet.u8CanStat1 = canMsg1->stat; for(i=0;i<canMsg1->len;i++){ id00Packet.au8CanData1[i] = canMsg1->buf[i]; } id00Packet.u64CanEpochTime1 = u64CanEpochTime1; /* CAN MESSAGE 2 */ id00Packet.u32CanId2 = canMsg2->id; id00Packet.u8CanDlc2 = canMsg2->len; id00Packet.u8CanStat2 = canMsg2->stat; for(i=0;i<canMsg2->len;i++){ id00Packet.au8CanData2[i] = canMsg2->buf[i]; } id00Packet.u64CanEpochTime2 = u64CanEpochTime2; } else { id00Packet.u8Dat = ID00_CAN_MSG1_AND_IO; /* CAN MESSAGE 1 */ id00Packet.u32CanId1 = canMsg1->id; id00Packet.u8CanDlc1 = canMsg1->len; id00Packet.u8CanStat1 = canMsg1->stat; for(i=0;i<canMsg1->len;i++){ id00Packet.au8CanData1[i] = canMsg1->buf[i]; } id00Packet.u64CanEpochTime1 = u64CanEpochTime1; } id00Packet.u8Cksm = Checksum_ID00_Packet(&id00Packet); /* Packet is put together... Now stuff it in a bucket for sending */ rbuf_put(&ccomBuf, &u32PutAddr); // which available array should we use? LoadOutput(&id00Packet.au8AllData[0],(uint8_t *)u32PutAddr,MAX_FRAME_SIZE); //for(i=0;i<MAX_FRAME_SIZE;i++){ printf("%02x,",au8Data[0][i]); } printf("\n\r"); return bOk; }