threadx netxduo stm32f407上实现http server

这次用的是CubeIDE + CubeMX

要把NX_APP的mem分配的大一些,在app_azure_rtos.c中,我给的是40*1024,如果给的不够,会导致后面无法分配pool和thread等等

需要用到filex 要在CubeMX里面勾选上,还要用到http_server和dhcp

netxduo/addons/auto_ip at v6.1.11_rel · eclipse-threadx/netxduo · GitHub

选择自己对应版本的即可

在nx_stm32_eth_config.h里添加

#define NX_ETH_CABLE_CONNECTION_CHECK_PERIOD 600

 

 在app_filex.c里删除多余的东西,就保留这样

 app_netxduo.c

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    app_netxduo.c
  * @author  MCD Application Team
  * @brief   NetXDuo applicative file
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2021 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "app_netxduo.h"
#include "nx_stm32_eth_config.h"
#include "usart.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "tx_api.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
extern void fx_stm32_sram_driver(FX_MEDIA *media_ptr);
VOID        nx_stm32_eth_driver(NX_IP_DRIVER *driver_req_ptr);
static VOID App_Main_Thread_Entry(ULONG thread_input);
TX_SEMAPHORE Semaphore;
FX_MEDIA        ram_disk;
UCHAR           ram_disk_memory[32000];
NX_HTTP_SERVER  my_server;
NX_PACKET_POOL  server_pool;
NX_PACKET_POOL tx_pool;
TX_THREAD AppWebServerThread;
TX_THREAD AppMainThread;
TX_THREAD AppLinkThread;
NX_IP             ip_0;
NX_DHCP DHCPClient;
ULONG IpAddress;
ULONG NetMask;
static uint8_t nx_server_pool[SERVER_POOL_SIZE];
uint32_t DataBuffer[512];
void            nx_server_thread_entry(ULONG thread_input);
static VOID ip_address_change_notify_callback(NX_IP *ip_instance, VOID *ptr);
UINT webserver_request_notify_callback(NX_HTTP_SERVER *server_ptr, UINT request_type, CHAR *resource, NX_PACKET *packet_ptr);
static VOID ip_address_change_notify_callback(NX_IP *ip_instance, VOID *ptr);
static VOID App_Link_Thread_Entry(ULONG thread_input);
/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* App memory pointer. */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */
/**
  * @brief  Application NetXDuo Initialization.
  * @param memory_ptr: memory pointer
  * @retval int
  */


