From 458a7c5d91e8d4c30773c06ce7de770b545b6003 Mon Sep 17 00:00:00 2001 From: Jiacheng Shi Date: Sun, 27 Mar 2022 22:47:28 +0800 Subject: [PATCH] powerlink: run the basic part of demo_cn_console --- .../apps/common/src/netselect/netselect.c | 5 + .../apps/demo_cn_console/src/main.c | 5 + .../apps/demo_mn_console/src/main.c | 5 + .../contrib/console/console-xiuos.c | 8 +- .../stack/cmake/stackfiles.cmake | 10 - .../stack/proj/xiuos/liboplkcn/CMakeLists.txt | 4 +- .../stack/proj/xiuos/liboplkcn/oplkcfg.h | 13 + .../stack/proj/xiuos/liboplkmn/CMakeLists.txt | 4 +- .../stack/proj/xiuos/liboplkmn/oplkcfg.h | 8 + .../stack/src/arch/xiuos/netif-xiuos.c | 13 +- .../stack/src/kernel/event/eventkcal-xiuos.c | 377 ----------------- .../stack/src/user/event/eventucal-xiuos.c | 379 ------------------ 12 files changed, 58 insertions(+), 773 deletions(-) delete mode 100644 APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/kernel/event/eventkcal-xiuos.c delete mode 100644 APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/user/event/eventucal-xiuos.c diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/common/src/netselect/netselect.c b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/common/src/netselect/netselect.c index 802922d6c..70e0722e0 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/common/src/netselect/netselect.c +++ b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/common/src/netselect/netselect.c @@ -128,10 +128,15 @@ int netselect_selectNetworkInterface(char* pDevName_p, size_t maxLen_p) printf("--------------------------------------------------\n"); 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) { return -1; } +#endif printf("--------------------------------------------------\n"); if ((num < 1) || (num > i)) diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/demo_cn_console/src/main.c b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/demo_cn_console/src/main.c index a7ca266d9..c1662e0e2 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/demo_cn_console/src/main.c +++ b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/demo_cn_console/src/main.c @@ -387,6 +387,11 @@ static void loopMain(void) // wait for key hit while (!fExit) { +#ifdef __XIUOS__ + ret = oplk_process(); + if (ret != kErrorOk) + return; +#endif if (console_kbhit()) { cKey = (char)console_getch(); diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/demo_mn_console/src/main.c b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/demo_mn_console/src/main.c index ff522965d..39492aede 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/demo_mn_console/src/main.c +++ b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/apps/demo_mn_console/src/main.c @@ -421,6 +421,11 @@ static void loopMain(void) while (!fExit) { +#ifdef __XIUOS__ + ret = oplk_process(); + if (ret != kErrorOk) + return; +#endif if (console_kbhit()) { cKey = (char)console_getch(); diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/contrib/console/console-xiuos.c b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/contrib/console/console-xiuos.c index f53b6d726..394f6fda4 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/contrib/console/console-xiuos.c +++ b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/contrib/console/console-xiuos.c @@ -11,6 +11,7 @@ This file contains the console input/output implementation for XiUOS. /*------------------------------------------------------------------------------ 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 @@ -42,6 +43,9 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include #include +// #include + +#include //============================================================================// // 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) { - return getchar(); + return 'p'; } //------------------------------------------------------------------------------ @@ -78,5 +82,5 @@ The function checks the console for a keystroke. //------------------------------------------------------------------------------ int console_kbhit(void) { - return 1; + return 0; } diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/cmake/stackfiles.cmake b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/cmake/stackfiles.cmake index c850e3b5c..a4544bada 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/cmake/stackfiles.cmake +++ b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/cmake/stackfiles.cmake @@ -221,11 +221,6 @@ SET(EVENT_UCAL_LINUXUSER_SOURCES ${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 ${USER_SOURCE_DIR}/event/eventucal-linuxioctl.c ) @@ -402,11 +397,6 @@ SET(EVENT_KCAL_WINDOWS_SOURCES ${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 ${KERNEL_SOURCE_DIR}/event/eventkcal-linuxkernel.c ${KERNEL_SOURCE_DIR}/event/eventkcalintf-circbuf.c diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkcn/CMakeLists.txt b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkcn/CMakeLists.txt index 1358d603a..38e1cda56 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkcn/CMakeLists.txt +++ b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkcn/CMakeLists.txt @@ -46,14 +46,14 @@ SET (LIB_SOURCES ${CTRL_UCAL_DIRECT_SOURCES} ${DLL_UCAL_CIRCBUF_SOURCES} ${ERRHND_UCAL_LOCAL_SOURCES} - ${EVENT_UCAL_XIUOS_SOURCES} + ${EVENT_UCAL_NOOSKERNEL_SOURCES} ${PDO_UCAL_LOCAL_SOURCES} ${USER_TIMER_XIUOS_SOURCES} ${KERNEL_SOURCES} ${CTRL_KCAL_DIRECT_SOURCES} ${DLL_KCAL_CIRCBUF_SOURCES} ${ERRHND_KCAL_LOCAL_SOURCES} - ${EVENT_KCAL_XIUOS_SOURCES} + ${EVENT_KCAL_NOOSKERNEL_SOURCES} ${PDO_KCAL_LOCAL_SOURCES} ${COMMON_SOURCES} ${COMMON_LINUXUSER_SOURCES} diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkcn/oplkcfg.h b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkcn/oplkcfg.h index 297c77429..2382f629a 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkcn/oplkcfg.h +++ b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkcn/oplkcfg.h @@ -131,4 +131,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // 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_ diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkmn/CMakeLists.txt b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkmn/CMakeLists.txt index 7a513cedb..33b55e628 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkmn/CMakeLists.txt +++ b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkmn/CMakeLists.txt @@ -47,14 +47,14 @@ SET (LIB_SOURCES ${CTRL_UCAL_DIRECT_SOURCES} ${DLL_UCAL_CIRCBUF_SOURCES} ${ERRHND_UCAL_LOCAL_SOURCES} - ${EVENT_UCAL_XIUOS_SOURCES} + ${EVENT_UCAL_NOOSKERNEL_SOURCES} ${PDO_UCAL_LOCAL_SOURCES} ${USER_TIMER_XIUOS_SOURCES} ${KERNEL_SOURCES} ${CTRL_KCAL_DIRECT_SOURCES} ${DLL_KCAL_CIRCBUF_SOURCES} ${ERRHND_KCAL_LOCAL_SOURCES} - ${EVENT_KCAL_XIUOS_SOURCES} + ${EVENT_KCAL_NOOSKERNEL_SOURCES} ${PDO_KCAL_LOCAL_SOURCES} ${COMMON_SOURCES} ${COMMON_LINUXUSER_SOURCES} diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkmn/oplkcfg.h b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkmn/oplkcfg.h index 70f458a3e..4c1b876fb 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkmn/oplkcfg.h +++ b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/proj/xiuos/liboplkmn/oplkcfg.h @@ -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_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_ diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/arch/xiuos/netif-xiuos.c b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/arch/xiuos/netif-xiuos.c index bab688641..95cf8d402 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/arch/xiuos/netif-xiuos.c +++ b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/arch/xiuos/netif-xiuos.c @@ -110,7 +110,18 @@ tOplkError target_enumerateNetworkInterfaces(tNetIfId* pInterfaces_p, { UNUSED_PARAMETER(pInterfaces_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; } //============================================================================// diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/kernel/event/eventkcal-xiuos.c b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/kernel/event/eventkcal-xiuos.c deleted file mode 100644 index b010b758c..000000000 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/kernel/event/eventkcal-xiuos.c +++ /dev/null @@ -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 -#include -#include -#include - -#include -#include -#include -#include -#include - -//============================================================================// -// 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); -} - -/// \} diff --git a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/user/event/eventucal-xiuos.c b/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/user/event/eventucal-xiuos.c deleted file mode 100644 index 418e8b782..000000000 --- a/APP_Framework/Framework/connection/industrial_ethernet/openPOWERLINK/stack/src/user/event/eventucal-xiuos.c +++ /dev/null @@ -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 -#include -#include -#include - -#include -#include -#include -#include -#include - -//============================================================================// -// 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); -} - -/// \}