industrialNETworXnetx

Rainer Versteeg

Rainer Versteeg

| 05.12.2008 | 17:28 | 4 replies

Start Devicenet Stack at runtime

Hi,

I want to start the DeviceNet Task at runtime. When i start the Devicenet Task over Kernel then it runs. When it starts at runtime at hangs by Starting the DNS_FAL Task.

Here is my code:

// -----------------------------------------------------------------
// Funktion             : Starte DeviceNet Task                     -
// Übergabe             : Keine                                    -
// Rückgabe             : Keine                                    -
// -----------------------------------------------------------------  
void START_TASK_DEVICENET()
{
 //========  Definition XPEC & MAC Instanzen =================      

RX_XC_SET_T atMyXc[] =
{{{"XPEC", RX_PERIPHERAL_TYPE_XC, XC_INST_DEVICENET},
RX_XC_TYPE_XPEC,
XC_INST_DEVICENET,
#if (XC_INST_DEVICENET==0)
XC_CODE_CAN_XPEC0
#endif
#if (XC_INST_DEVICENET==1)
XC_CODE_CAN_XPEC1
#endif
#if (XC_INST_DEVICENET==2)
XC_CODE_CAN_XPEC2
#endif
},
};
RX_XC_SET_T atMyXc1[] =
{{{"XMACRPU", RX_PERIPHERAL_TYPE_XC, XC_INST_DEVICENET},
RX_XC_TYPE_XMACRPU,
XC_INST_DEVICENET,
#if (XC_INST_DEVICENET==0)
XC_CODE_CAN_RPU0
#endif
#if (XC_INST_DEVICENET==1)
XC_CODE_CAN_RPU1
#endif
#if (XC_INST_DEVICENET==2)
XC_CODE_CAN_RPU2
#endif
},
};
RX_XC_SET_T atMyXc2[] =
{{{"XMACTPU", RX_PERIPHERAL_TYPE_XC, XC_INST_DEVICENET},
RX_XC_TYPE_XMACTPU,
XC_INST_DEVICENET,
#if (XC_INST_DEVICENET==0)
XC_CODE_CAN_TPU0
#endif
#if (XC_INST_DEVICENET==1)
XC_CODE_CAN_TPU1
#endif
#if (XC_INST_DEVICENET==2)
XC_CODE_CAN_TPU2
#endif
}
};
//----------------------------------------------

//======== Definition of the LED Instanzen =================
RX_LED_SET_T atMyLed1[] = {
{{"MNS_GRN", RX_PERIPHERAL_TYPE_LED, 0},
{"SYSPIO", RX_PERIPHERAL_TYPE_LED, 0},
{(RX_LED_VALUE_TYPE)0, 0, 0},
{(RX_LED_VALUE_TYPE)0, 0, 0},
{RX_LED_VALUE_TYPE_OR, 0, 0x10},
{RX_LED_VALUE_TYPE_OR, 0, 0x10},
Drv_PioSetupLedOperations,
}
};
RX_LED_SET_T atMyLed2[] = {
{{"MNS_RED", RX_PERIPHERAL_TYPE_LED, 0},
{"SYSPIO", RX_PERIPHERAL_TYPE_LED, 0},
{(RX_LED_VALUE_TYPE)0, 0, 0},
{(RX_LED_VALUE_TYPE)0, 0, 0},
{RX_LED_VALUE_TYPE_OR, 0, 0x20},
{RX_LED_VALUE_TYPE_OR, 0, 0x20},
Drv_PioSetupLedOperations,
}
};
//----------------------------------------------

//======== Definition XPEC Intterrupt =================
RX_INTERRUPT_SET_T myXPEC_Int[] = {
{{
#if (XC_INST_DEVICENET==0)
"COM", RX_PERIPHERAL_TYPE_INTERRUPT, XC_INST_DEVICENET}, // Communication Channel, Instance 0
SRT_NETX_VIC_IRQ_STAT_com0, // Use external communication channel 0 Interrupt
#endif
#if (XC_INST_DEVICENET==1)
"COM", RX_PERIPHERAL_TYPE_INTERRUPT, XC_INST_DEVICENET}, // Communication Channel, Instance 0
SRT_NETX_VIC_IRQ_STAT_com1, // Use external communication channel 1 Interrupt
#endif
#if (XC_INST_DEVICENET==2)
"COM", RX_PERIPHERAL_TYPE_INTERRUPT, XC_INST_DEVICENET}, // Communication Channel, Instance 0
SRT_NETX_VIC_IRQ_STAT_com2, // Use external communication channel 2 Interrupt
#endif
28, // Priority 28
RX_INTERRUPT_MODE_TASK, // Allow interrupt to be a thread
RX_INTERRUPT_EOI_AUTO, // EOI self by RX
RX_INTERRUPT_TRIGGER_RISING_EDGE, // Edge triggered
RX_INTERRUPT_PRIORITY_STANDARD, // Normal Priority
RX_INTERRUPT_REENTRANCY_DISABLED, // Interrupt itself is not reentrant
TSK_PRIO_8, // Task Mode Priority
TSK_TOK_8, // Task Token
1024 // Task Stack Size
}
};
//----------------------------------------------

