powerlink: build demo_mn_console and demo_cn_console

This commit is contained in:
Jiacheng Shi 2022-03-26 23:42:30 +08:00
parent b7648f0f08
commit 68179bec6c
21 changed files with 858 additions and 49 deletions

View File

@ -5,3 +5,11 @@ config CONNECTION_ADAPTER_ETHERCAT
if CONNECTION_ADAPTER_ETHERCAT if CONNECTION_ADAPTER_ETHERCAT
source "$APP_DIR/Framework/connection/industrial_ethernet/ethercat/Kconfig" source "$APP_DIR/Framework/connection/industrial_ethernet/ethercat/Kconfig"
endif endif
menuconfig POWERLINK_MN
bool "Using powerlink MN"
default n
menuconfig POWERLINK_CN
bool "Using powerlink CN"
default n

View File

@ -1,3 +1,5 @@
include $(KERNEL_ROOT)/.config
all: COMPILER all: COMPILER
CUR_DIR := $(shell pwd) CUR_DIR := $(shell pwd)
@ -5,19 +7,48 @@ OPLK_ROOT := $(CUR_DIR)/openPOWERLINK
LIBOPLKMN := $(OPLK_ROOT)/stack/lib/xiuos/arm/liboplkmn.a LIBOPLKMN := $(OPLK_ROOT)/stack/lib/xiuos/arm/liboplkmn.a
LIBOPLKCN := $(OPLK_ROOT)/stack/lib/xiuos/arm/liboplkcn.a LIBOPLKCN := $(OPLK_ROOT)/stack/lib/xiuos/arm/liboplkcn.a
LIBOPLK_BUILD_DIR := $(OPLK_ROOT)/stack/build/xiuos LIBOPLK_BUILD_DIR := $(OPLK_ROOT)/stack/build/xiuos
OPLK_DEMO_MN_CONSOLE := $(OPLK_ROOT)/bin/xiuos/arm/demo_mn_console/libdemo_mn_console.a
OPLK_DEMO_CN_CONSOLE := $(OPLK_ROOT)/bin/xiuos/arm/demo_cn_console/libdemo_cn_console.a
OPLK_DEMO_MN_CONSOLE_BUILD_DIR := $(OPLK_ROOT)/apps/demo_mn_console/build/xiuos
OPLK_DEMO_CN_CONSOLE_BUILD_DIR := $(OPLK_ROOT)/apps/demo_cn_console/build/xiuos
OPLK_TOOLCHAIN := $(OPLK_ROOT)/cmake/toolchain-xiuos-arm-none-eabi-gnu.cmake OPLK_TOOLCHAIN := $(OPLK_ROOT)/cmake/toolchain-xiuos-arm-none-eabi-gnu.cmake
define oplk_build
cd $(1) && \
find . ! -name '.' ! -name '.gitignore' -exec rm -rf {} + && \
cmake -DCMAKE_TOOLCHAIN_FILE=$(OPLK_TOOLCHAIN) ../.. && \
cmake --build . --target install
endef
.PHONY: $(LIBOPLKMN) $(LIBOPLKCN) .PHONY: $(LIBOPLKMN) $(LIBOPLKCN)
$(LIBOPLKMN) $(LIBOPLKCN)&: $(LIBOPLKMN) $(LIBOPLKCN)&:
cd $(LIBOPLK_BUILD_DIR) && \ $(call oplk_build,$(LIBOPLK_BUILD_DIR))
rm -rf CMakeFiles proj cmake_install.cmake CMakeCache.txt Makefile && \ $(LIBOPLKMN):
cmake -DCMAKE_TOOLCHAIN_FILE=$(OPLK_TOOLCHAIN) ../.. && \ $(call oplk_build,$(LIBOPLK_BUILD_DIR))
cmake --build . --target install $(LIBOPLKCN):
$(call oplk_build,$(LIBOPLK_BUILD_DIR))
.PHONY: $(OPLK_DEMO_MN_CONSOLE)
$(OPLK_DEMO_MN_CONSOLE):
$(call oplk_build,$(OPLK_DEMO_MN_CONSOLE_BUILD_DIR))
.PHONY: $(OPLK_DEMO_CN_CONSOLE)
$(OPLK_DEMO_CN_CONSOLE):
$(call oplk_build,$(OPLK_DEMO_CN_CONSOLE_BUILD_DIR))
LIBOPLKMN := $(LIBOPLKMN:$(CUR_DIR)/%=%) LIBOPLKMN := $(LIBOPLKMN:$(CUR_DIR)/%=%)
LIBOPLKCN := $(LIBOPLKCN:$(CUR_DIR)/%=%) LIBOPLKCN := $(LIBOPLKCN:$(CUR_DIR)/%=%)
OPLK_DEMO_MN_CONSOLE := $(OPLK_DEMO_MN_CONSOLE:$(CUR_DIR)/%=%)
OPLK_DEMO_CN_CONSOLE := $(OPLK_DEMO_CN_CONSOLE:$(CUR_DIR)/%=%)
SRC_FILES := $(LIBOPLKMN) $(LIBOPLKCN) SRC_FILES := powerlink_demo.c
ifeq ($(CONFIG_POWERLINK_MN)_$(CONFIG_POWERLINK_CN),y_)
SRC_FILES += $(OPLK_DEMO_MN_CONSOLE) $(LIBOPLKMN)
else ifeq ($(CONFIG_POWERLINK_MN)_$(CONFIG_POWERLINK_CN),_y)
SRC_FILES += $(OPLK_DEMO_CN_CONSOLE) $(LIBOPLKCN)
else ifeq ($(CONFIG_POWERLINK_MN)_$(CONFIG_POWERLINK_CN),y_y)
$(error CONFIG_POWERLINK_MN and CONFIG_POWERLINK_CN cannot be enabled simultaneously due to name conflict)
endif
ifeq ($(CONFIG_CONNECTION_ADAPTER_ETHERCAT),y) ifeq ($(CONFIG_CONNECTION_ADAPTER_ETHERCAT),y)
SRC_DIR += ethercat SRC_DIR += ethercat

