powerlink: run the basic part of demo_cn_console
This commit is contained in:
parent
68179bec6c
commit
458a7c5d91
|
@ -128,10 +128,15 @@ int netselect_selectNetworkInterface(char* pDevName_p, size_t maxLen_p)
|
||||||
|
|
||||||
printf("--------------------------------------------------\n");
|
printf("--------------------------------------------------\n");
|
||||||
printf("Select the interface to be used for POWERLINK (1-%u):", (unsigned int)i);
|
printf("Select the interface to be used for POWERLINK (1-%u):", (unsigned int)i);
|
||||||
|
#ifdef __XIUOS__
|
||||||
|
printf("1\n");
|
||||||
|
num = 1;
|
||||||
|
#else
|
||||||
if (scanf("%u", &num) == EOF)
|
if (scanf("%u", &num) == EOF)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
printf("--------------------------------------------------\n");
|
printf("--------------------------------------------------\n");
|
||||||
if ((num < 1) || (num > i))
|
if ((num < 1) || (num > i))
|
||||||
|
|
|
@ -387,6 +387,11 @@ static void loopMain(void)
|
||||||
// wait for key hit
|
// wait for key hit
|
||||||
while (!fExit)
|
while (!fExit)
|
||||||
{
|
{
|
||||||
|
#ifdef __XIUOS__
|
||||||
|
ret = oplk_process();
|
||||||
|
if (ret != kErrorOk)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
if (console_kbhit())
|
if (console_kbhit())
|
||||||
{
|
{
|
||||||
cKey = (char)console_getch();
|
cKey = (char)console_getch();
|
||||||
|
|
|
@ -421,6 +421,11 @@ static void loopMain(void)
|
||||||
|
|
||||||
while (!fExit)
|
while (!fExit)
|
||||||
{
|
{
|
||||||
|
#ifdef __XIUOS__
|
||||||
|
ret = oplk_process();
|
||||||
|
if (ret != kErrorOk)
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
if (console_kbhit())
|
if (console_kbhit())
|
||||||
{
|
{
|
||||||
cKey = (char)console_getch();
|
cKey = (char)console_getch();
|
||||||
|
|
|
@ -11,6 +11,7 @@ This file contains the console input/output implementation for XiUOS.
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
/*------------------------------------------------------------------------------
|
||||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
Copyright (c) 2016, B&R Industrial Automation GmbH
|
||||||
|
Copyright (c) 2020, AIIT XUOS Lab
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -42,6 +43,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
// #include <strings.h>
|
||||||
|
|
||||||
|
#include <xsconfig.h>
|
||||||
|
|
||||||
//============================================================================//
|
//============================================================================//
|
||||||
// P U B L I C F U N C T I O N S //
|
// P U B L I C F U N C T I O N S //
|
||||||
|
@ -61,7 +65,7 @@ termios library.
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
int console_getch(void)
|
int console_getch(void)
|
||||||
{
|
{
|
||||||
return getchar();
|
return 'p';
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
@ -78,5 +82,5 @@ The function checks the console for a keystroke.
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
int console_kbhit(void)
|
int console_kbhit(void)
|
||||||
{
|
{
|
||||||
return 1;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,11 +221,6 @@ SET(EVENT_UCAL_LINUXUSER_SOURCES
|
||||||
${USER_SOURCE_DIR}/event/eventucalintf-circbuf.c
|
${USER_SOURCE_DIR}/event/eventucalintf-circbuf.c
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(EVENT_UCAL_XIUOS_SOURCES
|
|
||||||
${USER_SOURCE_DIR}/event/eventucal-xiuos.c
|
|
||||||
${USER_SOURCE_DIR}/event/eventucalintf-circbuf.c
|
|
||||||
)
|
|
||||||
|
|
||||||
SET(EVENT_UCAL_LINUXIOCTL_SOURCES
|
SET(EVENT_UCAL_LINUXIOCTL_SOURCES
|
||||||
${USER_SOURCE_DIR}/event/eventucal-linuxioctl.c
|
${USER_SOURCE_DIR}/event/eventucal-linuxioctl.c
|
||||||
)
|
)
|
||||||
|
@ -402,11 +397,6 @@ SET(EVENT_KCAL_WINDOWS_SOURCES
|
||||||
${KERNEL_SOURCE_DIR}/event/eventkcalintf-circbuf.c
|
${KERNEL_SOURCE_DIR}/event/eventkcalintf-circbuf.c
|
||||||
)
|
)
|
||||||
|
|
||||||
SET(EVENT_KCAL_XIUOS_SOURCES
|
|
||||||
${KERNEL_SOURCE_DIR}/event/eventkcal-xiuos.c
|
|
||||||
${KERNEL_SOURCE_DIR}/event/eventkcalintf-circbuf.c
|
|
||||||
)
|
|
||||||
|
|
||||||
SET(EVENT_KCAL_LINUXKERNEL_SOURCES
|
SET(EVENT_KCAL_LINUXKERNEL_SOURCES
|
||||||
${KERNEL_SOURCE_DIR}/event/eventkcal-linuxkernel.c
|
${KERNEL_SOURCE_DIR}/event/eventkcal-linuxkernel.c
|
||||||
${KERNEL_SOURCE_DIR}/event/eventkcalintf-circbuf.c
|
${KERNEL_SOURCE_DIR}/event/eventkcalintf-circbuf.c
|
||||||
|
|
|
@ -46,14 +46,14 @@ SET (LIB_SOURCES
|
||||||
${CTRL_UCAL_DIRECT_SOURCES}
|
${CTRL_UCAL_DIRECT_SOURCES}
|
||||||
${DLL_UCAL_CIRCBUF_SOURCES}
|
${DLL_UCAL_CIRCBUF_SOURCES}
|
||||||
${ERRHND_UCAL_LOCAL_SOURCES}
|
${ERRHND_UCAL_LOCAL_SOURCES}
|
||||||
${EVENT_UCAL_XIUOS_SOURCES}
|
${EVENT_UCAL_NOOSKERNEL_SOURCES}
|
||||||
${PDO_UCAL_LOCAL_SOURCES}
|
${PDO_UCAL_LOCAL_SOURCES}
|
||||||
${USER_TIMER_XIUOS_SOURCES}
|
${USER_TIMER_XIUOS_SOURCES}
|
||||||
${KERNEL_SOURCES}
|
${KERNEL_SOURCES}
|
||||||
${CTRL_KCAL_DIRECT_SOURCES}
|
${CTRL_KCAL_DIRECT_SOURCES}
|
||||||
${DLL_KCAL_CIRCBUF_SOURCES}
|
${DLL_KCAL_CIRCBUF_SOURCES}
|
||||||
${ERRHND_KCAL_LOCAL_SOURCES}
|
${ERRHND_KCAL_LOCAL_SOURCES}
|
||||||
${EVENT_KCAL_XIUOS_SOURCES}
|
${EVENT_KCAL_NOOSKERNEL_SOURCES}
|
||||||
${PDO_KCAL_LOCAL_SOURCES}
|
${PDO_KCAL_LOCAL_SOURCES}
|
||||||
${COMMON_SOURCES}
|
${COMMON_SOURCES}
|
||||||
${COMMON_LINUXUSER_SOURCES}
|
${COMMON_LINUXUSER_SOURCES}
|
||||||
|
|
|
@ -131,4 +131,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
// SDO module specific defines
|
// SDO module specific defines
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// Circular buffer specific defines
|
||||||
|
//==============================================================================
|
||||||
|
#define CONFIG_EVENT_SIZE_CIRCBUF_KERNEL_TO_USER 2048
|
||||||
|
#define CONFIG_EVENT_SIZE_CIRCBUF_USER_TO_KERNEL 2048
|
||||||
|
#define CONFIG_EVENT_SIZE_CIRCBUF_KERNEL_INTERNAL 2048
|
||||||
|
#define CONFIG_EVENT_SIZE_CIRCBUF_USER_INTERNAL 2048
|
||||||
|
|
||||||
|
#define CONFIG_DLLCAL_BUFFER_SIZE_TX_NMT 2047
|
||||||
|
#define CONFIG_DLLCAL_BUFFER_SIZE_TX_GEN 2047
|
||||||
|
#define CONFIG_DLLCAL_BUFFER_SIZE_TX_VETH 2048
|
||||||
|
#define CONFIG_DLLCAL_BUFFER_SIZE_TX_SYNC 2048
|
||||||
|
|
||||||
#endif // _INC_oplkcfg_H_
|
#endif // _INC_oplkcfg_H_
|
||||||
|
|
|
@ -47,14 +47,14 @@ SET (LIB_SOURCES
|
||||||
${CTRL_UCAL_DIRECT_SOURCES}
|
${CTRL_UCAL_DIRECT_SOURCES}
|
||||||
${DLL_UCAL_CIRCBUF_SOURCES}
|
${DLL_UCAL_CIRCBUF_SOURCES}
|
||||||
${ERRHND_UCAL_LOCAL_SOURCES}
|
${ERRHND_UCAL_LOCAL_SOURCES}
|
||||||
${EVENT_UCAL_XIUOS_SOURCES}
|
${EVENT_UCAL_NOOSKERNEL_SOURCES}
|
||||||
${PDO_UCAL_LOCAL_SOURCES}
|
${PDO_UCAL_LOCAL_SOURCES}
|
||||||
${USER_TIMER_XIUOS_SOURCES}
|
${USER_TIMER_XIUOS_SOURCES}
|
||||||
${KERNEL_SOURCES}
|
${KERNEL_SOURCES}
|
||||||
${CTRL_KCAL_DIRECT_SOURCES}
|
${CTRL_KCAL_DIRECT_SOURCES}
|
||||||
${DLL_KCAL_CIRCBUF_SOURCES}
|
${DLL_KCAL_CIRCBUF_SOURCES}
|
||||||
${ERRHND_KCAL_LOCAL_SOURCES}
|
${ERRHND_KCAL_LOCAL_SOURCES}
|
||||||
${EVENT_KCAL_XIUOS_SOURCES}
|
${EVENT_KCAL_NOOSKERNEL_SOURCES}
|
||||||
${PDO_KCAL_LOCAL_SOURCES}
|
${PDO_KCAL_LOCAL_SOURCES}
|
||||||
${COMMON_SOURCES}
|
${COMMON_SOURCES}
|
||||||
${COMMON_LINUXUSER_SOURCES}
|
${COMMON_LINUXUSER_SOURCES}
|
||||||
|
|
|
@ -138,4 +138,12 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#define CONFIG_SDO_MAX_CONNECTION_COM 100
|
#define CONFIG_SDO_MAX_CONNECTION_COM 100
|
||||||
#define CONFIG_SDO_MAX_CONNECTION_UDP 50
|
#define CONFIG_SDO_MAX_CONNECTION_UDP 50
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// Circular buffer specific defines
|
||||||
|
//==============================================================================
|
||||||
|
#define CONFIG_EVENT_SIZE_CIRCBUF_KERNEL_TO_USER 2048
|
||||||
|
#define CONFIG_EVENT_SIZE_CIRCBUF_USER_TO_KERNEL 2048
|
||||||
|
#define CONFIG_EVENT_SIZE_CIRCBUF_KERNEL_INTERNAL 2048
|
||||||
|
#define CONFIG_EVENT_SIZE_CIRCBUF_USER_INTERNAL 2048
|
||||||
|
|
||||||
#endif // _INC_oplkcfg_H_
|
#endif // _INC_oplkcfg_H_
|
||||||
|
|
|
@ -110,7 +110,18 @@ tOplkError target_enumerateNetworkInterfaces(tNetIfId* pInterfaces_p,
|
||||||
{
|
{
|
||||||
UNUSED_PARAMETER(pInterfaces_p);
|
UNUSED_PARAMETER(pInterfaces_p);
|
||||||
UNUSED_PARAMETER(pNoInterfaces_p);
|
UNUSED_PARAMETER(pNoInterfaces_p);
|
||||||
return kErrorApiNotSupported;
|
|
||||||
|
if (*pNoInterfaces_p == 0)
|
||||||
|
return kErrorOk;
|
||||||
|
|
||||||
|
memset(pInterfaces_p[0].aMacAddress, 0,
|
||||||
|
sizeof(pInterfaces_p[0].aMacAddress));
|
||||||
|
strcpy(pInterfaces_p[0].aDeviceName, "eth0");
|
||||||
|
strcpy(pInterfaces_p[0].aDeviceDescription, "eth0");
|
||||||
|
|
||||||
|
*pNoInterfaces_p = 1;
|
||||||
|
|
||||||
|
return kErrorOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
//============================================================================//
|
//============================================================================//
|
||||||
|
|
|
@ -1,377 +0,0 @@
|
||||||
/**
|
|
||||||
********************************************************************************
|
|
||||||
\file eventkcal-linux.c
|
|
||||||
|
|
||||||
\brief Kernel event CAL module for Linux userspace
|
|
||||||
|
|
||||||
This file implements the kernel event handler CAL module for the Linux
|
|
||||||
userspace platform. It uses the circular buffer interface for all event queues.
|
|
||||||
|
|
||||||
\see eventkcalintf-circbuf.c
|
|
||||||
|
|
||||||
\ingroup module_eventkcal
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
|
||||||
Copyright (c) 2020, AIIT XUOS Lab
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
* Neither the name of the copyright holders nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// includes
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
#include <common/oplkinc.h>
|
|
||||||
#include <kernel/eventkcal.h>
|
|
||||||
#include <kernel/eventkcalintf.h>
|
|
||||||
#include <common/target.h>
|
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <semaphore.h>
|
|
||||||
#include <common/target.h>
|
|
||||||
|
|
||||||
//============================================================================//
|
|
||||||
// G L O B A L D E F I N I T I O N S //
|
|
||||||
//============================================================================//
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// const defines
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
#define KERNEL_EVENT_THREAD_PRIORITY 55
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// module global vars
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// global function prototypes
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
//============================================================================//
|
|
||||||
// P R I V A T E D E F I N I T I O N S //
|
|
||||||
//============================================================================//
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// const defines
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// local types
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
/**
|
|
||||||
\brief Kernel event CAL instance type
|
|
||||||
|
|
||||||
The structure contains all necessary information needed by the kernel event
|
|
||||||
CAL module.
|
|
||||||
*/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
pthread_t threadId;
|
|
||||||
BOOL fStopThread;
|
|
||||||
sem_t semUserData;
|
|
||||||
sem_t semKernelData;
|
|
||||||
BOOL fInitialized;
|
|
||||||
} tEventkCalInstance;
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// local vars
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static tEventkCalInstance instance_l; ///< Instance variable of kernel event CAL module
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// local function prototypes
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static void* eventThread(void* arg);
|
|
||||||
static void signalKernelEvent(void);
|
|
||||||
static void signalUserEvent(void);
|
|
||||||
|
|
||||||
//============================================================================//
|
|
||||||
// P U B L I C F U N C T I O N S //
|
|
||||||
//============================================================================//
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Initialize kernel event CAL module
|
|
||||||
|
|
||||||
The function initializes the kernel event CAL module on Linux.
|
|
||||||
|
|
||||||
\return The function returns a tOplkError error code.
|
|
||||||
\retval kErrorOk Function executes correctly
|
|
||||||
\retval other error codes An error occurred
|
|
||||||
|
|
||||||
\ingroup module_eventkcal
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
tOplkError eventkcal_init(void)
|
|
||||||
{
|
|
||||||
struct sched_param schedParam;
|
|
||||||
|
|
||||||
OPLK_MEMSET(&instance_l, 0, sizeof(tEventkCalInstance));
|
|
||||||
|
|
||||||
if (sem_init(&instance_l.semUserData, 0, 0) < 0)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
if (sem_init(&instance_l.semKernelData, 0, 0) < 0)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
if (eventkcal_initQueueCircbuf(kEventQueueK2U) != kErrorOk)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
if (eventkcal_initQueueCircbuf(kEventQueueU2K) != kErrorOk)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
if (eventkcal_initQueueCircbuf(kEventQueueKInt) != kErrorOk)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
eventkcal_setSignalingCircbuf(kEventQueueK2U, signalUserEvent);
|
|
||||||
|
|
||||||
eventkcal_setSignalingCircbuf(kEventQueueKInt, signalKernelEvent);
|
|
||||||
|
|
||||||
instance_l.fStopThread = FALSE;
|
|
||||||
if (pthread_create(&instance_l.threadId, NULL, eventThread, (void*)&instance_l) != 0)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
schedParam.sched_priority = KERNEL_EVENT_THREAD_PRIORITY;
|
|
||||||
if (pthread_setschedparam(instance_l.threadId, SCHED_FIFO, &schedParam) != 0)
|
|
||||||
{
|
|
||||||
DEBUG_LVL_ERROR_TRACE("%s(): couldn't set thread scheduling parameters! %d\n",
|
|
||||||
__func__,
|
|
||||||
schedParam.sched_priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ >= 12)
|
|
||||||
pthread_setname_np(instance_l.threadId, "oplk-eventk");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
instance_l.fInitialized = TRUE;
|
|
||||||
return kErrorOk;
|
|
||||||
|
|
||||||
Exit:
|
|
||||||
if (instance_l.semUserData >= 0)
|
|
||||||
sem_destroy(&instance_l.semUserData);
|
|
||||||
|
|
||||||
if (instance_l.semKernelData >= 0)
|
|
||||||
sem_destroy(&instance_l.semKernelData);
|
|
||||||
|
|
||||||
eventkcal_exitQueueCircbuf(kEventQueueK2U);
|
|
||||||
eventkcal_exitQueueCircbuf(kEventQueueU2K);
|
|
||||||
eventkcal_exitQueueCircbuf(kEventQueueKInt);
|
|
||||||
|
|
||||||
return kErrorNoResource;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Clean up kernel event CAL module
|
|
||||||
|
|
||||||
The function cleans up the kernel event CAL module. For cleanup it calls the exit
|
|
||||||
functions of the queue implementations for each used queue.
|
|
||||||
|
|
||||||
\return The function returns a tOplkError error code.
|
|
||||||
\retval kErrorOk Function executes correctly
|
|
||||||
\retval other error codes An error occurred
|
|
||||||
|
|
||||||
\ingroup module_eventkcal
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
tOplkError eventkcal_exit(void)
|
|
||||||
{
|
|
||||||
UINT i = 0;
|
|
||||||
|
|
||||||
if (instance_l.fInitialized != FALSE)
|
|
||||||
{
|
|
||||||
instance_l.fStopThread = TRUE;
|
|
||||||
while (instance_l.fStopThread != FALSE)
|
|
||||||
{
|
|
||||||
target_msleep(10);
|
|
||||||
if (i++ > 100)
|
|
||||||
{
|
|
||||||
DEBUG_LVL_EVENTK_TRACE("Event thread is not terminating, continue shutdown...!\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eventkcal_exitQueueCircbuf(kEventQueueK2U);
|
|
||||||
eventkcal_exitQueueCircbuf(kEventQueueU2K);
|
|
||||||
eventkcal_exitQueueCircbuf(kEventQueueKInt);
|
|
||||||
|
|
||||||
sem_destroy(&instance_l.semUserData);
|
|
||||||
sem_destroy(&instance_l.semKernelData);
|
|
||||||
|
|
||||||
sem_unlink("/semUserEvent");
|
|
||||||
sem_unlink("/semKernelEvent");
|
|
||||||
|
|
||||||
}
|
|
||||||
instance_l.fInitialized = FALSE;
|
|
||||||
|
|
||||||
return kErrorOk;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Post kernel event
|
|
||||||
|
|
||||||
This function posts a event to the kernel queue.
|
|
||||||
|
|
||||||
\param[in] pEvent_p Event to be posted.
|
|
||||||
|
|
||||||
\return The function returns a tOplkError error code.
|
|
||||||
\retval kErrorOk Function executes correctly
|
|
||||||
\retval other error codes An error occurred
|
|
||||||
|
|
||||||
\ingroup module_eventkcal
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
tOplkError eventkcal_postKernelEvent(const tEvent* pEvent_p)
|
|
||||||
{
|
|
||||||
tOplkError ret;
|
|
||||||
|
|
||||||
ret = eventkcal_postEventCircbuf(kEventQueueKInt, pEvent_p);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Post user event
|
|
||||||
|
|
||||||
This function posts a event to the user queue.
|
|
||||||
|
|
||||||
\param[in] pEvent_p Event to be posted.
|
|
||||||
|
|
||||||
\return The function returns a tOplkError error code.
|
|
||||||
\retval kErrorOk Function executes correctly
|
|
||||||
\retval other error codes An error occurred
|
|
||||||
|
|
||||||
\ingroup module_eventkcal
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
tOplkError eventkcal_postUserEvent(const tEvent* pEvent_p)
|
|
||||||
{
|
|
||||||
tOplkError ret;
|
|
||||||
|
|
||||||
ret = eventkcal_postEventCircbuf(kEventQueueK2U, pEvent_p);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Process function of kernel CAL module
|
|
||||||
|
|
||||||
This function will be called by the systems process function.
|
|
||||||
|
|
||||||
\ingroup module_eventkcal
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
void eventkcal_process(void)
|
|
||||||
{
|
|
||||||
// Nothing to do, because we use threads
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================//
|
|
||||||
// P R I V A T E F U N C T I O N S //
|
|
||||||
//============================================================================//
|
|
||||||
/// \name Private Functions
|
|
||||||
/// \{
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Event handler thread function
|
|
||||||
|
|
||||||
This function contains the main function for the event handler thread.
|
|
||||||
|
|
||||||
\param[in,out] arg Thread parameter. Not used!
|
|
||||||
|
|
||||||
\return The function returns the thread exit code.
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static void* eventThread(void* arg)
|
|
||||||
{
|
|
||||||
UINT32 tickCount;
|
|
||||||
struct timespec curTime, timeout;
|
|
||||||
tEventkCalInstance* pInstance = (tEventkCalInstance*)arg;
|
|
||||||
|
|
||||||
while (!pInstance->fStopThread)
|
|
||||||
{
|
|
||||||
tickCount = target_getTickCount();
|
|
||||||
curTime.tv_sec = tickCount / 1000;
|
|
||||||
curTime.tv_nsec = (tickCount % 1000) * 1000000;
|
|
||||||
timeout.tv_sec = 0;
|
|
||||||
timeout.tv_nsec = 50000 * 1000;
|
|
||||||
TIMESPECADD(&timeout, &curTime);
|
|
||||||
|
|
||||||
if (sem_timedwait(&pInstance->semKernelData, &timeout) == 0)
|
|
||||||
{
|
|
||||||
/* first handle kernel internal events --> higher priority! */
|
|
||||||
if (eventkcal_getEventCountCircbuf(kEventQueueKInt) > 0)
|
|
||||||
{
|
|
||||||
eventkcal_processEventCircbuf(kEventQueueKInt);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (eventkcal_getEventCountCircbuf(kEventQueueU2K) > 0)
|
|
||||||
{
|
|
||||||
eventkcal_processEventCircbuf(kEventQueueU2K);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pInstance->fStopThread = FALSE;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Signal a user event
|
|
||||||
|
|
||||||
This function signals that a user event was posted. It will be registered in
|
|
||||||
the circular buffer library as signal callback function
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static void signalUserEvent(void)
|
|
||||||
{
|
|
||||||
sem_post(&instance_l.semUserData);
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Signal a kernel event
|
|
||||||
|
|
||||||
This function signals that a kernel event was posted. It will be registered in
|
|
||||||
the circular buffer library as signal callback function
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static void signalKernelEvent(void)
|
|
||||||
{
|
|
||||||
sem_post(&instance_l.semKernelData);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \}
|
|
|
@ -1,379 +0,0 @@
|
||||||
/**
|
|
||||||
********************************************************************************
|
|
||||||
\file eventucal-linux.c
|
|
||||||
|
|
||||||
\brief User event CAL module for XiUOS
|
|
||||||
|
|
||||||
This file implements the user event handler CAL module for the Linux
|
|
||||||
userspace platform. It uses the circular buffer interface for all event queues.
|
|
||||||
|
|
||||||
\see eventucalintf-circbuf.c
|
|
||||||
|
|
||||||
\ingroup module_eventucal
|
|
||||||
*******************************************************************************/
|
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------
|
|
||||||
Copyright (c) 2016, B&R Industrial Automation GmbH
|
|
||||||
Copyright (c) 2020, AIIT XUOS Lab
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
* Neither the name of the copyright holders nor the
|
|
||||||
names of its contributors may be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
|
||||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
||||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
------------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// includes
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
#include <common/oplkinc.h>
|
|
||||||
#include <user/eventucal.h>
|
|
||||||
#include <user/eventucalintf.h>
|
|
||||||
#include <common/target.h>
|
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <semaphore.h>
|
|
||||||
#include <common/target.h>
|
|
||||||
|
|
||||||
//============================================================================//
|
|
||||||
// G L O B A L D E F I N I T I O N S //
|
|
||||||
//============================================================================//
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// const defines
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
#define USER_EVENT_THREAD_PRIORITY 45
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// module global vars
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// global function prototypes
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
//============================================================================//
|
|
||||||
// P R I V A T E D E F I N I T I O N S //
|
|
||||||
//============================================================================//
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// const defines
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// local types
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief User event CAL instance type
|
|
||||||
|
|
||||||
The structure contains all necessary information needed by the user event
|
|
||||||
CAL module.
|
|
||||||
*/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
pthread_t threadId;
|
|
||||||
BOOL fStopThread;
|
|
||||||
sem_t semUserData;
|
|
||||||
sem_t semKernelData;
|
|
||||||
BOOL fInitialized;
|
|
||||||
} tEventuCalInstance;
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// local vars
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static tEventuCalInstance instance_l; ///< Instance variable of user event CAL module
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
// local function prototypes
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static void* eventThread(void* arg);
|
|
||||||
static void signalUserEvent(void);
|
|
||||||
static void signalKernelEvent(void);
|
|
||||||
|
|
||||||
//============================================================================//
|
|
||||||
// P U B L I C F U N C T I O N S //
|
|
||||||
//============================================================================//
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Initialize architecture specific stuff of user event CAL module
|
|
||||||
|
|
||||||
The function initializes the architecture specific stuff of the user event
|
|
||||||
CAL module.
|
|
||||||
|
|
||||||
\return The function returns a tOplkError error code.
|
|
||||||
\retval kErrorOk Function executes correctly
|
|
||||||
\retval other error codes An error occurred
|
|
||||||
|
|
||||||
\ingroup module_eventucal
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
tOplkError eventucal_init(void)
|
|
||||||
{
|
|
||||||
struct sched_param schedParam;
|
|
||||||
|
|
||||||
OPLK_MEMSET(&instance_l, 0, sizeof(tEventuCalInstance));
|
|
||||||
|
|
||||||
if (sem_init(&instance_l.semUserData, 0, 0) < 0)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
if (sem_init(&instance_l.semKernelData, 0, 0) < 0)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
if (eventucal_initQueueCircbuf(kEventQueueK2U) != kErrorOk)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
if (eventucal_initQueueCircbuf(kEventQueueU2K) != kErrorOk)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
eventucal_setSignalingCircbuf(kEventQueueU2K, signalKernelEvent);
|
|
||||||
|
|
||||||
if (eventucal_initQueueCircbuf(kEventQueueUInt) != kErrorOk)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
eventucal_setSignalingCircbuf(kEventQueueUInt, signalUserEvent);
|
|
||||||
|
|
||||||
instance_l.fStopThread = FALSE;
|
|
||||||
if (pthread_create(&instance_l.threadId, NULL, eventThread, (void*)&instance_l) != 0)
|
|
||||||
goto Exit;
|
|
||||||
|
|
||||||
schedParam.sched_priority = USER_EVENT_THREAD_PRIORITY;
|
|
||||||
if (pthread_setschedparam(instance_l.threadId, SCHED_FIFO, &schedParam) != 0)
|
|
||||||
{
|
|
||||||
DEBUG_LVL_ERROR_TRACE("%s(): couldn't set thread scheduling parameters! %d\n",
|
|
||||||
__func__,
|
|
||||||
schedParam.sched_priority);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if (defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 12))
|
|
||||||
pthread_setname_np(instance_l.threadId, "oplk-eventu");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
instance_l.fInitialized = TRUE;
|
|
||||||
return kErrorOk;
|
|
||||||
|
|
||||||
Exit:
|
|
||||||
if (instance_l.semUserData >= 0)
|
|
||||||
sem_destroy(&instance_l.semUserData);
|
|
||||||
|
|
||||||
if (instance_l.semKernelData >= 0)
|
|
||||||
sem_destroy(&instance_l.semKernelData);
|
|
||||||
|
|
||||||
eventucal_exitQueueCircbuf(kEventQueueK2U);
|
|
||||||
eventucal_exitQueueCircbuf(kEventQueueU2K);
|
|
||||||
eventucal_exitQueueCircbuf(kEventQueueUInt);
|
|
||||||
|
|
||||||
return kErrorNoResource;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Clean up kernel event CAL module
|
|
||||||
|
|
||||||
The function cleans up the kernel event CAL module. For cleanup it calls the exit
|
|
||||||
functions of the queue implementations for each used queue.
|
|
||||||
|
|
||||||
\return The function returns a tOplkError error code.
|
|
||||||
\retval kErrorOk Function executes correctly
|
|
||||||
\retval other error codes An error occurred
|
|
||||||
|
|
||||||
\ingroup module_eventucal
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
tOplkError eventucal_exit(void)
|
|
||||||
{
|
|
||||||
UINT i = 0;
|
|
||||||
|
|
||||||
if (instance_l.fInitialized != FALSE)
|
|
||||||
{
|
|
||||||
instance_l.fStopThread = TRUE;
|
|
||||||
while (instance_l.fStopThread != FALSE)
|
|
||||||
{
|
|
||||||
target_msleep(10);
|
|
||||||
if (i++ > 100)
|
|
||||||
{
|
|
||||||
DEBUG_LVL_EVENTU_TRACE("%s(): Event thread is not terminating, continue shutdown...!\n",
|
|
||||||
__func__);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
eventucal_exitQueueCircbuf(kEventQueueK2U);
|
|
||||||
eventucal_exitQueueCircbuf(kEventQueueU2K);
|
|
||||||
eventucal_exitQueueCircbuf(kEventQueueUInt);
|
|
||||||
|
|
||||||
sem_destroy(&instance_l.semUserData);
|
|
||||||
sem_destroy(&instance_l.semKernelData);
|
|
||||||
}
|
|
||||||
instance_l.fInitialized = FALSE;
|
|
||||||
|
|
||||||
return kErrorOk;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Post kernel event
|
|
||||||
|
|
||||||
This function posts an event to a queue. It is called from the generic kernel
|
|
||||||
event post function in the event handler. Depending on the sink the appropriate
|
|
||||||
queue post function is called.
|
|
||||||
|
|
||||||
\param[in] pEvent_p Event to be posted.
|
|
||||||
|
|
||||||
\return The function returns a tOplkError error code.
|
|
||||||
\retval kErrorOk Function executes correctly
|
|
||||||
\retval other error codes An error occurred
|
|
||||||
|
|
||||||
\ingroup module_eventucal
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
tOplkError eventucal_postKernelEvent(const tEvent* pEvent_p)
|
|
||||||
{
|
|
||||||
tOplkError ret;
|
|
||||||
|
|
||||||
// Check parameter validity
|
|
||||||
ASSERT(pEvent_p != NULL);
|
|
||||||
|
|
||||||
ret = eventucal_postEventCircbuf(kEventQueueU2K, pEvent_p);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Post user event
|
|
||||||
|
|
||||||
This function posts an event to a queue. It is called from the generic kernel
|
|
||||||
event post function in the event handler. Depending on the sink the appropriate
|
|
||||||
queue post function is called.
|
|
||||||
|
|
||||||
\param[in] pEvent_p Event to be posted.
|
|
||||||
|
|
||||||
\return The function returns a tOplkError error code.
|
|
||||||
\retval kErrorOk Function executes correctly
|
|
||||||
\retval other error codes An error occurred
|
|
||||||
|
|
||||||
\ingroup module_eventucal
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
tOplkError eventucal_postUserEvent(const tEvent* pEvent_p)
|
|
||||||
{
|
|
||||||
tOplkError ret;
|
|
||||||
|
|
||||||
// Check parameter validity
|
|
||||||
ASSERT(pEvent_p != NULL);
|
|
||||||
|
|
||||||
ret = eventucal_postEventCircbuf(kEventQueueUInt, pEvent_p);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Process function of user CAL module
|
|
||||||
|
|
||||||
This function will be called by the system process function.
|
|
||||||
|
|
||||||
\ingroup module_eventucal
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
void eventucal_process(void)
|
|
||||||
{
|
|
||||||
// Nothing to do, because we use threads
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================//
|
|
||||||
// P R I V A T E F U N C T I O N S //
|
|
||||||
//============================================================================//
|
|
||||||
/// \name Private Functions
|
|
||||||
/// \{
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Event handler thread function
|
|
||||||
|
|
||||||
This function contains the main function for the event handler thread.
|
|
||||||
|
|
||||||
\param[in,out] arg Thread parameter. Used to access the module instance.
|
|
||||||
|
|
||||||
\return The function returns the thread exit code.
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static void* eventThread(void* arg)
|
|
||||||
{
|
|
||||||
UINT32 tickCount;
|
|
||||||
struct timespec curTime, timeout;
|
|
||||||
tEventuCalInstance* pInstance = (tEventuCalInstance*)arg;
|
|
||||||
|
|
||||||
while (!pInstance->fStopThread)
|
|
||||||
{
|
|
||||||
tickCount = target_getTickCount();
|
|
||||||
curTime.tv_sec = tickCount / 1000;
|
|
||||||
curTime.tv_nsec = (tickCount % 1000) * 1000000;
|
|
||||||
timeout.tv_sec = 0;
|
|
||||||
timeout.tv_nsec = 50000 * 1000;
|
|
||||||
TIMESPECADD(&timeout, &curTime);
|
|
||||||
|
|
||||||
if (sem_timedwait(&pInstance->semUserData, &timeout) == 0)
|
|
||||||
{
|
|
||||||
/* first handle all user to kernel events --> higher priority! */
|
|
||||||
if (eventucal_getEventCountCircbuf(kEventQueueK2U) > 0)
|
|
||||||
eventucal_processEventCircbuf(kEventQueueK2U);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (eventucal_getEventCountCircbuf(kEventQueueUInt) > 0)
|
|
||||||
eventucal_processEventCircbuf(kEventQueueUInt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pInstance->fStopThread = FALSE;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Signal a user event
|
|
||||||
|
|
||||||
This function signals that a user event has been posted. It will be registered
|
|
||||||
in the circular buffer library as signal callback function.
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static void signalUserEvent(void)
|
|
||||||
{
|
|
||||||
sem_post(&instance_l.semUserData);
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
/**
|
|
||||||
\brief Signal a kernel event
|
|
||||||
|
|
||||||
This function signals that a kernel event has been posted. It will be registered
|
|
||||||
in the circular buffer library as signal callback function.
|
|
||||||
*/
|
|
||||||
//------------------------------------------------------------------------------
|
|
||||||
static void signalKernelEvent(void)
|
|
||||||
{
|
|
||||||
sem_post(&instance_l.semKernelData);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// \}
|
|
Loading…
Reference in New Issue