UINT MX_NetXDuo_Init(VOID *memory_ptr)
{

  UCHAR *pointer ;
  UINT ret = NX_SUCCESS;
  TX_BYTE_POOL *byte_pool = (TX_BYTE_POOL*)memory_ptr;
  /* USER CODE BEGIN MX_NetXDuo_MEM_POOL */
  /* Initialize the NetX system.  */
  nx_system_initialize();
  ret = tx_byte_allocate(byte_pool, (VOID **) &pointer, NX_PACKET_POOL_SIZE, TX_NO_WAIT);
  if (ret != NX_SUCCESS)
  {
    printf("Packed pool memory allocation failed : 0x%02x\n", ret);
    Error_Handler();
  }
  /* Create a packet pool.  */
    ret =  nx_packet_pool_create(&tx_pool,"NetX Main txPacket Pool",1536,pointer ,NX_PACKET_POOL_SIZE);
    if (ret != NX_SUCCESS)
    {
      printf("Packed creation failed : 0x%02x\n", ret);
      Error_Handler();
    }
    ret = tx_byte_allocate(byte_pool, (VOID **) &pointer, SERVER_POOL_SIZE, TX_NO_WAIT);
    if (ret != NX_SUCCESS)
    {
      printf("Packed pool memory allocation failed : 0x%02x\n", ret);
      Error_Handler();
     }
    ret =  nx_packet_pool_create(&server_pool, "HTTP Server Packet Pool", SERVER_PACKET_SIZE,nx_server_pool, SERVER_POOL_SIZE);
    if (ret != NX_SUCCESS)
    {
      printf("Server pool creation failed : 0x%02x\n", ret);
      Error_Handler();
    }

    // ip instance
    ret = tx_byte_allocate(byte_pool, (VOID **) &pointer, 2 * DEFAULT_MEMORY_SIZE, TX_NO_WAIT);
    if (ret != NX_SUCCESS)
    {
      printf("NetX IP Instance memory allocation failed : 0x%02x\n", ret);
      Error_Handler();
    }
    /* Create an IP instance.  */
    ret = nx_ip_create(&ip_0, "NetX IP Instance 0", IP_ADDRESS(192, 168,3, 36), 0xFFFFFF00UL, &tx_pool, nx_stm32_eth_driver,
                        pointer, 2 * DEFAULT_MEMORY_SIZE, DEFAULT_PRIORITY);
    if (ret != NX_SUCCESS)
    {
      printf("IP Instance creation failed : 0x%02x\n",ret);
      Error_Handler();
    }

    // arp
    ret = tx_byte_allocate(byte_pool, (VOID **) &pointer, ARP_CACHE_SIZE, TX_NO_WAIT);
    if (ret != NX_SUCCESS)
    {
      printf("ARP cache memory allocation failed : 0x%02x\n", ret);
      Error_Handler();
    }
    ret =  nx_arp_enable(&ip_0, (void *) pointer, ARP_CACHE_SIZE);

    if (ret != NX_SUCCESS)
    {
      printf("ARP Enable for IP error : 0x%02x\n", ret);
      Error_Handler();
    }



    ret = nx_icmp_enable(&ip_0);

    if (ret != NX_SUCCESS)
    {
	  printf("ICMP enable for IP error : 0x%02x\n", ret);
	  Error_Handler();
    }
    ret =  nx_udp_enable(&ip_0);

    if (ret != NX_SUCCESS)
    {
      printf("UDP enable for IP error : 0x%02x\n", ret);
      Error_Handler();
    }
    ret =  nx_tcp_enable(&ip_0);

    if (ret!=NX_SUCCESS)
    {
      printf("TCP enable for IP error : 0x%02x\n", ret);
      Error_Handler();
    }
    ret = tx_byte_allocate(byte_pool, (VOID **) &pointer, SERVER_STACK, TX_NO_WAIT);
    if (ret != NX_SUCCESS)
    {
      printf("Server stack memory allocation failed : 0x%02x\n", ret);
      Error_Handler();
    }
  	ret = nx_http_server_create(&my_server, "My HTTP Server", &ip_0, &ram_disk,
  	                          pointer, SERVER_STACK, &server_pool, NX_NULL, webserver_request_notify_callback);
    if (ret != NX_SUCCESS)
    {
       printf("HTTP WEB Server creation failed: 0x%02x\n", ret);
       Error_Handler();
    }



    // web thread
    ret = tx_byte_allocate(byte_pool, (VOID **) &pointer, 2 * DEFAULT_MEMORY_SIZE, TX_NO_WAIT);
    if (ret != TX_SUCCESS)
    {
      printf("Main thread memory allocation failed : 0x%02x\n", ret);
      Error_Handler();
    }
    ret = tx_thread_create(&AppMainThread, "App Main thread", App_Main_Thread_Entry, 0, pointer, 2 * DEFAULT_MEMORY_SIZE,
                             DEFAULT_MAIN_PRIORITY, DEFAULT_MAIN_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START);
    if (ret != TX_SUCCESS)
    {
      return NX_NOT_ENABLED;
    }

    /* Allocate the TCP server thread stack. */
      ret = tx_byte_allocate(byte_pool, (VOID **) &pointer, 2 * DEFAULT_MEMORY_SIZE, TX_NO_WAIT);

      /* Check server thread memory allocation. */
      if (ret != TX_SUCCESS)
      {
        printf("Server thread memory allocation failed : 0x%02x\n", ret);
        Error_Handler();
      }
      ret = tx_thread_create(&AppWebServerThread, "App Web Server Thread", nx_server_thread_entry, 0, pointer, 2 * DEFAULT_MEMORY_SIZE,
                               DEFAULT_PRIORITY, DEFAULT_PRIORITY, TX_NO_TIME_SLICE, TX_DONT_START);

	if (ret != TX_SUCCESS)
	{
	  return NX_NOT_ENABLED;
	}

	/* Allocate the memory for Link thread   */
	if (tx_byte_allocate(byte_pool, (VOID **) &pointer,2 *  DEFAULT_MEMORY_SIZE, TX_NO_WAIT) != TX_SUCCESS)
	{
	  return TX_POOL_ERROR;
	}

	/* create the Link thread */
	ret = tx_thread_create(&AppLinkThread, "App Link Thread", App_Link_Thread_Entry, 0, pointer, 2 * DEFAULT_MEMORY_SIZE,
						   LINK_PRIORITY, LINK_PRIORITY, TX_NO_TIME_SLICE, TX_AUTO_START);
	if (ret != TX_SUCCESS)
	  {
	    return NX_NOT_ENABLED;
	  }
	/* Create the DHCP instance. */
    ret = nx_dhcp_create(&DHCPClient, &ip_0, "dhcp_client");
    if (ret != NX_SUCCESS)
    {
	  printf("DHCP Instance creation failed : 0x%02x\n", ret);
    }
    ret = nx_ip_address_change_notify(&ip_0, ip_address_change_notify_callback, NULL);
	if (ret != NX_SUCCESS)
	{
	  Error_Handler();
	}

	ret = tx_semaphore_create(&Semaphore, "App Semaphore", 0);
	if (ret != TX_SUCCESS)
	{
	  printf("Semaphore creation failed : 0x%02x\n", ret);
	  Error_Handler();
	}
/* USER CODE END MX_NetXDuo_MEM_POOL */
  /* USER CODE BEGIN MX_NetXDuo_Init */





  /* USER CODE END MX_NetXDuo_Init */

  return ret;
}