RX_FIFOCHANNEL_SET_T atFifoChannelSets[] = {
{
{ "FIFO_CHN0", RX_PERIPHERAL_TYPE_FIFOCHANNEL, 0 }, /* FIFO-Channel to be configured */
RX_FIFOUNIT_CHANNEL0, 64, 64, 64, 64, 64, 64, 64, 64 /* depths of 8 FIFOs per Channel */
},
{
{ "FIFO_CHN1", RX_PERIPHERAL_TYPE_FIFOCHANNEL, 0 }, /* FIFO-Channel to be configured */
RX_FIFOUNIT_CHANNEL1, 64, 64, 64, 64, 64, 64, 64, 64 /* depths of 8 FIFOs per Channel */
},
{
{ "FIFO_CHN2", RX_PERIPHERAL_TYPE_FIFOCHANNEL, 0 }, /* FIFO-Channel to be configured */
RX_FIFOUNIT_CHANNEL2, 60, 60, 60, 60, 60, 68, 72, 72 /* depths of 8 FIFOs per Channel */
},
{
{ "FIFO_CHN3", RX_PERIPHERAL_TYPE_FIFOCHANNEL, 0 }, /* FIFO-Channel to be configured */
RX_FIFOUNIT_CHANNEL3, 60, 60, 60, 60, 60, 68, 72, 72 /* depths of 8 FIFOs per Channel */
}
};


TLR_RESULT eRslt;
TLR_HANDLE hXC;
TLR_HANDLE hXC1;
TLR_HANDLE hXC2;
TLR_HANDLE hLed1;
TLR_HANDLE hLed2;
TLR_HANDLE hInt;
TLR_HANDLE hFifo;



//====== FIFO Channel erzeigen ==================
eRslt=rX_MemAllocateMemory(&hFifo,DRV_FIF_SIZE);
eRslt=Drv_FifCreateFifochannel(&hFifo,&atFifoChannelSets[0]);

//====== Interrupt für XPEC0 erzeugen ===========
eRslt=rX_MemAllocateMemory(&hInt,DRV_INTERRUPT_SIZE);
eRslt=Drv_IntCreateInterrupt(hInt, &myXPEC_Int[0]);
//-----------------------------------------------

//====== XPEC und XMAC Instanzen erzeugen =====
eRslt=rX_MemAllocateMemory(&hXC,DRV_XC_SIZE);
eRslt=rX_MemAllocateMemory(&hXC1,DRV_XC_SIZE);
eRslt=rX_MemAllocateMemory(&hXC2,DRV_XC_SIZE);
eRslt=Drv_XcCreateXc(hXC,&atMyXc[0]);
eRslt=Drv_XcCreateXc(hXC1,&atMyXc1[0]);
eRslt=Drv_XcCreateXc(hXC2,&atMyXc2[0]);
//----------------------------------------------

//====== LED Instanzen erzeugen ================
eRslt=rX_MemAllocateMemory(&hLed1,DRV_LED_SIZE);
eRslt=rX_MemAllocateMemory(&hLed2,DRV_LED_SIZE);
eRslt=Drv_LedCreateLed(hLed1,&atMyLed1[0]);
eRslt=Drv_LedCreateLed(hLed2,&atMyLed2[0]);
//----------------------------------------------




eRslt=rX_SysCreateTask("DeviceNETSlave",
(void (FAR*)(void FAR*))TaskEnter_DeviceNETSlave,
(void (*)(void*))NULL,
(void*)&auTskStack_DeviceNet[0],
TSK_STACK_SIZE_DEVICENET,
RX_TASK_AUTO_START_INIT_WAIT,
0,
TSK_PRIO_39, TSK_TOK_39,
XC_INST_DEVICENET,
(void (*)(void*))NULL);
rXStartNextTask();
}

After that i call the follwing procedure

void Create_Devicenet_Task()
{
 RX_RESULT	eRslt; 
 
 eRslt=rX_SysCreateTask("CAN_DL",   
                        (void (FAR*)(void FAR*))TaskEnter_CanDl,  
                        (void (FAR*)(void FAR*))(UINT32)&pvtCanDlPrm,
                        (void*)&auTskStack_CANDl[0],  
                        TSK_STACK_SIZE_CANDLTASK ,
                        RX_TASK_AUTO_START_INIT_WAIT,
                        0,
                        TSK_PRIO_18, TSK_TOK_18,  
                        XC_INST_DEVICENET,
                        (void (*)(void*))NULL);
  
  eRslt=rX_SysCreateTask("DNS_FAL",  
                        (void (FAR*)(void FAR*))TaskEnter_DnsFal,
                        NULL,
                        (void*)&auTskStack_DNSFAL[0],
                        TSK_STACK_SIZE_DNSFAL,  
                        RX_TASK_AUTO_START_INIT_WAIT,
                        0,
                        TSK_PRIO_19, TSK_TOK_19, 
                        XC_INST_DEVICENET,
                        (void (*)(void*))NULL);
   rXStartNextTask();  
} 

