This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

My MCU jumps to os_idle_demon after some seconds Network STM32f

Hello,

Here is my program:

int32_t socket;
uint8_t *sendbuf;
 
 
void Time3(void){
TIM_TimeBaseInitTypeDef TimeStruct; 
NVIC_InitTypeDef nvicStructure;
	
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
nvicStructure.NVIC_IRQChannel = TIM3_IRQn;
nvicStructure.NVIC_IRQChannelPreemptionPriority =1;
nvicStructure.NVIC_IRQChannelSubPriority = 0;
nvicStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&nvicStructure);		
	
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TimeStruct.TIM_Prescaler=35;
TimeStruct.TIM_Period=200;  ///200=100us
TimeStruct.TIM_ClockDivision=TIM_CKD_DIV1;	
TimeStruct.TIM_CounterMode=	TIM_CounterMode_Up ;
TIM_TimeBaseInit(TIM3, &TimeStruct);
TIM_Cmd(TIM3, ENABLE);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
}
 
/*###########################################
##############Main Function##################
###########################################*/ 
 
void SetSCK(){	
			
			socket = netUDP_GetSocket(udp_cb_func);
			if (socket >= 0) 
			{
					netUDP_Open(socket,0);
					netUDP_SetOption (socket, netUDP_OptionTTL, 20);
			}
}
 
 
int main (void){
	CLOCK();
	GPIO_SetBits(GPIOA,GPIO_Pin_5);
	LongDelay();
	netInitialize();
	LongDelay();
	Time3();
	GPIO_ResetBits(GPIOA,GPIO_Pin_5);
 
	do {
  	osDelay(500U);
  	netIF_GetOption(NET_IF_CLASS_ETH | 0, netIF_OptionIP4_Address, (uint8_t *)&addr, sizeof (addr));
	} while (addr == 0U);
 
 
 
	SetSCK();
 
	while (1) 
 
	{
		
		if(Alarm==1)
		{
			Alarm=0;
			Ethers();
		}
		
		if(CheckAlarm>2)
		{
			netUDP_Close (socket);
			netUDP_ReleaseSocket (socket);
			SetSCK();
			CheckAlarm=0;
		}
 
 
 
 
	}
}
 