/* USER CODE BEGIN 1 */
void    nx_server_thread_entry(ULONG thread_input)
{
	UINT  status;
	tx_thread_sleep(NX_IP_PERIODIC_RATE);
	NX_PARAMETER_NOT_USED(thread_input);
//	status = fx_media_open(&ram_disk, "STM32_SDIO_DISK", fx_stm32_sram_driver, (VOID *)SRAM2_BASE, DataBuffer, sizeof(DataBuffer));
//	if (status != FX_SUCCESS)
//    {
//	  /*Print Media Opening error. */
//	  printf("FX media opening failed : 0x%02x\n", status);
//	  /* Error, call error handler.*/
//	  Error_Handler();
//    }
//	tx_thread_sleep(NX_IP_PERIODIC_RATE);
	status = nx_http_server_start(&my_server);
	if (status != NX_SUCCESS)
	{
		/* Print HTTP WEB Server starting error. */
		printf("HTTP WEB Server Starting Failed, error: 0x%02x\n", status);
		/* Error, call error handler.*/
		Error_Handler();
	}
	tx_thread_sleep(NX_IP_PERIODIC_RATE);

}

UINT webserver_request_notify_callback(NX_HTTP_SERVER *server_ptr, UINT request_type, CHAR *resource, NX_PACKET *packet_ptr)
{
  CHAR temp_string[30] = {'\0'};
  CHAR data[512] = {'\0'};
  UINT string_length;
  NX_PACKET *resp_packet_ptr;
  UINT status;
  NX_PARAMETER_NOT_USED(server_ptr);
  NX_PARAMETER_NOT_USED(request_type);
  NX_PARAMETER_NOT_USED(packet_ptr);
  if (strcmp(resource, "/GetTXData") == 0)
    {
      /* Let HTTP server know the response has been sent. */
	  sprintf(data, "%lu.%lu.%lu.%lu,%u", (IpAddress >> 24) & 0xff, (IpAddress >> 16) & 0xff, (IpAddress >> 8) & 0xff, IpAddress& 0xff, CONNECTION_PORT);
    }
  else{
	  return NX_SUCCESS;
  }
  nx_http_server_type_get(server_ptr, server_ptr -> nx_http_server_request_resource, temp_string);
  temp_string[string_length] = '\0';
  status = nx_http_server_callback_generate_response_header(server_ptr, &resp_packet_ptr, NX_HTTP_STATUS_OK,
                                                                  strlen(data), temp_string, NX_NULL);
  status = nx_packet_data_append(resp_packet_ptr, data, strlen(data), server_ptr->nx_http_server_packet_pool_ptr, NX_WAIT_FOREVER);
  status = nx_http_server_callback_packet_send(server_ptr, resp_packet_ptr);
    if (status != NX_SUCCESS)
    {
      nx_packet_release(resp_packet_ptr);
      return status;
    }
    return(NX_HTTP_CALLBACK_COMPLETED);
}

static VOID ip_address_change_notify_callback(NX_IP *ip_instance, VOID *ptr)
{
  /* as soon as the IP address is ready, the semaphore is released to let the web server start */
  tx_semaphore_put(&Semaphore);
}

static VOID App_Main_Thread_Entry(ULONG thread_input)
{
  UINT ret;

  ret = nx_ip_address_change_notify(&ip_0, ip_address_change_notify_callback, NULL);
  if (ret != NX_SUCCESS)
  {
    Error_Handler();
  }

  ret = nx_dhcp_start(&DHCPClient);
  if (ret != NX_SUCCESS)
  {
    Error_Handler();
  }

  /* wait until an IP address is ready */
//  if(tx_semaphore_get(&Semaphore, TX_WAIT_FOREVER) != TX_SUCCESS)
//  {
//    Error_Handler();
//  }
  /* get IP address */
  ret = nx_ip_address_get(&ip_0, &IpAddress, &NetMask);


  if (ret != TX_SUCCESS)
  {
    Error_Handler();
  }
  /* the network is correctly initialized, start the nx_server_thread_entry */
  tx_thread_resume(&AppWebServerThread);

  /* this thread is not needed any more, we relinquish it */
  tx_thread_relinquish();

  return;
}