In the red marked line the NETX hangs !!

What is wrong ?? The XC_INST_DEVICENET is 2.

Br,
Rainer

Andreas Jacob

Andreas Jacob

Hilscher Gesellschaft fuer Systemautomation mbH

| 08.12.2008 | 10:33

Hi,

:? strange. I see no mistake in your code snippets.
Please try the following test. Replace the entry "RX_TASK_AUTO_START_INIT_WAIT" with "RX_TASK_AUTO_START" and remove the call rXStartNextTask at the end.

If you get any eRslt values I would be happy to know them.

Rainer Versteeg

Rainer Versteeg

| 09.12.2008 | 08:33

Hi AJ,

The eRslt give´s me 0x00000000 back. When i step to the next row with F10 the NETX hangs.
I have tested with another TASK_PRIO. With a high number of TASK_PRIO and RX_TASK_AUTO_START_INIT_WAIT the NETX hangs after next 10 or 20 Commands.

Can you test it, if you can start the Task at runtime ?

BR,
Rainer

Andreas Jacob

Andreas Jacob

Hilscher Gesellschaft fuer Systemautomation mbH

| 09.12.2008 | 09:12

Hi Rainer,

maybe you should get in contact with Hilscher regarding this issue. Please sent them your project. This will be easier and faster.

Andreas Jacob

Andreas Jacob

Hilscher Gesellschaft fuer Systemautomation mbH

| 09.12.2008 | 18:23

Hi Rainer,

I looked again over your code snippets and I saw, that the LED names are different as in the config.c file.
You crearted the names with MSN_GRN and so on, please try it without underscore:

//========  Definition of the LED Instanzen =================   
 RX_LED_SET_T atMyLed1[] = { 
 {{"MNSGRN", RX_PERIPHERAL_TYPE_LED, 0},
  {"SYSPIO", RX_PERIPHERAL_TYPE_LED, 0},
  {(RX_LED_VALUE_TYPE)0, 0, 0},          
  {(RX_LED_VALUE_TYPE)0, 0, 0},                            
  {RX_LED_VALUE_TYPE_OR, 0, 0x10},
  {RX_LED_VALUE_TYPE_OR, 0, 0x10},
  Drv_PioSetupLedOperations,
  }
 };
 RX_LED_SET_T atMyLed2[] = { 
 {{"MNSRED", RX_PERIPHERAL_TYPE_LED, 0},
  {"SYSPIO", RX_PERIPHERAL_TYPE_LED, 0},
  {(RX_LED_VALUE_TYPE)0, 0, 0},        
  {(RX_LED_VALUE_TYPE)0, 0, 0},                           
  {RX_LED_VALUE_TYPE_OR, 0, 0x20},
  {RX_LED_VALUE_TYPE_OR, 0, 0x20},
  Drv_PioSetupLedOperations,
  }
 };
 //---------------------------------------------- 

Try the following by the task creation:

void *pvtCanDlPrm = &tCanDlPrm;
 void *pvtDnsPrm = NULL;
void Create_Devicenet_Task()
{
 RX_RESULT	eRslt; 
 
 eRslt=rX_SysCreateTask("CAN_DL",   
                        (void (FAR*)(void FAR*))TaskEnter_CanDl,  
                        //(UINT32)&tCanDlPrm[0],   
                        (void (FAR*)(void FAR*))(UINT32)&pvtCanDlPrm,
                        (void*)&auTskStack_CANDl[0],  
                        TSK_STACK_SIZE_CANDLTASK ,
                        RX_TASK_AUTO_START_INIT_WAIT,
                        0,
                        TSK_PRIO_18, TSK_TOK_18,  
                        0,
                        (void (*)(void*))NULL);
 
  rXStartNextTask(); 
   
  eRslt=rX_SysCreateTask("DNS_FAL",  
                        (void (FAR*)(void FAR*))TaskEnter_DnsFal,
                        (void (FAR*)(void FAR*))(UINT32)&pvtDnsPrm,
                        (void*)&auTskStack_DNSFAL[0],
                        TSK_STACK_SIZE_DNSFAL,  
                        RX_TASK_AUTO_START_INIT_WAIT,
                        0,
                        TSK_PRIO_17, TSK_TOK_17, 
                        0,
                        (void (*)(void*))NULL);
 rXStartNextTask();                         
   
} 

And check if the Fifos are initialized.

Login