View File

@ -0,0 +1,98 @@
################################################################################
#
# XiUOS configuration options for openPOWERLINK demo applications
#
# Copyright (c) 2014, B&R Industrial Automation GmbH
# Copyright (c) 2016, kalycito Infotech Private Limited
# 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.
################################################################################
SET(CFG_BUILD_KERNEL_STACK "Link to Application"
CACHE STRING "Configure how to build the kernel stack")
SET(KernelStackBuildTypes
"Link to Application;Linux Userspace Daemon;Linux Kernel Module;Kernel stack on PCIe card;Kernel stack on Zynq PCP;None"
CACHE INTERNAL
"List of possible kernel stack build types")
SET_PROPERTY(CACHE CFG_BUILD_KERNEL_STACK
PROPERTY STRINGS ${KernelStackBuildTypes})
IF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")
SET (CFG_KERNEL_STACK_DIRECTLINK ON CACHE INTERNAL
"Link kernel stack directly into application (Single process solution)")
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Linux Userspace Daemon")
SET (CFG_KERNEL_STACK_USERSPACE_DAEMON ON CACHE INTERNAL
"Build kernel stack as Linux userspace daemon")
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Linux Kernel Module")
SET (CFG_KERNEL_STACK_KERNEL_MODULE ON CACHE INTERNAL
"Build kernel stack as Linux kernelspace module")
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Kernel stack on PCIe card")
SET (CFG_KERNEL_STACK_PCIE_INTF ON CACHE INTERNAL
"Build kernel stack on an external PCIe device")
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "Kernel stack on Zynq PCP")
SET (CFG_KERNEL_STACK_ZYNQ_INTF ON CACHE INTERNAL
"Build kernel stack on an external zynq PCP device")
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
ELSEIF (CFG_BUILD_KERNEL_STACK STREQUAL "None")
UNSET (CFG_KERNEL_STACK_USERSPACE_DAEMON CACHE)
UNSET (CFG_KERNEL_STACK_KERNEL_MODULE CACHE)
UNSET (CFG_KERNEL_STACK_DIRECTLINK CACHE)
UNSET (CFG_KERNEL_STACK_PCIE_INTF CACHE)
UNSET (CFG_KERNEL_STACK_ZYNQ_INTF CACHE)
ENDIF (CFG_BUILD_KERNEL_STACK STREQUAL "Link to Application")

View File