void Ethers(void){
			NET_ADDR addrUDP={ NET_ADDR_IP4, 5022, 192, 168,1,10};
			if(socket>=0){
			CheckAlarm=0;
			Data();
			sendbuf =  netUDP_GetBuffer (Ether.Size);
			memcpy (sendbuf, MSG, Ether.Size);
			State=netUDP_Send (socket,&addrUDP,sendbuf,Ether.Size);	
}
void TIM3_IRQHandler(){
	
	CheckAlarm=CheckAlarm+1;
	Alarm=1;
	TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
 
					
 

 

But after some seconds which it works fine, it jumps to os_idle_demon function in RTX.

/// \brief The idle demon is running when no other thread is ready to run
void os_idle_demon (void) {
 
  for (;;) {
    /* HERE: include optional user code to be executed when no thread runs.*/
  }
}

I don't know why it goes to this function which disables my MCU operation. I am a newbie to debugging to trace this problem (why this happens before going to this sleep function).

Parents
  • Thanks, One more question.

    As I checked this function:

    void Ethers(void){
    uint8_t *sendbuf;
    			NET_ADDR addrUDP={ NET_ADDR_IP4, 5022, 192, 168,1,10};
    			if(socket>=0){
    			CheckAlarm=0;
    			Data();
    					sendbuf =  netUDP_GetBuffer (Ether.Size);
    					if(sendbuf!=NULL)
    					{
    						CheckAlarm=0;
    						memcpy (sendbuf, MSGETH, Ether.Size);
    						State=netUDP_Send (socket,&addrUDP,sendbuf,Ether.Size);	
    					}
    }

    Takes about(70 MicroS) to execute for all commands. By considering sending 70us and resting for 100us after that, can MCU transmit a UDP package each 100us or RTOS can't handle this situation (STM32f10x,DP8384)

Reply
  • Thanks, One more question.

    As I checked this function:

    void Ethers(void){
    uint8_t *sendbuf;
    			NET_ADDR addrUDP={ NET_ADDR_IP4, 5022, 192, 168,1,10};
    			if(socket>=0){
    			CheckAlarm=0;
    			Data();
    					sendbuf =  netUDP_GetBuffer (Ether.Size);
    					if(sendbuf!=NULL)
    					{
    						CheckAlarm=0;
    						memcpy (sendbuf, MSGETH, Ether.Size);
    						State=netUDP_Send (socket,&addrUDP,sendbuf,Ether.Size);	
    					}
    }

    Takes about(70 MicroS) to execute for all commands. By considering sending 70us and resting for 100us after that, can MCU transmit a UDP package each 100us or RTOS can't handle this situation (STM32f10x,DP8384)

Children
  • Here is my final code:

    int32_t socket;
    uint8_t *sendbuf;
     
     
    void Time3(void){
    TIM_TimeBaseInitTypeDef TimeStruct; 
    NVIC_InitTypeDef nvicStructure;
    	
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
    nvicStructure.NVIC_IRQChannel = TIM3_IRQn;
    nvicStructure.NVIC_IRQChannelPreemptionPriority =1;
    nvicStructure.NVIC_IRQChannelSubPriority = 0;
    nvicStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&nvicStructure);		
    	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
    TimeStruct.TIM_Prescaler=35;
    TimeStruct.TIM_Period=200;  ///200=100us
    TimeStruct.TIM_ClockDivision=TIM_CKD_DIV1;	
    TimeStruct.TIM_CounterMode=	TIM_CounterMode_Up ;
    TIM_TimeBaseInit(TIM3, &TimeStruct);
    TIM_Cmd(TIM3, ENABLE);
    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
    }
     
    /*###########################################
    ##############Main Function##################
    ###########################################*/ 
     
    
    void job3 (void const *argument)  {          
    
    netInitialize();
    }
    
    osThreadDef(job3, osPriorityAboveNormal, 1, 0);
    
    
    void SetSCK(){	
    			
    			socket = netUDP_GetSocket(udp_cb_func);
    			if (socket >= 0) 
    			{
    					netUDP_Open(socket,0);
    					netUDP_SetOption (socket, netUDP_OptionTTL, 20);
    			}
    }
     
     
    int main (void){
    	CLOCK();
    	GPIO_SetBits(GPIOA,GPIO_Pin_5);
    	LongDelay();
    
    osKernelInitialize (); 
    osThreadCreate (osThread(job3),NULL);
    osKernelStart (); 
    
    	LongDelay();
    	Time3();
    	GPIO_ResetBits(GPIOA,GPIO_Pin_5);
     
    	do {
      	osDelay(500U);
      	netIF_GetOption(NET_IF_CLASS_ETH | 0, netIF_OptionIP4_Address, (uint8_t *)&addr, sizeof (addr));
    	} while (addr == 0U);
     
     
     
    	SetSCK();
     
    	while (1) 
     
    	{
    		
    		if(Alarm==1)
    		{
    			Alarm=0;
    			Ethers();
    		}
    		
    
     
    	}
    }
     
    void Ethers(void){
    			NET_ADDR addrUDP={ NET_ADDR_IP4, 5022, 192, 168,1,10};
    			if(socket>=0){
    			CheckAlarm=0;
    			Data();
    			sendbuf =  netUDP_GetBuffer (Ether.Size);
    			memcpy (sendbuf, MSG, Ether.Size);
    			State=netUDP_Send (socket,&addrUDP,sendbuf,Ether.Size);	
    }
    void TIM3_IRQHandler(){
    	
    	CheckAlarm=CheckAlarm+1;
    	Alarm=1;
    	TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
    }

    My program hangs after some seconds before using a thread for "netInitialize();" function. After adding a new thread for netInitialize() (Job3) it shows me this fault window:

    In my point of view, my STM32f107 and DP8384 communication for sending each 100us a UDP package have a problem and it causes that the netInitialize(); halted. because I can't see any other problems.

  • Halted just means that you've stopped (ie, "Halted")  it in the debugger!