当前位置: 首页 > news >正文

uCOSIII实时操作系统 三 移植

目录

uCOSIII简介:

准备工作:

准备基础工程:

UCOSIII工程源码:

UCOSIII移植:

向基础工程中添加相应的文件夹

向工程中添加分组

常见问题:

下载验证:

uCOSIII简介:

UCOS-III 是UCOS系统的第三代内核。

  1. 可剥夺式任务管理:总是执行当前就绪任务中优先级最高的任务。
  2. 同优先级任务的时间片轮转调度:UCOS-III允许一个任务优先级被多个任务使用,当这个优先级处在最高就绪态的时候,操作系统会轮流的调度处在这个优先级级别里面的所有任务,让优先级里面的每一个任务运行由用户指定的一段时间长度,这个时间通常称为"时间片"。这个特性也是UCOS-III与UCOS-II的一个重要区别。(II中不支持一个优先级内多个任务)。
  3. 极短的中断时间:UCOS-III采用的是锁定内核调度的方式而不是关中断的方式来保护临界区代码段,这样就可以把关中断的时间降至最低,使得UCOS-III能够非常快速的响应中断请求。
  4. 任务数目不受限制:UCOS-III自己本身是没有任务数目的限制的。但是实际情况下,任务数目会受到硬件比如CPU的影响不可能是无限制的。(每个任务都占用数据结构内存)
  5. 优先级数目不受限制:UCOS-III本身支持无限大的任务优先级。
  6. 内核对象数目不受限制:UCOS-III允许定义任意数目的内核对象。内核对象常见的包括任务,互斥信号量,事件标志组,消息队列,定时器和存储块等等。
  7. 软件定时器:用户可以任意定义“单次”和“周期”型定时器,定时器是一个递减计数器,递减到零就会执行预先定义好的操作。每个定时器都可以指定所需操作,周期型定时器在递减到零时会执行指定操作,并自动重置计数器值。
  8. 同时等待多个内核对象:UCOSIII允许一个任务同时等待多个事件,也就是说,一个任务能够挂起多个信号量或者消息队列上,当其中任何一个等待的时间发生时,等待任务就会被唤醒。
  9. 直接向任务发送信号:UCOSIII允许中断或者任务直接给另一个任务发送信号,避免创建和使用诸如信号量,或者事件标志等内和对象作为向其他任务发送信号的中介,该特征有效的提高了系统的性能。
  10. 直接向任务发送信息:UCOSIII 允许中断或任务直接给另一个任务发送消息,避免创建和使用消息队列作为中介。
  11. 任务寄存器:每个任务都可以设定若干个“任务定时器”任务寄存器和 CPU 硬件寄存器是不同的,主要用来保存各个任务的错误信息,ID 识别信息,中断关闭时间的测量结果等。
  12. 任务级时间节拍处理:UCOSIII的时钟节是通过一个专门的任务完成的,定时中断仅触发该任务。将延时处理和超时判断放在任务级代码完成。极大的减少了中断延时时间。
  13. 防止锁死:所有UCOSIII的 "等待"功能都提供了一个超时检测机制,有效的避免了锁死。
  14. 时间戳:UCOSIII需要一个16位或者32位的自由运行的计数器(时基计数器)来实现时间测量,在系统运行时,可以通过读取该计数器来测量,某一个时间信息。

准备工作:

准备基础工程:

首先需要准备一个移植的基础工程,使用库函数版本的跑马灯实验。

UCOSIII工程源码:

在移植uCOS-III之前,首先要获取它的源码。其源码可以从Micrium 的官方网站:www.micrium.com得到。μC/OS-III 是一个操作系统,其实也可以理解成一个软件库,它可以移植到多种硬件平台,如 M3、M4、M7 内核的 STM32,或者 ARM9 等等其他芯片。核心代码肯定是一致的,但是针对不同的处理器肯定要不同的实现部分。若要从 0 开始移植 μC/OS-III 到目标硬件平台,需要极大的精力和软件水平。为了方便移植,我们建议直接下载官网上移植好的基于目标平台的例子。