@ -56,6 +56,9 @@ MACRO(FIND_OPLK_LIBRARY OPLK_NODE_TYPE)
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}app-kernelintf) SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}app-kernelintf)
ENDIF (CFG_KERNEL_STACK_DIRECTLINK) ENDIF (CFG_KERNEL_STACK_DIRECTLINK)
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "XiUOS")
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE})
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Generic" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "Microblazeise") ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Generic" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "Microblazeise")
IF (CFG_KERNEL_STACK_DIRECTLINK) IF (CFG_KERNEL_STACK_DIRECTLINK)
SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE}) SET(OPLKLIB_NAME oplk${OPLK_NODE_TYPE})

View File

@ -4,6 +4,7 @@
# #
# Copyright (c) 2016, B&R Industrial Automation GmbH # Copyright (c) 2016, B&R Industrial Automation GmbH
# Copyright (c) 2016, Kalycito Infotech Private Limited # Copyright (c) 2016, Kalycito Infotech Private Limited
# 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
@ -95,6 +96,8 @@ IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
INCLUDE(configure-linux) INCLUDE(configure-linux)
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Windows") ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
INCLUDE(configure-windows) INCLUDE(configure-windows)
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "XiUOS")
INCLUDE(configure-xiuos)
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Generic" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "Microblazeise") ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Generic" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "Microblazeise")
INCLUDE(configure-microblazeise) INCLUDE(configure-microblazeise)
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Generic" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "alterac5arm") ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Generic" AND CMAKE_SYSTEM_PROCESSOR STREQUAL "alterac5arm")

View File