static VOID App_Link_Thread_Entry(ULONG thread_input)
{
  ULONG actual_status;
  UINT linkdown = 0, status;

  while(1)
  {
    /* Get Physical Link stackavailtus. */
    status = nx_ip_interface_status_check(&ip_0, 0, NX_IP_LINK_ENABLED,
                                      &actual_status, 10);

    if(status == NX_SUCCESS)
    {
      if(linkdown == 1)
      {
        linkdown = 0;
        status = nx_ip_interface_status_check(&ip_0, 0, NX_IP_ADDRESS_RESOLVED,
                                      &actual_status, 10);
        if(status == NX_SUCCESS)
        {
          /* The network cable is connected again. */
          printf("The network cable is connected again.\n");
          /* Print Webserver Client is available again. */
          printf("Webserver Client is available again.\n");
        }
        else
        {
          /* The network cable is connected. */
          printf("The network cable is connected.\n");
          /* Send command to Enable Nx driver. */
          nx_ip_driver_direct_command(&ip_0, NX_LINK_ENABLE,
                                      &actual_status);
          /* Restart DHCP Client. */
          nx_dhcp_stop(&DHCPClient);
          nx_dhcp_start(&DHCPClient);
        }
      }
    }
    else
    {
      if(0 == linkdown)
      {
        linkdown = 1;
        /* The network cable is not connected. */
        printf("The network cable is not connected.\n");
      }
    }

    tx_thread_sleep(NX_ETH_CABLE_CONNECTION_CHECK_PERIOD);
  }
}
/* USER CODE END 1 */

app_netxduo.h

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    app_netxduo.h
  * @author  MCD Application Team
  * @brief   NetXDuo applicative header file
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2020-2021 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __APP_NETXDUO_H__
#define __APP_NETXDUO_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "nx_api.h"

/* Private includes ----------------------------------------------------------*/
#include "nx_stm32_eth_driver.h"

/* USER CODE BEGIN Includes */
#include "app_filex.h"
#include "tx_thread.h"
#include "main.h"
#include "nxd_http_server.h"
#include "tx_thread.h"
#include "nxd_dhcp_client.h"
/* USER CODE END Includes */

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */
#define DEFAULT_MEMORY_SIZE              1024
#define SERVER_PACKET_SIZE  (NX_HTTP_SERVER_MIN_PACKET_SIZE * 2)
#define NX_PACKET_POOL_SIZE             ((1536 + sizeof(NX_PACKET)) * 8)
#define SERVER_POOL_SIZE                 (SERVER_PACKET_SIZE * 4)
#define ARP_CACHE_SIZE                   1024
#define SERVER_STACK                     4096
#define DEFAULT_MAIN_PRIORITY            10
#define DEFAULT_PRIORITY                 5
#define LINK_PRIORITY                    11
#define CONNECTION_PORT                  80
/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */

/* USER CODE END EC */

/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */

/* USER CODE END EM */

/* Exported functions prototypes ---------------------------------------------*/
UINT MX_NetXDuo_Init(VOID *memory_ptr);

/* USER CODE BEGIN EFP */

/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* USER CODE BEGIN 1 */
/* USER CODE END 1 */

#ifdef __cplusplus
}
#endif
#endif /* __APP_NETXDUO_H__ */

 

 

 在这里设置导航,我写了一个/GetTXData,让它返回当前IP地址,大家自己实现自己的东西就可以。

 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 13:32:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 13:32:03       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 13:32:03       58 阅读
  4. Python语言-面向对象

    2024-07-11 13:32:03       69 阅读

热门阅读

  1. 网络协议 | 计算机网络基础学习笔记

    2024-07-11 13:32:03       18 阅读
  2. 【Axure高保真原型】输入表单——回车键切换

    2024-07-11 13:32:03       21 阅读
  3. c与c++ 常用的字符与字符串处理的接口介绍:

    2024-07-11 13:32:03       25 阅读
  4. AT32单片机踩坑记录

    2024-07-11 13:32:03       23 阅读
  5. 西门子总线插头6ES7972-0BB41-0XA0

    2024-07-11 13:32:03       19 阅读
  6. ActiViz中的过滤器vtkLinearExtrusionFilter

    2024-07-11 13:32:03       24 阅读
  7. R 数据重塑

    2024-07-11 13:32:03       20 阅读
  8. MySQL InnoDB存储引擎

    2024-07-11 13:32:03       24 阅读
  9. Linux上将图片转换为PDF

    2024-07-11 13:32:03       23 阅读
  10. PDF预览功能

    2024-07-11 13:32:03       23 阅读
  11. 什么是CNN,它和传统机器学习有什么区别

    2024-07-11 13:32:03       20 阅读