打开UCOSIII源码的压缩包:

  • EvalBoards:

主要内容是基于评估板(厂商的板子)的应用实现,在我们移植中有部分文件是可以用来使用的,在路径红色方框中我们可以看到官方移植的评估板芯片是STM32F107,但是不影响我们在STM32F103开发板上进行移植

另一个红色方框中的八个文件就是我们所需要添加到工程中的文件

  • uC-CPU:

这是和 CPU 紧密相关的文件,里边的一些文件很重要,都是我们需要使用的,

  1. cpu_core.h文件中包含了适用于所有CPU架构的C代码,也就是常说的通用代码。这是一个很重要的文件,主要包含的函数都是通过CPU进行命名的,时间戳的计算等等,跟CPU底层的移植没有太大依靠硬件实现,这里采用C语言方式,以防止某些CPU不支持前导零指令,该文件还包含用来监测中断关闭事件的函数(中断关闭和打开分别由
    CPU_CRITICAL_ENTER()和 CPU_CRITICAL_EXIT()两个宏实现)。
  2. cpu_core.h 文件包含 cpu_core.c 中函数的原型声明以及其他的一些变量的定义。
  3. cpu_def.h 文件包含 uC/CPU 模块使用的各种#define 常量。
  • 在 ARM-Cortex-M3文件夹下,存在 cpu_c.c 一些对不同编译器移植相关的文件,有 GNU、IAR、RealView,里面都有一些很重要的文件,目前我们使用的开发环境是 MDK(keil),所以我们选择 RealView 文件夹。

点击ARM-cortex-M3文件夹中,常用MDK开发故选择Realview,可以看到如下所示

  1. cpu.h文件中包含了一些类型的定义,使用UCOSIII和其他的模块可以CPU架构和编译器子宽无关。
  2. cpu_a.asm 文件包含了一些用汇编语言编写的函数,可用来开中断和关中断,计算前导零(如果 CPU支持这条指令),以及其他一些只能用汇编语言编写的与 CPU 相关的函数,这个文件中的函数可以从 C 代码中调用。
  3. cpuc.c 文件包含了一些基于特定 CPU 架构但为了可移植而用 C 语言编写的函数 C 代
  • uC-LIB :

文件夹是Micrium 公司提供的官方库,诸如字符串操作、内存操作等接口,可用可不用。一般能用于代替标准库中的一些函数,使得在嵌入式中应用更加方便安全。

  • uCOS-III 

该文件夹是操作系统的内核文件夹,都是系统核心文件。这些文件是我们全部需要的。文件这个文件夹中有两个文件Ports 和 Sourece

μC/OS 是软件,我们的开发板是硬件,软硬件必须有桥梁来连接,这些与处理器架构相关的代码,可以称之为 RTOS 硬件接口层它们位于 μC/OS-III->Ports 文件夹下,在不同的编译器中选择的是不同的我们不需要去理会官方已经帮我们写好了。

Source :

文件夹里面为 UCOSIII 3.0.3的源码

各个文件的作用如下表所示在学习的过程中慢慢了解:

UCOSIII移植:

向基础工程中添加相应的文件夹

在基础工程文件夹中新建一个UCOSIII文件夹,然后将我们下载的官方移植工程中的uC-CPU、uC-LIB 和 UCOS-III 这三个文件复制到工程中

在UCOSIII文件中在建立两个文件夹:UCOS_BSP和UCOS_CONFIG

将下边路径下的八个文件放到UCOS_CINFIG中:

同样复制 Micrium 官方移植好的工程中的相关文件到 UCOS_BSP 文件下,需要复制的文件路径为Micrium\Software\EvalBoards\Micrium\uC-Eval-STM32F107\BSP将下边两个文件移植到自己的所建的UCOSIII_BSP的目录当中。

向工程中添加分组

根据个人习惯向目录中添加6个分组

工程中的分组建立完了之后,我们就要向新建的各个分组当中添加文件了

  • UCOSIII_BSP添加路径:UCOSIII\UCOS_BSP里的bsp.c添加进去
  • UCOSIII_CPU添加路径:UCOSIII\UCOS_CPU里的cpu_core.c添加进去,并继续进入目录ARM-Cortex-M4\RealView选择cpu_a.sam\cpu_c.c两个文件,添加进去
  • UCOSIII_LIB添加路径:UCOSIII\uC-LIB里的,继续点击Ports\ARM-Cortex-M4\RealView,选择All file,添加lib_mem_a.asm文件
  • UCOSIII_CORE添加路径:UCOSIII\uCOS-III\Source,添加所有文件
  • UCOSIII_PORT添加路径:UCOSIII\uCOS-III\Ports\ARM-Cortex-M4\Generic\RealView,选择All file,添加所有文件
  • UCOS_CONFIG添加路径:UCOSIII\UCOS_CONFIG选择All file,添加所有文件

注意:此时有的文件会带一把钥匙,表示不能修改,修改方法:返回工程文件,点击属性,把只读去掉即可进入工程对其修改

上面完成了对.c文件的添加,然后是.h头文件路径的添加

做完这一步我们编辑一下整个工程,结果显示很多错误

常见问题:

下边是正点原子对一些错误的解释:

这里我还要补充一个错误就是下边这个问题

这个问题我推荐看一下这篇博客:http://t.csdnimg.cn/E9VvQ

最后一步就是在注意在os_cpu_c.c中添加#include "includes.h" //添加头文件
移植完成后就需要编写测试软件测试我们移植是否正确,我们建立 3 个任务,其中两个任务分别用于 LED0 和 LED1 闪烁,另外一个任务用于测试浮点计算。

例程:main.c

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "includes.h"
//UCOSIII中以下优先级用户程序不能使用,ALIENTEK
//将这些优先级分配给了UCOSIII的5个系统内部任务
//优先级0:中断服务服务管理任务 OS_IntQTask()
//优先级1:时钟节拍任务 OS_TickTask()
//优先级2:定时任务 OS_TmrTask()
//优先级OS_CFG_PRIO_MAX-2:统计任务 OS_StatTask()
//优先级OS_CFG_PRIO_MAX-1:空闲任务 OS_IdleTask()
//技术支持:www.openedv.com
//淘宝店铺:http://eboard.taobao.com  
//广州市星翼电子科技有限公司  
//作者:正点原子 @ALIENTEK//任务优先级
#define START_TASK_PRIO		3
//任务堆栈大小	
#define START_STK_SIZE 		512
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈	
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);//任务优先级
#define LED0_TASK_PRIO		4
//任务堆栈大小	
#define LED0_STK_SIZE 		128
//任务控制块
OS_TCB Led0TaskTCB;
//任务堆栈	
CPU_STK LED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void *p_arg);//任务优先级
#define LED1_TASK_PRIO		5
//任务堆栈大小	
#define LED1_STK_SIZE 		128
//任务控制块
OS_TCB Led1TaskTCB;
//任务堆栈	
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];
//任务函数
void led1_task(void *p_arg);//任务优先级
#define FLOAT_TASK_PRIO		6
//任务堆栈大小
#define FLOAT_STK_SIZE		128
//任务控制块
OS_TCB	FloatTaskTCB;
//任务堆栈
__align(8) CPU_STK	FLOAT_TASK_STK[FLOAT_STK_SIZE];
//任务函数
void float_task(void *p_arg);int main(void)
{OS_ERR err;CPU_SR_ALLOC();delay_init();       //延时初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断分组配置uart_init(115200);    //串口波特率设置LED_Init();         //LED初始化OSInit(&err);		//初始化UCOSIIIOS_CRITICAL_ENTER();//进入临界区//创建开始任务OSTaskCreate((OS_TCB 	* )&StartTaskTCB,		//任务控制块(CPU_CHAR	* )"start task", 		//任务名字(OS_TASK_PTR )start_task, 			//任务函数(void		* )0,					//传递给任务函数的参数(OS_PRIO	  )START_TASK_PRIO,     //任务优先级(CPU_STK   * )&START_TASK_STK[0],	//任务堆栈基地址(CPU_STK_SIZE)START_STK_SIZE/10,	//任务堆栈深度限位(CPU_STK_SIZE)START_STK_SIZE,		//任务堆栈大小(OS_MSG_QTY  )0,					//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息(OS_TICK	  )0,					//当使能时间片轮转时的时间片长度,为0时为默认长度,(void   	* )0,					//用户补充的存储区(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项(OS_ERR 	* )&err);				//存放该函数错误时的返回值OS_CRITICAL_EXIT();	//退出临界区	 OSStart(&err);  //开启UCOSIIIwhile(1);
}//开始任务函数
void start_task(void *p_arg)
{OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;CPU_Init();
#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err);  	//统计任务                
#endif#ifdef CPU_CFG_INT_DIS_MEAS_EN		//如果使能了测量中断关闭时间CPU_IntDisMeasMaxCurReset();	
#endif#if	OS_CFG_SCHED_ROUND_ROBIN_EN  //当使用时间片轮转的时候//使能时间片轮转调度功能,时间片长度为1个系统时钟节拍,既1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err);  
#endif		OS_CRITICAL_ENTER();	//进入临界区//创建LED0任务OSTaskCreate((OS_TCB 	* )&Led0TaskTCB,		(CPU_CHAR	* )"led0 task", 		(OS_TASK_PTR )led0_task, 			(void		* )0,					(OS_PRIO	  )LED0_TASK_PRIO,     (CPU_STK   * )&LED0_TASK_STK[0],	(CPU_STK_SIZE)LED0_STK_SIZE/10,	(CPU_STK_SIZE)LED0_STK_SIZE,		(OS_MSG_QTY  )0,					(OS_TICK	  )0,					(void   	* )0,					(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR 	* )&err);				//创建LED1任务OSTaskCreate((OS_TCB 	* )&Led1TaskTCB,		(CPU_CHAR	* )"led1 task", 		(OS_TASK_PTR )led1_task, 			(void		* )0,					(OS_PRIO	  )LED1_TASK_PRIO,     	(CPU_STK   * )&LED1_TASK_STK[0],	(CPU_STK_SIZE)LED1_STK_SIZE/10,	(CPU_STK_SIZE)LED1_STK_SIZE,		(OS_MSG_QTY  )0,					(OS_TICK	  )0,					(void   	* )0,				(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR 	* )&err);	//创建浮点测试任务OSTaskCreate((OS_TCB 	* )&FloatTaskTCB,		(CPU_CHAR	* )"float test task", 		(OS_TASK_PTR )float_task, 			(void		* )0,					(OS_PRIO	  )FLOAT_TASK_PRIO,     	(CPU_STK   * )&FLOAT_TASK_STK[0],	(CPU_STK_SIZE)FLOAT_STK_SIZE/10,	(CPU_STK_SIZE)FLOAT_STK_SIZE,		(OS_MSG_QTY  )0,					(OS_TICK	  )0,					(void   	* )0,				(OS_OPT      )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, (OS_ERR 	* )&err);								 OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err);		//挂起开始任务			 OS_CRITICAL_EXIT();	//进入临界区
}//led0任务函数
void led0_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){LED0=0;OSTimeDlyHMSM(0,0,0,200,OS_OPT_TIME_HMSM_STRICT,&err); //延时200msLED0=1;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms}
}//led1任务函数
void led1_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){LED1=~LED1;OSTimeDlyHMSM(0,0,0,500,OS_OPT_TIME_HMSM_STRICT,&err); //延时500ms}
}//浮点测试任务
void float_task(void *p_arg)
{CPU_SR_ALLOC();static float float_num=0.01;while(1){float_num+=0.01f;OS_CRITICAL_ENTER();	//进入临界区printf("float_num的值为: %.4f\r\n",float_num);OS_CRITICAL_EXIT();		//退出临界区delay_ms(500);			//延时500ms}
}


下载验证:

编译下载之后打开串口助手,我们可以看到LED1和led0按照设定好的时间闪烁,串口有信息输出以0.01递增

例程:

链接:https://pan.baidu.com/s/1x1foTZvqQjdjv3QAsGX5QQ 
提取码:k9jr

正点原子的UCOSIII开发手册

链接:https://pan.baidu.com/s/1Za1q0H8giaA-Xkjpcw7Wrg 
提取码:wt2f

相关文章:

uCOSIII实时操作系统 三 移植

目录 uCOSIII简介: 准备工作: 准备基础工程: UCOSIII工程源码: UCOSIII移植: 向基础工程中添加相应的文件夹 向工程中添加分组 常见问题: 下载验证: uCOSIII简介: UCOS-I…...

机器学习之SGD, Batch, and Mini Batch的简单介绍

文章目录 总述SGD(Stochastic Gradient Descent)(随机梯度下降)Batch (批量)mini Batch (迷你批量) 总述 SGD, Batch, and Mini Batch是可用于神经网络的监督学习计算权重更新的方案,即∆wij。 SGD(Stochastic Gradi…...

Windows电脑上的多开器与分布式存储系统的关系

Windows电脑上的多开器和分布式存储系统是两个不同的概念,二者之间没有直接的关系。 多开器是一种软件,它可以在Windows电脑上让用户同时运行多个同一应用程序的实例。多开器通常用于游戏玩家和应用程序测试人员等需要同时运行多个实例的用户。 分布式…...

积分球可以用于什么光谱光学检测

积分球是光测量的主要工具之一。积分球可以同时捕获一个光源发出的所有辐射。 1.光源测量 积分球可以用于测量光源的光通量、色温、光效等参数。通过将光源放置在积分球的入口处,球内的光线经过多次反射后形成均匀的照度分布,然后使用光度计或光谱仪对光…...

【力扣面试题】URL化

👑专栏内容:力扣刷题⛪个人主页:子夜的星的主页💕座右铭:前路未远,步履不停 目录 一、题目描述二、题目分析1、使用String内部方法2、使用StringBuilder 一、题目描述 题目链接:URL化 编写一种…...

计算机网络基础(二):物理层、数据链路层及网络层

一、物理层 1.物理层 物理层面的通信标准可以概括划分为与网络基础设施有关的标准和与被传输物理信号有关的标准两类。 网络基础设施的标准:鉴于物理层面的消息互通也是物理层应该兑现的服务,因此物理层的标准还会包括针脚的用途、线缆的材料与设计等…...

小白自学—网络安全(黑客技术)笔记

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类…...

2.2.3 vim操作合集

1 vim VIM 是 Linux 系统上一款文本编辑器,学习 VIM 最好的文档,应该是阅读学习 VIM 的帮助文档,可以使用本地的帮助文件(vim--->:help),或者使用在线帮助文档。同时针对vim的使用,相应的相书籍也很多,如下 2 vim操作模式 命令模式:默认模式,该模式下可以移动光标…...

解决 Jenkins 性能缓慢的问题~转

解决 Jenkins 性能缓慢的问题 Docker中文社区 ​​ 计算机技术与软件专业技术资格持证人 2 人赞同了该文章 没有什么比缓慢的持续集成系统更令人沮丧的了。它减慢了反馈循环并阻止代码快速投入生产。虽然像使用性能更好的服务器可以为您争取时间,但您最终必须投资…...

Matrix卡顿优化之IdleHandlerLagTracer源码分析

前言 IdleHandler是Android系统为开发者提供的一种在消息队列空闲时运行任务的机制,通过IdleHandler执行的任务优先级低于主线程优先级,会在主线程任务执行完成后再执行,所以适用于一些实时性要求不高的任务,通常用于Android启动…...

(ubuntu)Docker 安装linux 详情过程

文章目录 前言Docker 安装linux第一步:使用dokcker 拉取镜像:第二步:创建本地目录(用于挂载)第三步:(上传配置文件)修改配置文件第四步:创建docker容器第五步: 测试本地连…...

ArcMap:第二届全国大学生GIS技能大赛(广西师范学院)详解-上午题

目录 01 题目 1.1 第一小题 1.2 第二小题 1.3 第三小题 1.4 数据展示 02 思路和实操 2.1 第一问思路 2.2 第一问操作过程 2.2.1 地理配准 2.2.2 镶嵌 2.2.2.1 第一种镶嵌方法 2.2.2.2 第二种镶嵌方法 2.2.3 裁剪 2.2.4 DEM信息提取 2.2.5 分类 2.3 第二问思路 …...

Blender 导出 fbx 到虚幻引擎中丢失材质!!!(使用Blender导出内嵌材质的fbx即可解决)

目录 0 引言1 Blender导出内嵌纹理的fbx模型 0 引言 我在Blender处理了一些fbx模型后再次导出到UE中就经常出现,材质空白的情况(如下图所示),今天终于找到问题原因,记录下来,让大家避免踩坑。 其实原因很简…...

C++交换a和b的方法

以下是用C编写的交换a和b的六种方法&#xff1a; 1. 方法一&#xff1a;使用临时变量 #include <iostream>int main() {int a 5;int b 10;std::cout << "Before swapping: a " << a << ", b " << b << std::end…...

3D孪生场景搭建:模拟仿真

前面几期文章介绍如何使用NSDT 编辑器 搭建3D应用场景&#xff0c;本期介绍下孪生场景中一个一个非常重要的功能&#xff1a;模拟仿真。 1、什么是模拟仿真 模拟仿真是一种用于描述、分析和模拟现实世界中系统、过程或事件的计算机模型和程序。仿真通过输入各种参数和条件&am…...

美国各流域边界下载,并利用arcgis提取与处理

一、边界数据的下载 一般使用最普遍的流域边界数据是从HydroSHEDS官网下载: HydroBASINS代表一系列矢量多边形图层&#xff0c;以全球尺度呈现次级流域边界。该产品的目标是提供一种无缝的全球覆盖&#xff0c;其中包含了不同尺度&#xff08;从数十到数百万平方千米&#xf…...

A Survey and Framework of Cooperative Perception 论文阅读

论文链接 A Survey and Framework of Cooperative Perception: From Heterogeneous Singleton to Hierarchical Cooperation 0. Abstract 首次提出统一的 CP&#xff08;Cooperative Percepetion&#xff09; 框架回顾了基于不同类型传感器的 CP 系统与分类对节点结构&#x…...

【SkyWalking】SkyWalking是如何实现跨进程传播链路数据?

文章目录 一、简介1 为什么写这篇文章2 跨进程传播协议-简介 二、协议1 Standard Header项2 Extension Header项3 Correlation Header项 三、跨进程传播协议的源码分析1 OpenTracing规范2 通过dubbo插件分析跨进程数据传播3 分析跨进程传播协议的核心源码 四、小结参考 一、简介…...

px4仿真实现无人机自主飞行

一,确定消息类型 无人机通过即在电脑是现自主飞行:思路如下。 通过Mavros功能包,将ROS消息转换为Mavlink消息。实现对无人机的控制。 几种消息之间的关系如下: 对于ROS数据,就是我们机载电脑执行ROS系统的数据。 对于Mavros消息,就是Mavros功能包内部的消息。查询网站…...

详解Linux的系统调用fork()函数

在Linux系统中&#xff0c;fork()是一个非常重要的系统调用&#xff0c;它的作用是创建一个新的进程。具体来说&#xff0c;fork()函数会在当前进程的地址空间中复制一份子进程&#xff0c;并且这个子进程几乎完全与父进程相同&#xff0c;包括进程代码、数据、堆栈以及打开的文…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库&#xff0c;用于数据验证和设置管理&#xff0c;通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发&#xff08;如 FastAPI&#xff09;、配置管理和数据解析&#xff0c;核心功能包括&#xff1a; 数据验证&#xff1a;通过…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...