@ -0,0 +1,396 @@
/**
********************************************************************************
\file system-xiuos.c
\brief System specific functions for XiUOS
The file implements the system specific functions for XiUOS used by the
openPOWERLINK demo applications.
\ingroup module_app_common
*******************************************************************************/
/*------------------------------------------------------------------------------
Copyright (c) 2020, AIIT XUOS Lab
Copyright (c) 2016, B&R Industrial Automation GmbH
Copyright (c) 2013, SYSTEC electronic GmbH
Copyright (c) 2013, Kalycito Infotech Private Ltd.
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 <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <pthread.h>
#include <signal.h>
#include <sys/time.h>
#include <trace/trace.h>
#include "system.h"
#include <xizi.h>
//============================================================================//
// G L O B A L D E F I N I T I O N S //
//============================================================================//
//------------------------------------------------------------------------------
// const defines
//------------------------------------------------------------------------------
#define SET_CPU_AFFINITY
#define MAIN_THREAD_PRIORITY 20
//------------------------------------------------------------------------------
// 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
//------------------------------------------------------------------------------
#if defined(CONFIG_USE_SYNCTHREAD)
typedef struct
{
tSyncCb pfnSyncCb;
BOOL fTerminate;
} tSyncThreadInstance;
#endif
typedef struct
{
tFirmwareManagerThreadCb pfnFwmCb;
BOOL fTerminate;
unsigned int interval;
} tFwmThreadInstance;
//------------------------------------------------------------------------------
// local vars
//------------------------------------------------------------------------------
static BOOL fTermSignalReceived_l = FALSE;
#if defined(CONFIG_USE_SYNCTHREAD)
static pthread_t syncThreadId_l;
static tSyncThreadInstance syncThreadInstance_l;
#endif
static tFwmThreadInstance fwmThreadInstance_l;
//------------------------------------------------------------------------------
// local function prototypes
//------------------------------------------------------------------------------
#if defined(CONFIG_USE_SYNCTHREAD)
static void* powerlinkSyncThread(void* arg);
#endif
static void* firmwareManagerThread(void* arg);
//============================================================================//
// P U B L I C F U N C T I O N S //
//============================================================================//
//------------------------------------------------------------------------------
/**
\brief Initialize system
The function initializes important stuff on the system for openPOWERLINK to
work correctly.
\return The function returns 0 if the initialization has been successful,
otherwise -1.
\ingroup module_app_common
*/
//------------------------------------------------------------------------------
int system_init(void)
{
struct sched_param schedParam;
schedParam.sched_priority = MAIN_THREAD_PRIORITY;
if (pthread_setschedparam(pthread_self(), SCHED_RR, &schedParam) != 0)
{
TRACE("%s() couldn't set thread scheduling parameters! %d\n",
__func__,
schedParam.sched_priority);
}
return 0;
}
//------------------------------------------------------------------------------
/**
\brief Shutdown system
The function shuts down the system.
\ingroup module_app_common
*/
//------------------------------------------------------------------------------
void system_exit(void)
{
}
//------------------------------------------------------------------------------
/**
\brief Determines whether a termination signal has been received
The function can be used by the application to react on termination request.
\ingroup module_app_common
*/
//------------------------------------------------------------------------------
BOOL system_getTermSignalState(void)
{
return fTermSignalReceived_l;
}
//------------------------------------------------------------------------------
/**
\brief Sleep for the specified number of milliseconds
The function makes the calling thread sleep until the number of specified
milliseconds has elapsed.
\param[in] milliSeconds_p Number of milliseconds to sleep
\ingroup module_app_common
*/
//------------------------------------------------------------------------------
void system_msleep(unsigned int milliSeconds_p)
{
struct timeval timeout;
fd_set readFds;
int maxFd;
int selectRetVal;
unsigned int seconds;
unsigned int microSeconds;
// initialize file descriptor set
maxFd = 0 + 1;
FD_ZERO(&readFds);
// Calculate timeout values
seconds = milliSeconds_p / 1000;
microSeconds = (milliSeconds_p - (seconds * 1000)) * 1000;
// initialize timeout value
timeout.tv_sec = seconds;
timeout.tv_usec = microSeconds;
selectRetVal = select(maxFd, &readFds, NULL, NULL, &timeout);
switch (selectRetVal)
{
case 0: // select timeout occurred, no packet received
break;
case -1: // select error occurred
break;
default: // packet available for receive
break;
}
}
#if defined(CONFIG_USE_SYNCTHREAD)
//------------------------------------------------------------------------------
/**
\brief Start synchronous data thread
The function starts the thread used for synchronous data handling.
\param[in] pfnSync_p Pointer to sync callback function
\ingroup module_app_common
*/
//------------------------------------------------------------------------------
void system_startSyncThread(tSyncCb pfnSync_p)
{
int ret;
syncThreadInstance_l.pfnSyncCb = pfnSync_p;
syncThreadInstance_l.fTerminate = FALSE;
// create sync thread
ret = pthread_create(&syncThreadId_l,
NULL,
&powerlinkSyncThread,
&syncThreadInstance_l);
if (ret != 0)
{
fprintf(stderr, "pthread_create() failed with \"%d\"\n", ret);
return;
}
#if (defined(__GLIBC__) && (__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 12))
pthread_setname_np(syncThreadId_l, "oplkdemo-sync");
#endif
}
//------------------------------------------------------------------------------
/**
\brief Stop synchronous data thread
The function stops the thread used for synchronous data handling.
\ingroup module_app_common
*/
//------------------------------------------------------------------------------
void system_stopSyncThread(void)
{
syncThreadInstance_l.fTerminate = TRUE;
}
#endif
//------------------------------------------------------------------------------
/**
\brief Start firmware manager thread
The function starts the thread used by the firmware manager.
\param[in] pfnFwmThreadCb_p Pointer to firmware manager callback
\param[in] intervalSec_p Thread execution interval in seconds
\ingroup module_app_common
*/
//------------------------------------------------------------------------------
void system_startFirmwareManagerThread(tFirmwareManagerThreadCb pfnFwmThreadCb_p,
unsigned int intervalSec_p)
{
int ret;
pthread_t thread;
struct sched_param schedParam;
fwmThreadInstance_l.fTerminate = FALSE;
fwmThreadInstance_l.pfnFwmCb = pfnFwmThreadCb_p;
fwmThreadInstance_l.interval = intervalSec_p;
ret = pthread_create(&thread, NULL, firmwareManagerThread, &fwmThreadInstance_l);
if (ret != 0)
{
fprintf(stderr, "%s() pthread_create() failed with \"%d\"\n",
__func__,
ret);
return;
}
schedParam.sched_priority = 0;
if (pthread_setschedparam(thread, SCHED_IDLE, &schedParam) != 0)
{
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(thread, "oplkdemo-fwm");
#endif
}
//------------------------------------------------------------------------------
/**
\brief Stop firmware manager thread
The function stops the thread used by the firmware manager.
\ingroup module_app_common
*/
//------------------------------------------------------------------------------
void system_stopFirmwareManagerThread(void)
{
fwmThreadInstance_l.fTerminate = TRUE;
}
//============================================================================//
// P R I V A T E F U N C T I O N S //
//============================================================================//
/// \name Private Functions
/// \{
//------------------------------------------------------------------------------
#if defined(CONFIG_USE_SYNCTHREAD)
//------------------------------------------------------------------------------
/**
\brief Synchronous application thread
This function implements the synchronous application thread.
\param[in,out] arg Needed for thread interface not used
*/
//------------------------------------------------------------------------------
static void* powerlinkSyncThread(void* arg)
{
tSyncThreadInstance* pSyncThreadInstance = (tSyncThreadInstance*)arg;
printf("Synchronous data thread is starting...\n");
while (!pSyncThreadInstance->fTerminate)
{
pSyncThreadInstance->pfnSyncCb();
}
printf("Synchronous data thread is terminating...\n");
return NULL;
}
#endif
//------------------------------------------------------------------------------
/**
\brief Firmware manager thread
This function implements the firmware manager thread.
\param[in,out] arg Needed for thread interface not used
*/
//------------------------------------------------------------------------------
static void* firmwareManagerThread(void* arg)
{
tFwmThreadInstance* pInstance = (tFwmThreadInstance*)arg;
while (!pInstance->fTerminate)
{
pInstance->pfnFwmCb();
DelayKTask(pInstance->interval * 1000);
}
return NULL;
}
/// \}

View File

@ -112,6 +112,8 @@ IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
include(linux.cmake) include(linux.cmake)
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Windows") ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
include (windows.cmake) include (windows.cmake)
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "XiUOS")
include(xiuos.cmake)
ELSE() ELSE()
MESSAGE(FATAL_ERROR "System ${CMAKE_SYSTEM_NAME} is not supported!") MESSAGE(FATAL_ERROR "System ${CMAKE_SYSTEM_NAME} is not supported!")
ENDIF() ENDIF()
@ -131,7 +133,11 @@ SOURCE_GROUP("Object Dictionary" FILES
################################################################################ ################################################################################
# Set the executable # Set the executable
ADD_EXECUTABLE(demo_cn_console ${DEMO_SOURCES} ${DEMO_ARCH_SOURCES}) IF(CMAKE_SYSTEM_NAME STREQUAL "XiUOS")
ADD_LIBRARY(demo_cn_console STATIC ${DEMO_SOURCES} ${DEMO_ARCH_SOURCES})
ELSE()
ADD_EXECUTABLE(demo_cn_console ${DEMO_SOURCES} ${DEMO_ARCH_SOURCES})
ENDIF()
SET_PROPERTY(TARGET demo_cn_console SET_PROPERTY(TARGET demo_cn_console
PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUG;DEF_DEBUG_LVL=${CFG_DEBUG_LVL}) PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUG;DEF_DEBUG_LVL=${CFG_DEBUG_LVL})
@ -144,4 +150,4 @@ TARGET_LINK_LIBRARIES(demo_cn_console ${ARCH_LIBRARIES})
################################################################################ ################################################################################
# Installation rules # Installation rules
INSTALL(TARGETS demo_cn_console RUNTIME DESTINATION ${PROJECT_NAME}) INSTALL(TARGETS demo_cn_console DESTINATION ${PROJECT_NAME})

View File

@ -142,7 +142,11 @@ This is the main function of the openPOWERLINK console CN demo application.
\ingroup module_demo_cn_console \ingroup module_demo_cn_console
*/ */
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#ifdef __XIUOS__
int OplkDemoCnConsole(int argc, char* argv[])
#else
int main(int argc, char* argv[]) int main(int argc, char* argv[])
#endif
{ {
tOplkError ret = kErrorOk; tOplkError ret = kErrorOk;
tOptions opts; tOptions opts;

View File

@ -0,0 +1,78 @@
################################################################################
#
# XiUOS definitions for console CN demo application
#
# 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.
################################################################################
################################################################################
# Set architecture specific definitions
ADD_DEFINITIONS(-D__XIUOS__ -D_GNU_SOURCE -D_POSIX_C_SOURCE=200112L)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic -std=c99")
################################################################################
# Set architecture specific sources and include directories
SET (DEMO_ARCH_SOURCES
${COMMON_SOURCE_DIR}/system/system-xiuos.c
${CONTRIB_SOURCE_DIR}/console/console-xiuos.c
${CONTRIB_SOURCE_DIR}/trace/trace-printf.c
)
################################################################################
# Set architecture specific libraries
IF (NOT CFG_COMPILE_SHARED_LIBRARY)
SET(PCAP_CONFIG_OPTS --static)
ENDIF()
IF (CFG_KERNEL_STACK_DIRECTLINK OR CFG_KERNEL_STACK_USERSPACE_DAEMON)
FIND_PROGRAM(PCAP_CONFIG NAMES pcap-config PATHS)
IF (PCAP_CONFIG)
MESSAGE (STATUS "Looking for pcap-config... ${PCAP_CONFIG}")
EXECUTE_PROCESS (COMMAND ${PCAP_CONFIG} --libs ${PCAP_CONFIG_OPTS}
OUTPUT_VARIABLE PCAP_LDFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
EXECUTE_PROCESS (COMMAND ${PCAP_CONFIG} --cflags ${PCAP_CONFIG_OPTS}
OUTPUT_VARIABLE PCAP_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
SET (ARCH_LIBRARIES ${ARCH_LIBRARIES} ${PCAP_LDFLAGS})
ELSE (PCAP_CONFIG)
MESSAGE (STATUS "pcap-config not found, using defaults...")
SET (ARCH_LIBRARIES ${ARCH_LIBRARIES} pcap)
ENDIF (PCAP_CONFIG)
ENDIF (CFG_KERNEL_STACK_DIRECTLINK OR CFG_KERNEL_STACK_USERSPACE_DAEMON)
SET (ARCH_LIBRARIES ${ARCH_LIBRARIES} pthread rt)
################################################################################
# Set architecture specific installation files
INSTALL(PROGRAMS ${TOOLS_DIR}/linux/set_prio DESTINATION ${PROJECT_NAME})

View File

@ -4,6 +4,7 @@
# #
# Copyright (c) 2017, B&R Industrial Automation GmbH # Copyright (c) 2017, B&R Industrial Automation GmbH
# Copyright (c) 2016, Kalycito Infotech Private Limited # Copyright (c) 2016, Kalycito Infotech Private Limited
# 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
@ -126,6 +127,8 @@ IF(CMAKE_SYSTEM_NAME STREQUAL "Linux")
include(linux.cmake) include(linux.cmake)
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Windows") ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "Windows")
include (windows.cmake) include (windows.cmake)
ELSEIF(CMAKE_SYSTEM_NAME STREQUAL "XiUOS")
include(xiuos.cmake)
ELSE() ELSE()
MESSAGE(FATAL_ERROR "System ${CMAKE_SYSTEM_NAME} is not supported!") MESSAGE(FATAL_ERROR "System ${CMAKE_SYSTEM_NAME} is not supported!")
ENDIF() ENDIF()
@ -146,7 +149,11 @@ SOURCE_GROUP("Object Dictionary" FILES
################################################################################ ################################################################################
# Set the executable # Set the executable
ADD_EXECUTABLE(demo_mn_console ${DEMO_SOURCES} ${DEMO_ARCH_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/mnobd.cdc) IF(CMAKE_SYSTEM_NAME STREQUAL "XiUOS")
ADD_LIBRARY(demo_mn_console ${DEMO_SOURCES} ${DEMO_ARCH_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/mnobd.cdc)
ELSE()
ADD_EXECUTABLE(demo_mn_console ${DEMO_SOURCES} ${DEMO_ARCH_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/mnobd.cdc)
ENDIF()
SET_PROPERTY(TARGET demo_mn_console SET_PROPERTY(TARGET demo_mn_console
PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUG;DEF_DEBUG_LVL=${CFG_DEBUG_LVL}) PROPERTY COMPILE_DEFINITIONS_DEBUG DEBUG;DEF_DEBUG_LVL=${CFG_DEBUG_LVL})
@ -164,5 +171,5 @@ TARGET_LINK_LIBRARIES(demo_mn_console ${ARCH_LIBRARIES})
################################################################################ ################################################################################
# Installation rules # Installation rules
INSTALL(TARGETS demo_mn_console RUNTIME DESTINATION ${PROJECT_NAME}) INSTALL(TARGETS demo_mn_console DESTINATION ${PROJECT_NAME})
INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/mnobd.cdc DESTINATION ${PROJECT_NAME}) INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/mnobd.cdc DESTINATION ${PROJECT_NAME})

View File

@ -151,7 +151,11 @@ This is the main function of the openPOWERLINK console MN demo application.
\ingroup module_demo_mn_console \ingroup module_demo_mn_console
*/ */
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#ifdef __XIUOS__
int OplkDemoMnConsole(int argc, char* argv[])
#else
int main(int argc, char* argv[]) int main(int argc, char* argv[])
#endif
{ {
tOplkError ret = kErrorOk; tOplkError ret = kErrorOk;
tOptions opts; tOptions opts;

View File

@ -0,0 +1,78 @@
################################################################################
#
# XiUOS definitions for demo_mn_console application
#
# Copyright (c) 2017, 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.
################################################################################
################################################################################
# Set architecture specific definitions
ADD_DEFINITIONS(-D__XIUOS__ -D_GNU_SOURCE -D_POSIX_C_SOURCE=200112L)
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pedantic -std=c99")
################################################################################
# Set architecture specific sources and include directories
SET (DEMO_ARCH_SOURCES
${COMMON_SOURCE_DIR}/system/system-xiuos.c
${CONTRIB_SOURCE_DIR}/console/console-xiuos.c
${CONTRIB_SOURCE_DIR}/trace/trace-printf.c
)
################################################################################
# Set architecture specific libraries
IF (NOT CFG_COMPILE_SHARED_LIBRARY)
SET(PCAP_CONFIG_OPTS --static)
ENDIF()
IF (CFG_KERNEL_STACK_DIRECTLINK OR CFG_KERNEL_STACK_USERSPACE_DAEMON)
FIND_PROGRAM(PCAP_CONFIG NAMES pcap-config PATHS)
IF (PCAP_CONFIG)
MESSAGE (STATUS "Looking for pcap-config... ${PCAP_CONFIG}")
EXECUTE_PROCESS (COMMAND ${PCAP_CONFIG} --libs ${PCAP_CONFIG_OPTS}
OUTPUT_VARIABLE PCAP_LDFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
EXECUTE_PROCESS (COMMAND ${PCAP_CONFIG} --cflags ${PCAP_CONFIG_OPTS}
OUTPUT_VARIABLE PCAP_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE)
SET (ARCH_LIBRARIES ${ARCH_LIBRARIES} ${PCAP_LDFLAGS})
ELSE (PCAP_CONFIG)
MESSAGE (STATUS "pcap-config not found, using defaults...")
SET (ARCH_LIBRARIES ${ARCH_LIBRARIES} pcap)
ENDIF (PCAP_CONFIG)
ENDIF (CFG_KERNEL_STACK_DIRECTLINK OR CFG_KERNEL_STACK_USERSPACE_DAEMON)
SET (ARCH_LIBRARIES ${ARCH_LIBRARIES} pthread rt)
################################################################################
# Set architecture specific installation files
INSTALL(PROGRAMS ${TOOLS_DIR}/linux/set_prio DESTINATION ${PROJECT_NAME})

View File

@ -0,0 +1,82 @@
/**
********************************************************************************
\file console-xiuos.c
\brief Console input/output implementation for XiUOS
This file contains the console input/output implementation for XiUOS.
\ingroup module_console
*******************************************************************************/
/*------------------------------------------------------------------------------
Copyright (c) 2016, B&R Industrial Automation GmbH
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 <stdio.h>
#include <unistd.h>
#include <fcntl.h>
//============================================================================//
// P U B L I C F U N C T I O N S //
//============================================================================//
//------------------------------------------------------------------------------
/**
\brief Get character from console
This function reads a character from the console input. It uses the
termios library.
\return The function returns the read character.
\ingroup module_console
*/
//------------------------------------------------------------------------------
int console_getch(void)
{
return getchar();
}
//------------------------------------------------------------------------------
/**
\brief Detecting a keystroke
The function checks the console for a keystroke.
\return The function returns 0 if no key has been pressed or 1 if a key has
been pressed.
\ingroup module_console
*/
//------------------------------------------------------------------------------
int console_kbhit(void)
{
return 1;
}

View File

@ -51,6 +51,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <time.h> #include <time.h>
#include <sys/time.h> #include <sys/time.h>
#include <xizi.h>
#include <transform.h> #include <transform.h>
//============================================================================// //============================================================================//
@ -136,37 +137,7 @@ milliseconds has elapsed.
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
void target_msleep(UINT32 milliSeconds_p) void target_msleep(UINT32 milliSeconds_p)
{ {
struct timeval timeout; DelayKTask(milliSeconds_p);
fd_set readFds;
int maxFd;
int selectRetVal;
unsigned int seconds;
unsigned int microSeconds;
// initialize file descriptor set
maxFd = 0 + 1;
FD_ZERO(&readFds);
// Calculate timeout values
seconds = milliSeconds_p / 1000;
microSeconds = (milliSeconds_p - (seconds * 1000)) * 1000;
// initialize timeout value
timeout.tv_sec = seconds;
timeout.tv_usec = microSeconds;
selectRetVal = select(maxFd, &readFds, NULL, NULL, &timeout);
switch (selectRetVal)
{
case 0: // select timeout occurred, no packet received
break;
case -1: // select error occurred
break;
default: // packet available for receive
break;
}
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------

View File

@ -229,7 +229,7 @@ tOplkError edrv_exit(void)
edrvInstance_l.fStartCommunication = FALSE; edrvInstance_l.fStartCommunication = FALSE;
// Wait to terminate thread safely // Wait to terminate thread safely
usleep(100000); target_msleep(100);
if (edrvInstance_l.fThreadIsExited) if (edrvInstance_l.fThreadIsExited)
pthread_cancel(edrvInstance_l.hThread); pthread_cancel(edrvInstance_l.hThread);

View File

@ -461,7 +461,6 @@ flag m_fContinue is set the thread loops until the timer is deleted.
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
static void* timerThread(void* pArgument_p) static void* timerThread(void* pArgument_p)
{ {
int iRet;
tHresTimerInfo* pTimerInfo; tHresTimerInfo* pTimerInfo;
struct timespec startTime, timeout; struct timespec startTime, timeout;
ULONGLONG period; ULONGLONG period;
@ -504,13 +503,7 @@ static void* timerThread(void* pArgument_p)
do do
{ {
/* sleep until timeout */ /* sleep until timeout */
iRet = usleep(period / 1000); target_msleep(period / 1000000);
if (iRet < 0)
{
DEBUG_LVL_ERROR_TRACE("%s(): Error in clock_nanosleep!\n",
__func__);
/* todo how to signal that timeout wasn't correct? */
}
FTRACE_MARKER("HighReskTimer(%d) expired (%d ns)", FTRACE_MARKER("HighReskTimer(%d) expired (%d ns)",
(int)pArgument_p, period); (int)pArgument_p, period);

View File

@ -0,0 +1,28 @@
#include <xizi.h>
#include <xsconfig.h>
#ifdef POWERLINK_MN
extern int OplkDemoMnConsole(int argc, char *argv[]);
SHELL_EXPORT_CMD(
SHELL_CMD_PERMISSION(0) |
SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) |
SHELL_CMD_PARAM_NUM(0) |
SHELL_CMD_DISABLE_RETURN,
OplkDemoMnConsole,
OplkDemoMnConsole,
openPOWERLINK demo MN (console version));
#endif
#ifdef POWERLINK_CN
extern int OplkDemoCnConsole(int argc, char *argv[]);
SHELL_EXPORT_CMD(
SHELL_CMD_PERMISSION(0) |
SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN) |
SHELL_CMD_PARAM_NUM(0) |
SHELL_CMD_DISABLE_RETURN,
OplkDemoCnConsole,
OplkDemoCnConsole,
openPOWERLINK demo CN (console version));
#endif

View File

@ -67,6 +67,7 @@ typedef int pid_t;
#define SCHED_OTHER 0 #define SCHED_OTHER 0
#define SCHED_FIFO 1 #define SCHED_FIFO 1
#define SCHED_RR 2 #define SCHED_RR 2
#define SCHED_IDLE 5
/* function in pthread.c */ /* function in pthread.c */
int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void)); int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(void));

View File

@ -67,6 +67,12 @@ pthread_t pthread_self(void){
return pthread; return pthread;
} }
int pthread_setschedparam(pthread_t thread, int policy,
const struct sched_param *pParam)
{
return 0;
}
int pthread_setschedprio(pthread_t thread, int prio) int pthread_setschedprio(pthread_t thread, int prio)
{ {
//add syscall //add syscall
@ -98,6 +104,11 @@ int pthread_setcanceltype(int type, int *oldtype)
return -1; return -1;
} }
int pthread_join(pthread_t thread, void **retval)
{
return -1;
}
int pthread_kill(pthread_t thread, int sig) int pthread_kill(pthread_t thread, int sig)
{ {
/* This api should not be used, and will not be supported */ /* This api should not be used, and will not be supported */