threadx netxduo stm32f407上实现http server

news2024/9/21 2:37:38

这次用的是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地址,大家自己实现自己的东西就可以。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1916459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苹果手机抹机(马来西亚)操作步骤

苹果手机抹机(马来西亚)操作步骤 操作环境操作步骤 操作环境 苹果6s,没有插卡,就连接上了一个wifi 操作步骤

YOLOv10改进 | Conv篇 | 利用FasterBlock二次创新C2f提出一种全新的结构(全网独家首发,参数量下降70W)

一、本文介绍 本文给大家带来的改进机制是利用FasterNet的FasterBlock改进特征提取网络,将其用来改进ResNet网络,其旨在提高计算速度而不牺牲准确性,特别是在视觉任务中。它通过一种称为部分卷积(PConv)的新技术来减少…

小白的OS Copilot 产品测评

背景 通过群友介绍才知OS Copilot 。不想错过任何优秀的AI产品。随着互联网的发展和时代的进步,要紧跟时代,了解市面上的优秀的AI科技产品。 OS Copilot 产品体验评测 1)您的角色是什么?开发、运维、学生?如果使用O…

微软推出全新的学习网站 Microsoft Learn

微软官方宣布推出全新的学习网站 Microsoft Learn,供开发人员学习 Microsoft 技术。 该网站包含所有 Microsoft 产品和服务(从 HoloLens 到 Azure)的技术文档。提供了超过 80 小时的学习内容,涉及 Azure、Dynamics 365、PowerApps、Microsoft Flow 和 Po…

杜比全景声——空间音频技术

什么是杜比?是否是标清、高清、超清之上的更清晰的格式?杜比全景声 和传统多声道立体声的差别?杜比全景声音频的渲染方式?车载平台上杜比技术的应用? 杜比技术的起源 杜比实验室(Dolby Laboratories&…

谷歌内置AI部署

感谢阅读 准备工作开启功能查看下载情况安装插件效果截图网页版地址(需进行前面的所有步骤) 准备工作 点我下载谷歌dev版本 注意这个版本不需要卸载之前版本 开启功能 使用下载的浏览器依次导航到下面两个地方,然后点击enablebypass以及en…

STM32 - PWR 笔记

PWR(Power Control)电源控制 PWR 负责管理 STM32 内部的电源供电部分,可以实现 可编程电压监测器 和 低功耗模式 的功能 可编程电压监测器(PVD)可以监控VDD电源电压,当VDD下降到PVD阀值以下或上升到PVD…

arm 、stm32、linux该如何学习?有没有先后顺序,先学什么比较好?

先讲自己,我是从Arduino单片机入门,再到stm32 ,再开发瑞萨,TI,然后学校教了51。这是一个奇怪的学习过程,所以当我第一次接触51单片机的时候,刚好我有一些资料,是我根据网友给的问题精…

MacOS如何切换shell类型

切换 shell 类型 如果你想在不同的 shell 之间切换,以探索它们的不同之处,或者因为你知道自己需要其中的一个或另一个,可以使用如下命令: 切换到 bash chsh -s $(which bash)切换到 zsh chsh -s $(which zsh)$()语法的作用是运…

c++ learn fourth day

2.LOL Lovers 我们可以从 1 遍历到 len−1,以第 𝑖i 个位置为分割线,统计 [0,i−1] 与 [i,len−1] 的 l 和 o 的个数,判断是否不相等,如果不相等,输出 i,然后退出即可。 如果到最后一直没有输出…

【Mac】Charles for Mac(HTTP协议抓包工具)及同类型软件介绍

软件介绍 Charles for Mac 是一款功能强大的网络调试工具,主要用于HTTP代理/HTTP监视器。以下是它的一些主要特点和功能: 1.HTTP代理:Charles 可以作为HTTP代理服务器,允许你查看客户端和服务器之间的所有HTTP和SSL/TLS通信。 …

2970.力扣每日一题7/10 Java(暴力枚举)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 解题思路 解题方法 时间复杂度 空间复杂度 Code 解题思路 incre…

SDF矩形(附圆角)公式推导

SDF矩形(附圆角)公式推导 矩形 一般情况下,我们会使用(top_left, top_bottom), (width, height)来定义一个矩形,但是对于SDF而言,使用(centerX, centerY), (HalfSizeX, HalfSizeY)会更方便一些。 假设一个矩形,我们先定…

利用【Python】【线性规划】优化工厂生产:实现智能资源配置与利润最大化的现代解决方案

目录 1. 问题背景和描述 1.1 问题背景 1.2 问题描述 2. 数学模型的建立 2.1决策变量 2.2 目标函数 2.3 约束条件 2.4 数学模型总结 3. 使用Python解决线性规划问题 3.1 导入必要的库 3.2 定义目标函数系数 3.3 定义不等式约束矩阵和向量 3.4 定义变量的边界 非负…

MAVLink代码生成-C#

一. 准备Windows下安装环境 Python 3.3 – 官网链接下载Python future模块 –pip3 install future TkInter (GUI 工具). – python for Windows自带,无需下载环境变量PYTHONPATH必须包含mavlink存储库的目录路径。 –set PYTHONPATH你的mavlink源码路径 源码下载在…

【Linux】Windows环境下配置虚拟机静态IP

当前我们虚拟机的Linux操作系统,其IP地址是通过DHCP服务获取的。 DHCP:动态获取IP地址,即每闪重启设备后都会获取一次,可能导致IP地址频繁变更 原因1:办公电脑IP地址变化无所谓,但是我们要远程连接到Linux系统&#x…

IDEA之Debug的使用

自定义功能图表 功能说明 光标回到Debug行 执行到光标所在行 Force Step into Trace Current Stream Chain Reset Frame 重置方法入栈

ESP32网络开发:1.创建一个基于TCP网络协议的网站

一、TCP协议的介绍 TCP(传输控制协议,Transmission Control Protocol)是互联网协议套件中的一种核心协议,主要用于在网络中的计算机之间可靠地传输数据。TCP协议位于OSI模型(开放系统互联模型)的传输层&…

系统架构设计师教程(清华第2版)<第2章 计算机系统基础知识>解读

系统架构设计师教程 第二章 计算机系统基础知识-2.1计算机系统概述 2.2 计算机硬件 2.1 计算机系统概述2.2 计算机硬件2.2.1 计算机硬件组成2.2.2 处理器2.2.2.1 控制单元(CU)2.2.2.2 算术逻辑单元(ALU)2.2.2.3 指令集2.2.2.3.1 CISC的特点2.2.2.3.2 RISC的特点2.2.3 存储器2.2…

大白话讲解AI大模型

大白话讲解大模型 大模型的发展重要大模型发展时间线 大模型的简单原理-训练⼤模型是如何训练并应⽤到场景中的?如果训练私有化模型 模型:model 语料库:用于训练模型的数据 大模型的发展 详细信息来源:DataLearner 2022年11月底…