EtherCAT Slave  1.06.01
EtherCAT_Slave_Simple.c

EtherCAT® Slave Example Application.

Author
KUNBUS GmbH
Date
2021-05-18
/* this one shall the only one to be using it ! */
#include "project.h"
#include "ecSlvSimple.h"
#if (defined DPRAM_REMOTE) && (DPRAM_REMOTE==1)
#include <DPR_Api.h>
/* DPR implementation */
#if (defined DPRIMPL_SHAREDRAM) && (DPRIMPL_SHAREDRAM==1)
/* Shared RAM not TriPort */
#include <dprLib_sharedMemory.h>
#endif
#elif (defined FBTL_REMOTE) && (FBTL_REMOTE==1)
#include <sysLib_sharedMemory.h>
#include <FBTL_api.h>
#endif
/* OS */
#include <osal.h>
/* ESL */
#include <ESL_os.h>
#include <ESL_BOARD_config.h>
#include <ESL_version.h>
/* stack */
#include <ecSlvApi.h>
#define TIESC_HW 0
#define PRU_200MHZ 1
#define THREAD_IDLE_TIMEOUT (100U) /* 100msec idle timeout */
static OSAL_PJumpBuf_t farJumpBuf_g;
static uint32_t EC_SLV_APP_remoteInit(EC_SLV_APP_Sapplication_t* pApplicationInstance_p);
void EC_SLV_APP_loopTask(void* pArg_p)
{
EC_SLV_APP_Sapplication_t* pApplicationInstance = (EC_SLV_APP_Sapplication_t*)pArg_p;
uint32_t error = EC_API_eERR_NONE;
if (!pApplicationInstance)
{
goto Exit;
}
EC_SLV_APP_initBoardFunctions(pApplicationInstance);
error = EC_API_SLV_stackInit(); // EtherCAT stack init
if (error != EC_API_eERR_NONE)
{
OSAL_printf("%s:%d (%s) Error code: 0x%08x\r\n", __FUNCTION__, __LINE__, __FUNCTION__, error);
OSAL_error(__FUNCTION__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
EC_SLV_APP_applicationInit(pApplicationInstance);
/* spit out versions */
ESL_dumpVersions();
//RAN 2021
for(;;)
{
{
OSAL_SCHED_yield();
}
else
{
/* for carve up give some air */
OSAL_SCHED_sleep(10);
}
}
// not reachable
//EC_SLV_APP_applicationDeInit();
Exit:
ESL_OS_taskLeave();
return;
}
void EC_SLV_APP_mainTask(void* pArg_p)
{
EC_SLV_APP_Sapplication_t* applicationInstance = (EC_SLV_APP_Sapplication_t*)pArg_p;
uint32_t retVal = OSAL_eERR_NOERROR;
if (!applicationInstance)
{
OSAL_error(__FUNCTION__, __LINE__, OSAL_eERR_EINVAL, true, 1, "Application instance missing!!!\r\n");
}
retVal = ESL_OS_boardInit(applicationInstance->selectedPruInstance);
if (OSAL_eERR_NOERROR != retVal)
{
OSAL_error(__FUNCTION__, __LINE__, retVal, true, 1, "OS Board init error\r\n");
}
OSAL_registerPrintOut(NULL, ESL_OS_printf);
retVal = EC_SLV_APP_remoteInit(applicationInstance);
if (!(OSAL_CONTAINER_LOCALIMPLEMENTATION == retVal || OSAL_eERR_NOERROR == retVal))
{
OSAL_error(__FUNCTION__, __LINE__, OSAL_eERR_EINVAL, true, 1, "Fatal error remote API init!!!\r\n");
return;
}
retVal = EC_API_SLV_load(&farJumpBuf_g, NULL /* &applErrHandler*/, applicationInstance->selectedPruInstance);
if (0 == retVal)
{
EC_API_SLV_prepareTasks(KBECSLV_PRIO_PDI, KBECSLV_PRIO_LED, KBECSLV_PRIO_SYNC0, KBECSLV_PRIO_SYNC1, KBECSLV_PRIO_EOE);
applicationInstance->loopThreadHandle = OSAL_SCHED_startTask(EC_SLV_APP_loopTask
,applicationInstance
,OSAL_TASK_ePRIO_Normal
,(uint8_t*)EC_SLV_APP_applLoopTaskStack_g
,APPLLOOP_TASK_SIZE_BYTE
,0
,"Appl_LoopTask");
if ( NULL == applicationInstance->loopThreadHandle)
{
OSAL_printf("Error return start Loop Task\r\n");
OSAL_error(__FUNCTION__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
OSAL_SCHED_joinTask(applicationInstance->loopThreadHandle);
/* No default tasks (run forever) here, so introduce a wait cycle */
for (;;)
{
OSAL_SCHED_sleep(1000);
}
}
else
{
for (;;)
{
for (;;)
{
OSAL_printf("long jmp restart\r\n");
OSAL_SCHED_sleep(1000);
}
}
}
// not reachable
//ESL_OS_boardDeinit();
//EC_API_SLV_unLoad();
//return 0;
}
int main(int argc, char *argv[])
{
static
uint32_t selectedPruInstance = ~0;
static
EC_SLV_APP_Sapplication_t applicationInstance = {0};
uint32_t error = OSAL_eERR_NOERROR;
ESL_OS_init();
#if !(defined FBTL_REMOTE)
selectedPruInstance = ESL_DEFAULT_PRUICSS;
#endif
if (1 < argc)
{
char* inst = argv[1];
selectedPruInstance = strtoul(inst, NULL, 0);
}
#if (defined OSAL_TIRTOS)
/* workaround to assure PRUICSS linkage */
if (0x1000 == argc)
{
/* make this link */
PRUICSS_pruDisable(NULL, 0);
PRUICSS_pruDisable(NULL, 1);
PRUICSS_registerIrqHandler(NULL, 0, 0, 0, 0, NULL);
}
#endif
/* Init osal */
OSAL_init();
applicationInstance.selectedPruInstance = selectedPruInstance;
#if (defined OSAL_FREERTOS)
TaskP_Params_init(&applicationInstance.mainThreadParam);
applicationInstance.mainThreadParam.name = "mainThread";
applicationInstance.mainThreadParam.stackSize = MAIN_TASK_SIZE_BYTE;
applicationInstance.mainThreadParam.stack = (uint8_t*)EC_SLV_APP_mainTaskStack_g;
applicationInstance.mainThreadParam.priority = (TaskP_PRIORITY_HIGHEST-1);
applicationInstance.mainThreadParam.taskMain = (TaskP_FxnMain)EC_SLV_APP_mainTask;
applicationInstance.mainThreadParam.args = (void*)&applicationInstance;
error = TaskP_construct(&applicationInstance.mainThreadHandle
,&applicationInstance.mainThreadParam);
if (SystemP_SUCCESS != error)
{
OSAL_printf("Error setting create thread of %s (%ld)\r\n", applicationInstance.mainThreadParam.name, error);
OSAL_error(__FUNCTION__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
#elif (defined OSAL_FREERTOS_JACINTO)
TaskP_Params_init(&applicationInstance.mainThreadParam);
applicationInstance.mainThreadParam.name = (uint8_t*)"mainThread";
applicationInstance.mainThreadParam.stacksize = MAIN_TASK_SIZE_BYTE;
applicationInstance.mainThreadParam.stack = (uint8_t*)EC_SLV_APP_mainTaskStack_g;
applicationInstance.mainThreadParam.priority = (configMAX_PRIORITIES-1);
applicationInstance.mainThreadParam.arg0 = (void*)&applicationInstance;
applicationInstance.mainThreadHandle = TaskP_create(EC_SLV_APP_mainTask, &applicationInstance.mainThreadParam);
if (NULL == applicationInstance.mainThreadHandle)
{
OSAL_printf("Error setting create thread of %s (%ld)\r\n", applicationInstance.mainThreadParam.name, error);
OSAL_error(__FUNCTION__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
}
#else
applicationInstance.mainThreadHandle = OSAL_SCHED_startTask(EC_SLV_APP_mainTask, &applicationInstance,
OSAL_TASK_ePRIO_Normal,
(uint8_t*)EC_SLV_APP_mainTaskStack_g,
MAIN_TASK_SIZE_BYTE, 0, "MainTask");
if ( NULL == applicationInstance.mainThreadHandle)
{
OSAL_printf("Error return start Main Task\r\n");
OSAL_error(__FUNCTION__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
error = OSAL_STACK_INIT_ERROR;
}
#endif
OSAL_startOs();
OSAL_error(__FUNCTION__, __LINE__, OSAL_eERR_EINVAL, true, 1, "Not reachable by design!!!\r\n");
// not reachable
//EC_API_SLV_unLoad();
return error;
}
static uint32_t EC_SLV_APP_remoteInit(EC_SLV_APP_Sapplication_t *pApplicationInstance_p)
{
uint32_t retVal = OSAL_CONTAINER_LOCALIMPLEMENTATION;
if (!pApplicationInstance_p)
{
goto Exit;
}
#if (defined DPRAM_REMOTE) && (DPRAM_REMOTE==1)
retVal = DPRLIB_init(pApplicationInstance_p->gpioHandle, false);
#elif (defined FBTL_REMOTE) && (FBTL_REMOTE==1)
retVal = SYSLIB_createLibInstance(FBTLSHARED_MEM_NAME, FBTLSHARED_MEM_SIZE, false,
FBTL_MAX_ASYNC_LEN, FBTL_MAX_ASYNC_LEN, FBTL_MAX_PD_LEN, FBTL_MAX_PD_LEN
#if (defined FBTLTRACECALLS) && (FBTLTRACECALLS==1)
,true
#else
,false
#endif
,&(pApplicationInstance_p->remoteHandle)
);
#else
OSALUNREF_PARM(pApplicationInstance_p);
retVal = OSAL_CONTAINER_LOCALIMPLEMENTATION;
#endif
if (OSAL_CONTAINER_LOCALIMPLEMENTATION == retVal)
{
OSAL_printf("\r\nLocal Implementation\r\n");
}
#if (defined DPRAM_REMOTE) && (DPRAM_REMOTE==1)
else if (0 == retVal)
{
OSAL_printf("\r\nDPRAM usage\r\n");
retVal = EC_API_SLV_DPR_configuration(dprRamBase(), dprRamSize());
if (0 != retVal)
{
OSAL_printf("%s:%d (%s) Error code: 0x%08x\r\n", __FUNCTION__, __LINE__, __FUNCTION__, retVal);
OSAL_error(__FUNCTION__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
return retVal;
}
}
#elif (defined FBTL_REMOTE) && (FBTL_REMOTE==1)
else if (0 == retVal)
{
retVal = EC_API_SLV_FBTL_configuration(pApplicationInstance_p->remoteHandle);
if (0 != retVal)
{
OSAL_printf("%s:%d (%s) Error code: 0x%08x\r\n", __FUNCTION__, __LINE__, __FUNCTION__, retVal);
OSAL_error(__FUNCTION__, __LINE__, OSAL_STACK_INIT_ERROR, true, 0);
return retVal;
}
}
#endif
Exit:
return retVal;
}
EC_API_SLV_stackInit
uint32_t EC_API_SLV_stackInit(void)
This is the function to initialize Stack backend.
Definition: ecSlvApiStub.c:491
EC_SLV_APP_registerStacklessBoardFunctions
void EC_SLV_APP_registerStacklessBoardFunctions(EC_SLV_APP_Sapplication_t *pAppInstance_p)
Register board related functions, which do not use stack handle.
Definition: ecSlvSimple.c:2114
EC_SLV_APP_Sapplication::mainThreadHandle
void * mainThreadHandle
Definition: ecSlvSimple.h:67
EC_API_SLV_prepareTasks
void EC_API_SLV_prepareTasks(OSAL_TASK_EPriority_t pdiTaskPrio_p, OSAL_TASK_EPriority_t statusLEDTaskPrio_p, OSAL_TASK_EPriority_t sync0TaskPrio_p, OSAL_TASK_EPriority_t sync1TaskPrio_p, OSAL_TASK_EPriority_t eoeTaskPrio_p)
Prepare internal task priorities.
Definition: ecSlvApiStub.c:449
EC_API_SLV_eESM_init
@ EC_API_SLV_eESM_init
Init State.
Definition: ecSlvApi.h:87
EC_SLV_APP_Sapplication
Definition: ecSlvSimple.h:55
EC_SLV_APP_Sapplication::gpioHandle
void * gpioHandle
Definition: ecSlvSimple.h:72
EC_API_SLV_getState
EC_API_SLV_EEsmState_t EC_API_SLV_getState(void)
This is the function to read the EtherCAT Slave state machine.
Definition: ecSlvApiStub.c:969
EC_SLV_APP_Sapplication::loopThreadHandle
void * loopThreadHandle
Definition: ecSlvSimple.h:69
EC_SLV_APP_mainTask
void EC_SLV_APP_mainTask(void *pArg_p)
Main routine.
Definition: EtherCAT_Slave_Simple.c:183
EC_SLV_APP_Sapplication::remoteHandle
void * remoteHandle
Definition: ecSlvSimple.h:73
EC_SLV_APP_Sapplication::selectedPruInstance
uint32_t selectedPruInstance
Definition: ecSlvSimple.h:57
EC_API_SLV_mainLoopCyclic
void EC_API_SLV_mainLoopCyclic(void)
Trigger stack mainloop.
Definition: ecSlvApiStub.c:1355
EC_SLV_APP_applicationInit
void EC_SLV_APP_applicationInit(EC_SLV_APP_Sapplication_t *pAppInstance_p)
Initialize application.
Definition: ecSlvSimple.c:2295
EC_SLV_APP_loopTask
void EC_SLV_APP_loopTask(void *pArg_p)
Application Loop Task.
Definition: EtherCAT_Slave_Simple.c:105
EC_SLV_APP_initBoardFunctions
void EC_SLV_APP_initBoardFunctions(EC_SLV_APP_Sapplication_t *pAppInstance_p)
Initialize board related functions.
Definition: ecSlvSimple.c:2019
EC_API_SLV_load
uint32_t EC_API_SLV_load(OSAL_PJumpBuf_t *pExceptionPoint_p, OSAL_ERR_CBHandler_t cbErrHandler_p, uint32_t pruSelect_p)
Initialize stack environment (OSAL and HWAL) after load.
Definition: ecSlvApiStub.c:367
EC_API_eERR_NONE
@ EC_API_eERR_NONE
Definition: ecApiError.h:66