188 lines
4.8 KiB
C
188 lines
4.8 KiB
C
/*
|
|
* codrv_threadx.c - contains OS specific function definitions
|
|
*
|
|
* Copyright (c) 2012-2020 emotas embedded communication GmbH
|
|
*-------------------------------------------------------------------
|
|
* $Id: codrv_threadx.c 38101 2021-10-01 14:41:30Z hil $
|
|
*
|
|
*
|
|
*-------------------------------------------------------------------
|
|
*
|
|
*
|
|
*/
|
|
|
|
/********************************************************************/
|
|
/**
|
|
* \file
|
|
* \brief OS specific function definitions
|
|
*
|
|
*/
|
|
|
|
/* header of standard C - libraries
|
|
---------------------------------------------------------------------------*/
|
|
|
|
/* header of project specific types
|
|
---------------------------------------------------------------------------*/
|
|
#include <gen_define.h>
|
|
#ifdef CODRV_USE_THREADX
|
|
#include <co_canopen.h>
|
|
#include <codrv_threadx.h>
|
|
|
|
/* constant definitions
|
|
---------------------------------------------------------------------------*/
|
|
#define pdMS_TO_TICKS( xTimeInMs ) ( (ULONG) ( ( (ULONG) ( xTimeInMs ) * TX_TIMER_TICKS_PER_SECOND ) / (ULONG) 1000 ))
|
|
|
|
/* local defined data types
|
|
---------------------------------------------------------------------------*/
|
|
|
|
/* list of external used functions, if not in headers
|
|
--------------------------------------------------------------------------*/
|
|
extern void codrvTimerISR(void); /* Timer interrupt routine */
|
|
|
|
/* list of global defined functions
|
|
---------------------------------------------------------------------------*/
|
|
|
|
/* list of local defined functions
|
|
---------------------------------------------------------------------------*/
|
|
static VOID timerCallback(ULONG value);
|
|
static RET_T codrvCreateLockObjects(void);
|
|
|
|
/* external variables
|
|
---------------------------------------------------------------------------*/
|
|
|
|
/* global variables
|
|
---------------------------------------------------------------------------*/
|
|
TX_SEMAPHORE semphCANopen; /* CANopen task lock */
|
|
TX_SEMAPHORE semphObjDir; /* object dictionary lock */
|
|
|
|
/* local defined variables
|
|
---------------------------------------------------------------------------*/
|
|
static TX_TIMER CANopenTimer; /* CANopen timer object */
|
|
|
|
|
|
/***************************************************************************/
|
|
/**
|
|
* \brief codrvOSConfig - OS specific setup
|
|
*
|
|
* creates and starts the CANopen timer and
|
|
* creates objects to lock object directory and CANopen thread
|
|
*
|
|
* \returns RET_T
|
|
*/
|
|
RET_T codrvOSConfig(void)
|
|
{
|
|
RET_T retVal = RET_DRV_ERROR;
|
|
|
|
/* create objects to lock object directory and CANopen thread */
|
|
retVal = codrvCreateLockObjects();
|
|
if (retVal != RET_OK) {
|
|
return(retVal);
|
|
}
|
|
|
|
/* create and setup CANopen timer */
|
|
retVal = codrvTimerSetup(CO_TIMER_INTERVAL);
|
|
if (retVal != RET_OK) {
|
|
return(retVal);
|
|
}
|
|
|
|
return(RET_OK);
|
|
}
|
|
|
|
|
|
/***************************************************************************/
|
|
/**
|
|
* \brief codrvTimerSetup - initialize timer
|
|
*
|
|
* Start a cyclic hardware timer to provide timing interval.
|
|
* alternatively it can be derived from an other system timer
|
|
* with the interval given from the DeviceDesigner.
|
|
*
|
|
* \returns RET_T
|
|
*/
|
|
RET_T codrvTimerSetup(
|
|
UNSIGNED32 timerInterval
|
|
)
|
|
{
|
|
UINT retVal = TX_TIMER_ERROR;
|
|
|
|
/* create CANopenTimer */
|
|
retVal = tx_timer_create(
|
|
&CANopenTimer,
|
|
"CANopen Timer",
|
|
timerCallback,
|
|
0,
|
|
pdMS_TO_TICKS(timerInterval/1000),
|
|
pdMS_TO_TICKS(timerInterval/1000),
|
|
TX_NO_ACTIVATE);
|
|
if (retVal != TX_SUCCESS) {
|
|
return(RET_DRV_ERROR);
|
|
}
|
|
|
|
/* start CANopenTimer */
|
|
retVal = tx_timer_activate(&CANopenTimer);
|
|
if (retVal != TX_SUCCESS) {
|
|
return(RET_DRV_ERROR);
|
|
}
|
|
|
|
return(RET_OK);
|
|
}
|
|
|
|
|
|
/***************************************************************************/
|
|
/**
|
|
* \brief timerCallback - call timer interrupt service routine
|
|
*
|
|
* \returns void
|
|
*/
|
|
static VOID timerCallback(ULONG value)
|
|
{
|
|
(void)value;
|
|
|
|
/* call timer interrupt service routine */
|
|
codrvTimerISR();
|
|
}
|
|
|
|
|
|
/***************************************************************************/
|
|
/**
|
|
* \brief codrvCreateLockObjects - create lock objects
|
|
*
|
|
* Create objects to lock CANopen thread and CANopen object dictionary
|
|
*
|
|
* \returns RET_T
|
|
*/
|
|
static RET_T codrvCreateLockObjects(
|
|
void
|
|
)
|
|
{
|
|
UINT status;
|
|
|
|
/* Create the semaphore used by CANopen thread. */
|
|
status = tx_semaphore_create(&semphCANopen, "CANopen Semaphore", 1u);
|
|
if (status != TX_SUCCESS) {
|
|
return(RET_DRV_ERROR);
|
|
}
|
|
|
|
/* create a semaphore to lock the CANopen Thread */
|
|
status = tx_semaphore_create(&semphObjDir, "Object Directory Semaphore", 1u);
|
|
if (status != TX_SUCCESS) {
|
|
return(RET_DRV_ERROR);
|
|
}
|
|
|
|
return(RET_OK);
|
|
}
|
|
|
|
|
|
/***************************************************************************/
|
|
/**
|
|
* \brief codrvWaitForEvent - wait for timer or CAN event
|
|
*
|
|
* \returns void
|
|
*/
|
|
void codrvWaitForEvent(UNSIGNED32 msecTimeout)
|
|
{
|
|
/* wait until semaphore is unlocked */
|
|
tx_semaphore_get(&semphCANopen, msecTimeout);
|
|
}
|
|
#endif /* CODRV_USE_THREADX */
|