Миландр

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

Часовой пояс: UTC + 3 часа




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

Зарегистрирован: 2017-июл-24 10:16
Сообщения: 41
взял несколько примеров работы с сетью дл 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
кто знает, подскажите?


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

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB