【FreeRTOS】创建任务_使用任务参数

在这里插入图片描述

参考《FreeRTOS入门与工程实践(基于DshanMCU-103).pdf》


文章目录

  • 前言
  • 编写任务函数
  • 创建任务
    • 任务
    • 保护措施
    • 写了个bug
    • 疑问
    • 遗留问题
    • 效果
    • freertos.c
  • 学习链接

前言

配套源码:06_create_task_use_params

我们创建3个任务,使用同一个函数,但是在LCD上打印不一样的信息。

3个任务使用同一个函数,但是他们运行的栈不一样,局部变量是不同的版本,不同的实体~


本次要完成的任务效果,在OLED上显示……如下图
在这里插入图片描述


编写任务函数

我们要在屏幕的(x,y)坐标处打印任务的名称,把这些写在一个函数的形参里,使用结构体来传递

根据描述定义这个结构体

struct TaskPrintInfo{
    uint8_t x;      //定义坐标x
    uint8_t y;      //定义坐标y
    char name[16];  //定义要打印输出的内容,最多显示16个字符
};

假设先打印Task1,这是5个字符,返回值是5,拿到这个返回值,并且在这个返回值的地方开始打印,打印一个冒号
然后再冒号的下一个地方打印计数值count
在这里插入图片描述
编写任务函数

void LCDPrintfTask(void *params)
{
    //将传入的参数,转换成 struct TaskPrintInfo 这个结构体
    struct TaskPrintInfo *pInfo = params;
    uint32_t count = 0; //定义一个计数值
    uint8_t length;     //长度
    
    while(1)
    {
        /* 打印信息 */
        
        length  = LCD_PrintString(pInfo->x, pInfo->y, pInfo->name); //在(x,y)处打印name里的内容,返回打印了多少个字符
        length += LCD_PrintString(length, pInfo->y, ":");           //从返回的那个长度开始打印一个冒号
        LCD_PrintSignedVal(length, pInfo->y, count++);              //在冒号的下一个位置开始打印计数值count
    }
}
  • 将传入的参数,转换成 struct TaskPrintInfo 这个结构体
  • 在(x,y)处打印name里的内容,返回打印了多少个字符
  • 从返回的那个长度开始打印一个冒号
  • 在冒号的下一个位置开始打印计数值count,并且count++

创建任务

先编写三个全局变量,用来传递参数

static struct TaskPrintInfo g_Task1Info = {0, 0, "Task1"};  // (0,0),Task1
static struct TaskPrintInfo g_Task2Info = {0, 3, "Task2"};  // (0,3),Task2
static struct TaskPrintInfo g_Task3Info = {0, 6, "Task3"};  // (0,6),Task3

将 g_Task1Info结构体 传给 LCDPrintfTask这个任务,那怎么传递呢?

  • 在创建任务的时候就进行参数传递,指定这个任务需要什么参数!!!

任务

    xTaskCreate(                //加返回值是 判断任务有没有创建成功
            LCDPrintfTask,      //孤勇者的函数
            "Task1",            //声音任务
            128,                //栈大小
            &g_Task1Info,       //传入的参数 g_Task1Info
            osPriorityNormal,   //优先级默认
            NULL                //任务句柄 无
            );
    xTaskCreate(                //加返回值是 判断任务有没有创建成功
            LCDPrintfTask,      //孤勇者的函数
            "Task2",            //声音任务
            128,                //栈大小
            &g_Task2Info,       //传入的参数 g_Task2Info
            osPriorityNormal,   //优先级默认
            NULL                //任务句柄 无
            );
    xTaskCreate(                //加返回值是 判断任务有没有创建成功
            LCDPrintfTask,      //孤勇者的函数
            "Task2",            //声音任务
            128,                //栈大小
            &g_Task3Info,       //传入的参数 g_Task3Info
            osPriorityNormal,   //优先级默认
            NULL                //任务句柄 无
            );

任务是轮流运行的,有可能LCD_PrintString运行时间比较长,LCD_PrintString没执行完成,又切换任务2,又切换任务3

在这里插入图片描述在这里插入图片描述
OLED的底层函数都是IIC,如果IIC被打断,那显示就不正常,所以我们需要加一些保护措施!

在这里插入图片描述


保护措施

加入全局变量保护一下,先定义这个变量g_LCDCanUse,默认是1,表示能使用LCD,0就不能使用了

static int g_LCDCanUse = 1; //默认=1 能使用LCD

在任务的函数里添加这个变量

void LCDPrintfTask(void *params)
{
    //将传入的参数,转换成 struct TaskPrintInfo 这个结构体
    struct TaskPrintInfo *pInfo = params;
    uint32_t count = 0; //定义一个计数值
    uint8_t length;     //长度
    
    while(1)
    {
        /* 打印信息 */
        if (g_LCDCanUse)        //g_LCDCanUse == 1 能使用LCD
        {
            g_LCDCanUse = 0;    // 在这里禁止其他任务使用LCD
            length  = LCD_PrintString(pInfo->x, pInfo->y, pInfo->name); //在(x,y)处打印name里的内容,返回打印了多少个字符
            length += LCD_PrintString(length, pInfo->y, ":");           //从返回的那个长度开始打印一个冒号
            LCD_PrintSignedVal(length, pInfo->y, count++);              //在冒号的下一个位置开始打印计数值count,并且count++
            g_LCDCanUse = 1;    //用完再恢复成1,表示可以继续使用LCD
        }
    }
}

这里没有用到同步互斥,只用到一个全局变量,也许是可行的!



写了个bug

烧录程序,这里OLED没有显示

在这里插入图片描述

原因是没有初始化OLED
在这里插入图片描述

在初始化MX_FREERTOS_Init里添加如下代码

void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */
    LCD_Init();
    LCD_Clear();

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

加入初始化代码,烧录运行,又又又有bug,只有一个任务在运行,韦老师是只有任务3在运行,我的现象是只有任务1在运行
???在这里插入图片描述

修改的办法:在LCDPrintfTask任务函数里加入Delay即可,代码如下

void LCDPrintfTask(void *params)
{
    //将传入的参数,转换成 struct TaskPrintInfo 这个结构体
    struct TaskPrintInfo *pInfo = params;
    uint32_t count = 0; //定义一个计数值
    uint8_t length;     //长度
    
    LCD_Init();
	LCD_Clear();	// 清屏
    
    while(1)
    {
        /* 打印信息 */
        if (g_LCDCanUse)        //g_LCDCanUse == 1 能使用LCD
        {
            g_LCDCanUse = 0;    // 在这里禁止其他任务使用LCD
            length  = LCD_PrintString(pInfo->x, pInfo->y, pInfo->name); //在(x,y)处打印name里的内容,返回打印了多少个字符
            length += LCD_PrintString(length, pInfo->y, ":");           //从返回的那个长度开始打印一个冒号
            LCD_PrintSignedVal(length, pInfo->y, count++);              //在冒号的下一个位置开始打印计数值count,并且count++
            g_LCDCanUse = 1;    //用完再恢复成1,表示可以继续使用LCD
        }
        mdelay(500);
    }
}

现象:
在这里插入图片描述

这样我们就使用了同一个函数,创建了三个任务!三个任务里的count的值是局部变量,他们的值并不一定一样!


疑问

为什么不加延时mdelay函数,其他任务不能运行了呢?

如果不加延时函数
在这里插入图片描述

三个任务的结构都是打印函数,在Task3没打印完的时候,就进行任务切换,切换到Task1里,读取这个g_LCDCanUse变量值是0,不能进行打印!所以不能打印信息了,继续切换到Task2,也不能打印,再次切换回Task3的时候,能从上次切换出去的地方继续执行打印函数,执行完后g_LCDCanUse变量赋1,如果在这里没有瞬间切换出去,那么就继续执行这个任务了,继续循环,马上把g_LCDCanUse变量清零,执行打印函数,切换到其他任务,还是不能执行~~如此反复执行非常耗时的打印函数,所以就有bug

我们加上delay之后,在很长一段时间内这个g_LCDCanUse变量都是1,其他任务都是可以执行打印函数的,这样就比较简单的解决了这个问题。

在这里插入图片描述


遗留问题

  • 提问:==如何互斥地访问LCD?==使用全局变量,大概率可以,但是不是万无一失。(全局变量不可靠)
  • 提问:为什么先创建任务1,再创建任务2,再创建任务3,但是执行的顺序却不是123 ???为何是后面创建的task3先运行?

在这里插入图片描述

效果

在这里插入图片描述

freertos.c

/* USER CODE BEGIN Header */
#include "driver_led.h"
#include "driver_lcd.h"
#include "driver_mpu6050.h"
#include "driver_timer.h"
#include "driver_ds18b20.h"
#include "driver_dht11.h"
#include "driver_active_buzzer.h"
#include "driver_passive_buzzer.h"
#include "driver_color_led.h"
#include "driver_ir_receiver.h"
#include "driver_ir_sender.h"
#include "driver_light_sensor.h"
#include "driver_ir_obstacle.h"
#include "driver_ultrasonic_sr04.h"
#include "driver_spiflash_w25q64.h"
#include "driver_rotary_encoder.h"
#include "driver_motor.h"
#include "driver_key.h"
#include "driver_uart.h"
#include "music.h"

/**
  ******************************************************************************
  * File Name          : freertos.c
  * Description        : Code for freertos applications
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 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 "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

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

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

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

BaseType_t ret; // long
static TaskHandle_t xSoundTaskHandle;           // void *  在全局变量里记录句柄

static StackType_t g_pucStackOfLightTask[128];  // 变量前缀的意思是 全局变量g 指针p uint8_t类型uc的StackOfLightTask 光任务的栈
StaticTask_t g_TCBofLightTask;                  // 光任务的TCB
static TaskHandle_t xLightTaskHandle;           // void *  在全局变量里记录句柄

static StackType_t g_pucStackOfColorTask[128];  // 变量前缀的意思是 全局变量g 指针p uint8_t类型uc的StackOfLightTask 色任务的栈
StaticTask_t g_TCBofColorTask;                  // 色任务的TCB
static TaskHandle_t xColorTaskHandle;           // void *  在全局变量里记录句柄

/* USER CODE END Variables */
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
  .name = "defaultTask",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityNormal,
};

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

struct TaskPrintInfo{
    uint8_t x;      //定义坐标x
    uint8_t y;      //定义坐标y
    char name[16];  //定义要打印输出的内容,最多显示16个字符
};

static struct TaskPrintInfo g_Task1Info = {0, 0, "Task1"};  // (0,0),Task1
static struct TaskPrintInfo g_Task2Info = {0, 3, "Task2"};  // (0,3),Task2
static struct TaskPrintInfo g_Task3Info = {0, 6, "Task3"};  // (0,6),Task3

static int g_LCDCanUse = 1; //默认=1 能使用LCD

void LCDPrintfTask(void *params)
{
    //将传入的参数,转换成 struct TaskPrintInfo 这个结构体
    struct TaskPrintInfo *pInfo = params;
    uint32_t count = 0; //定义一个计数值
    uint8_t length;     //长度
    
    LCD_Init();
	LCD_Clear();	// 清屏
    
    while(1)
    {
        /* 打印信息 */
        if (g_LCDCanUse)        //g_LCDCanUse == 1 能使用LCD
        {
            g_LCDCanUse = 0;    // 在这里禁止其他任务使用LCD
            length  = LCD_PrintString(pInfo->x, pInfo->y, pInfo->name); //在(x,y)处打印name里的内容,返回打印了多少个字符
            length += LCD_PrintString(length, pInfo->y, ":");           //从返回的那个长度开始打印一个冒号
            LCD_PrintSignedVal(length, pInfo->y, count++);              //在冒号的下一个位置开始打印计数值count,并且count++
            g_LCDCanUse = 1;    //用完再恢复成1,表示可以继续使用LCD
        }
        mdelay(500);
    }
}

/* USER CODE END FunctionPrototypes */

void StartDefaultTask(void *argument);

void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */

/**
  * @brief  FreeRTOS initialization
  * @param  None
  * @retval None
  */
void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */
    LCD_Init();
    LCD_Clear();

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* creation of defaultTask */
  
//  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  
  
//  /* 创建任务:声 */
//  // 先创建一个动态分配内存的任务
//  ret = xTaskCreate(                //加返回值是 判断任务有没有创建成功
//            PlayMusic,          //孤勇者的函数
//            "SoundTask",        //声音任务
//            128,                //栈大小
//            NULL,               //无传入的参数
//            osPriorityNormal,   //优先级默认
//            & xSoundTaskHandle  //任务句柄
//            );

//  
//  /* 创建任务:光 */ 
//  // 创建一个静态分配内存的任务
//  xLightTaskHandle = xTaskCreateStatic(
//            Led_Test,           //LED测试函数,PC13以500ms间隔亮灭一次
//            "LightTask",        //光任务
//            128,                //栈大小,这里提供了栈的大小(长度)
//            NULL,               //无传入的参数
//            osPriorityNormal,   //优先级默认
//            g_pucStackOfLightTask,  // 静态分配的栈,一个buffer,这里只提供了首地址,长度就是栈的大小,最开始栈的类型不对,栈的类型uint32_t
//            &g_TCBofLightTask       // 取址TCB
//  );
//  


//  /* 创建任务:色 */ 
//  xColorTaskHandle = xTaskCreateStatic(
//            ColorLED_Test,           //LED测试函数,PC13以500ms间隔亮灭一次
//            "ColorTask",        //光任务
//            128,                //栈大小,这里提供了栈的大小(长度)
//            NULL,               //无传入的参数
//            osPriorityNormal,   //优先级默认
//            g_pucStackOfColorTask,  // 静态分配的栈,一个buffer,这里只提供了首地址,长度就是栈的大小
//            &g_TCBofColorTask       // 取址TCB
//  );


    xTaskCreate(                //加返回值是 判断任务有没有创建成功
            LCDPrintfTask,      //孤勇者的函数
            "Task1",            //声音任务
            128,                //栈大小
            &g_Task1Info,       //传入的参数 g_Task1Info
            osPriorityNormal,   //优先级默认
            NULL                //任务句柄 无
            );
    xTaskCreate(                //加返回值是 判断任务有没有创建成功
            LCDPrintfTask,      //孤勇者的函数
            "Task2",            //声音任务
            128,                //栈大小
            &g_Task2Info,       //传入的参数 g_Task2Info
            osPriorityNormal,   //优先级默认
            NULL                //任务句柄 无
            );
    xTaskCreate(                //加返回值是 判断任务有没有创建成功
            LCDPrintfTask,      //孤勇者的函数
            "Task2",            //声音任务
            128,                //栈大小
            &g_Task3Info,       //传入的参数 g_Task3Info
            osPriorityNormal,   //优先级默认
            NULL                //任务句柄 无
            );
  
  /* USER CODE END RTOS_THREADS */

  /* USER CODE BEGIN RTOS_EVENTS */
  /* add events, ... */
  /* USER CODE END RTOS_EVENTS */

}

/* USER CODE BEGIN Header_StartDefaultTask */

/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN StartDefaultTask */
  /* Infinite loop */
  LCD_Init();
  LCD_Clear();
  
  for(;;)
  {
    //Led_Test();
    //LCD_Test();
	//MPU6050_Test(); 
	//DS18B20_Test();
	//DHT11_Test();
	//ActiveBuzzer_Test();
	//PassiveBuzzer_Test();
	//ColorLED_Test();
	IRReceiver_Test();  //影
	//IRSender_Test();
	//LightSensor_Test();
	//IRObstacle_Test();
	//SR04_Test();
	//W25Q64_Test();
	//RotaryEncoder_Test();
	//Motor_Test();
	//Key_Test();
	//UART_Test();
  }
  /* USER CODE END StartDefaultTask */
}

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */

/* USER CODE END Application */


学习链接

学习视频:【FreeRTOS入门与工程实践 --由浅入深带你学习FreeRTOS(FreeRTOS教程 基于STM32,以实际项目为导向)】 【精准空降到 21:00】 https://www.bilibili.com/video/BV1Jw411i7Fz/?p=18&share_source=copy_web&vd_source=8af85e60c2df9af1f0fd23935753a933&t=1260

传送门


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Master PDF Editor v5 解锁版安装教程(小巧多功能PDF )

前言 Master PDF Editor,小巧的多功能PDF编辑器,轻松查看,创建,修改,批注,签名,扫描,OCR和打印PDF文档。高级注释工具,可以添加任意便笺指示对象突出显示,加…

c++中从父类继承的属性在子类内存中如何显示?

目录 一、继承概念 二、示例 三、结论 一、继承概念 在C中,继承是面向对象编程的一个重要特性,它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的成员(包括数据成员和成员函数…

数据结构:为什么说链表是顺序表的升级版(c语言实现)

前言: 我们在之前的几篇文章中详细的讲解了顺序表的特点,增删改查操作和动态顺序表的优点,并使用顺序表的底层结构实现了通讯录项目,似乎顺序表是一个非常完美的数据结构,它可以实现按照需求实现增删查改,对…

由于bug造成truncate table卡住问题

客户反应truncate table卡主,检查awr发现多个truncate在awr报告期内一直没执行完,如下: 检查ash,truncate table表的等待事件都是“enq: RO - fast object reuse”和“local write wait” 查找“enq: RO - fast object reuse”&am…

2024年能源电力行业CRM研究报告

中国能源电力行业属于大制造业的重要组成部分,在国民经济中的地位举足轻重。据统计,近十年来能源电力行业的整体投资呈现出增长趋势,尤其是“十四五”期间增长显著,2022年全国主要电力企业共完成投资12470亿元,同比增长…

Nuxt3 [Vue warn]: Hydration node mismatch:【解决方案】

[Vue warn]: Hydration node mismatch: 水合节点不匹配 Server rendered element contains more child nodes than client vdom. 服务器呈现的元素包含的子节点多于客户端vdom。 这个问题解决起来也很好解决,看这个问题是怎么出来的,看代码:…

vs工程添加属性表

一、简介 1、 vs工程属性表以(.props)为后缀 2、 作用:当多个工程需要配置很多相同的属性配置时方便同步,比如多个工程需要链接相同的头文件,库文件,输出路径,中间目录等 3、本章内容测试环境&a…

Mybatis框架的缓存

Mybatis框架的缓存 一.为什么使用缓存 缓存(cache)的作用是为了减去数据库的压力,提高查询性能。缓存实现的 原理是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存(缓存) 中,当再次需要获取…

做好海外ASO优化的7大核心要素你了解几个?

海外App进行ASO优化时,需要综合考虑多个方面以确保应用在应用商店中获得更高的曝光率和下载量。以下是一些关键的ASO优化步骤,结合参考文章中的相关信息进行详细阐述: 1.关键词优化 调研目标市场的用户行为和检索习惯,挖掘与应用…

Java和C语言中基础概念中的区别有哪些?

Java和C语言中基础概念中的区别有哪些? 标识符数据类型运算符加号%号& 和 | 关系表达式函数声明代码规范数组 以下是Java和C语言在一些基础概念中的区别(不包含面向对象等的高级知识) 标识符 在Java中,标识符可以由数字、字母…

opencv中文路径问题

目的 在windows系统上,就是直接用QT的utf8编码作为图片路径用在opencv读取或者写入函数,在路径当中含有中文时,会提示编码错误。 就是解决opencv中的中文路径的问题。 情况 代码如下: #pragma execution_character_set("…

Ubuntu系统通过GRUB引导菜单进入恢复模式修改账户密码

当在Ubuntu系统中忘记了账户密码时,有几种方法可以破解或重置密码。 本指引文档方法:通过GRUB引导菜单进入恢复模式 实践环境为:20.04.6 LTS (Focal Fossa) 1. 重启Ubuntu系统:首先,你需要重启你的Ubuntu系统。 2. …

NSSCTF-Web题目14

目录 [CISCN 2019华东南]Web11和[NISACTF 2022]midlevel 1、题目 2、知识点 3、思路 [HDCTF 2023]SearchMaster 1、题目 2、知识点 3、思路 [CISCN 2019华东南]Web11和[NISACTF 2022]midlevel 这两道题目一样 1、题目 2、知识点 SSTI(服务端模板注入漏洞&…

Vue74-路由传参2

一、$route中的params参数 二、在配置路由的index.js文件中&#xff0c;声明传参 占位符用的什么名字&#xff0c;params里面的key就是什么。 三、<router-link>标签中传参 3-1、to字符串写法 3-2、to的对象写法 注意&#xff1a;若是用params携带参数&#xff0c;不…

如何下载油管视频

文章目录 1、IDM下载1.1 安装IDM工具1.2 浏览器安装IDM插件 2、命令行工具下载2.1 youtube-dl工具2.1.1 安装使用2.1.2 更新工具 2.2 yt-dlp 工具2.2.1 安装使用2.2.2 保存路径查看当前工作目录指定下载目录示例 2.2.3 保存文件名2.2.4 避坑指南1、请求被拒绝2、其他问题 在全球…

汇凯金业:现货黄金投资平仓策略有哪些

现货黄金作为全球投资者广泛关注与参与的财富增值途径&#xff0c;其双向交易制度为市场参与者在不同行情下提供了盈利的可能。然而&#xff0c;如何在波动的市场中把握最佳的平仓时机&#xff0c;从而最大化收益&#xff0c;是所有投资者心中的疑问。正确的平仓策略可以说是现…

【html】用html+css实现银行的账户信息表格

我们先来看一看某银行的账户信息表格 我们自己也可以实现类似的效果 效果图: 大家可以看到&#xff0c;其实效果差不多 接下来看看我们实现的代码 源码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"&…

Claude 3.5 强势出击:解析最新AI模型的突破与应用

近年来&#xff0c;人工智能领域的发展迅猛&#xff0c;各大科技公司纷纷推出了自家的高级语言模型。在这场技术竞赛中&#xff0c;Anthropic的Claude系列模型凭借其强大的性能和创新的功能脱颖而出。最近&#xff0c;Anthropic发布了Claude 3.5 Sonnet模型&#xff0c;引起了广…

尚硅谷爬虫学习第一天(3) 请求对象定制

#url的组成 #协议 http&#xff0c;https&#xff0c;一个安全&#xff0c;一个不安全。 #主机&#xff0c; 端口号 学过java 的肯定知道 沃日&#xff0c;以前面试运维的时候&#xff0c;问到主机地址&#xff0c;我懵逼了下&#xff0c;回了个8080 # 主机地址 80 # …

气象数据NC、grb2解析成矢量json、CMIS、MICPS及图片应用到webgis

一、基础概念 气象数据通常以多种格式存储和交换&#xff0c;以适应不同的应用需求和处理工具。以下是一些常见的气象数据格式及其转换方法的概述&#xff1a; 常见气象数据格式 1. NetCDF&#xff08;Network Common Data Form&#xff09;&#xff1a;一种自描述、自包含的…