Миландр

Ключевым подразделением нашей компании
является Центр Проектирования интегральных микросхем
Текущее время: 2020-май-29 20:01

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 3 сообщения ] 
Автор Сообщение
СообщениеДобавлено: 2017-окт-10 18:04 
Не в сети

Зарегистрирован: 2017-июл-24 10:16
Сообщения: 63
Организация: НИИССИ
взял несколько примеров работы с сетью дл 1986ве3
и пример для stm32
по образцу сделал UDP и HTTP сервер, который работает во freeRTOS
тепер нужно поднять и второй интерфейс,
но пока как это сделать не знаю
подскажите где копать?
у меня сделано так:
сначала инициализируется lwip стек
и запускаются 2 процесса/потока
dhcp поток
и поток обслуживания eth2

примерно представляю, что нужно смотреть в сторону netif
но как, не знаю
#include <stdio.h>
#include "systick.h"
#include "net_task.h"
#include "globdefs.h"
#include "main.h"

#include "eth1_if.h"
#include "eth2_if.h"


#define 	MAX_DHCP_TRIES 		5

/* КА для DHCP */
typedef enum {
    DHCP_START = 0,
    DHCP_WAIT_ADDRESS,
    DHCP_ADDRESS_ASSIGNED,
    DHCP_TIMEOUT
} DHCP_State_TypeDef;


static struct netif netif;

/**
 *  Инициализация IP стека и всех интерфесов
 */
void lwip_init_all(void)
{
    struct ip_addr ipaddr;
    struct ip_addr netmask;
    struct ip_addr gw;

    /* Initilaize the LwIP stack */
    lwip_init();

    udp_server_init();

    ipaddr.addr = 0;
    netmask.addr = 0;
    gw.addr = 0;

    /* Add your network interface to the netif_list. */
    netif_add(&netif, &ipaddr, &netmask, &gw, NULL, &eth2_init, &ethernet_input);

    /*  Registers the default network interface. */
    netif_set_default(&netif);

    netif_set_up(&netif);
}


/**
 * Задача обслуживания DHCP
 */
void lwip_dhcp_task(void *p)
{
    struct ip_addr ipaddr;
    struct ip_addr netmask;
    struct ip_addr gw;
    u32 IPaddress = 1;     
    u32 ARPTimer = 0;
    u32 DHCPfineTimer = 0;
    u32 DHCPcoarseTimer = 0;
    u8 iptab[4];
    u8 DHCP_state;
    int time;

    DHCP_state = DHCP_START;

    while (1) {
	switch (DHCP_state) {

	case DHCP_START:
	    {
		dhcp_start(&netif);
                IPaddress = 0;
		printf("Looking for\r\n");
		printf("DHCP server\r\n");
		printf("please wait...\r\n");
		DHCP_state = DHCP_WAIT_ADDRESS;
	    }
	    break;

	case DHCP_WAIT_ADDRESS:
	    {
		/* Read the new IP address */
		if (IPaddress != netif.ip_addr.addr) {
		    IPaddress = netif.ip_addr.addr;
                    
		
		    /* Stop DHCP */
		    dhcp_stop(&netif);
                
		    iptab[0] = (uint8_t) (IPaddress >> 24);
		    iptab[1] = (uint8_t) (IPaddress >> 16);
		    iptab[2] = (uint8_t) (IPaddress >> 8);
		    iptab[3] = (uint8_t) (IPaddress);

		    if (IPaddress != 0) {
			printf("IP address assigned for eth2\r\n");
			printf("by a DHCP server: %d.%d.%d.%d\r\n", iptab[3], iptab[2], iptab[1], iptab[0]);
			vTaskDelete(NULL);
		    }
		} else {
		    /* DHCP timeout */
		    if (netif.dhcp->tries > MAX_DHCP_TRIES) {
			DHCP_state = DHCP_TIMEOUT;

			/* Stop DHCP */
			dhcp_stop(&netif);

			/* Static address used */
			IP4_ADDR(&ipaddr, IP_ADDR0, IP_ADDR1, IP_ADDR2, IP_ADDR3);
			IP4_ADDR(&netmask, NETMASK_ADDR0, NETMASK_ADDR1, NETMASK_ADDR2, NETMASK_ADDR3);
			IP4_ADDR(&gw, GW_ADDR0, GW_ADDR1, GW_ADDR2, GW_ADDR3);
			netif_set_addr(&netif, &ipaddr, &netmask, &gw);


			printf("DHCP timeout\n");

			iptab[0] = IP_ADDR3;
			iptab[1] = IP_ADDR2;
			iptab[2] = IP_ADDR1;
			iptab[3] = IP_ADDR0;

			printf("Static IP address  %d.%d.%d.%d\n", iptab[3], iptab[2], iptab[1], iptab[0]);
			vTaskDelete(NULL);
		    }
		}
	    }
	    break;

	default:
	    break;
	}
     
     time = sys_now();   
        
    /* ARP periodic process every 5s */
    if ((time - ARPTimer) >= ARP_TMR_INTERVAL) {
	ARPTimer = time;
	etharp_tmr();
    }


    /* Fine DHCP periodic process every 500ms */
    if (time - DHCPfineTimer >= DHCP_FINE_TIMER_MSECS) {
	DHCPfineTimer = time;
	dhcp_fine_tmr();
    }

    /* DHCP Coarse periodic process every 60s */
    if (time - DHCPcoarseTimer >= DHCP_COARSE_TIMER_MSECS) {
	DHCPcoarseTimer = time;
	dhcp_coarse_tmr();
    }        
	vTaskDelay(250);	/* wait 250 ms */
    }
}




/**
 * Периодический опрос eth1
 */
static void net_task2_periodic(uint32_t time)
{
    static uint32_t LEDTimer = 0;        
    
    /* Link check and LED blink process every 500ms */
    if ((time - LEDTimer) >= 500) {
	LEDTimer = time;
	eth2_check_link(&netif);
    }
}


/**
 * Вызывается каждый раз в бесконечном цикле
 * Здесь определяем задачи которые должны выполняться
 */
void task2_poll(void *par)
{
     while (1) {
	eth2_poll(&netif);	/* check if any packet received */
        net_task2_periodic(sys_now());	/* handle periodic timers for LwIP */
    }
}

вероятно нуждно в функции lwip_init_all поднять и второй eth
кто знает, подскажите?


Вернуться к началу
СообщениеДобавлено: 2018-май-29 13:05 
Не в сети
Аватара пользователя

Зарегистрирован: 2015-май-06 14:32
Сообщения: 10
Добрый день! А удалось ли решить проблему Ethernet2(1896ВЕ3) под LWIP+RTOS, если да - поделитесь опытом?


Вернуться к началу
СообщениеДобавлено: 2019-фев-18 17:58 
Не в сети

Зарегистрирован: 2017-июл-24 10:16
Сообщения: 63
Организация: НИИССИ
да.. поднял сразу пять
плюс три 5600 на борту


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 3 сообщения ] 

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и 2 гостя


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB