基于RT-Thread驱动EEPROM_AD24C02
基于RT-Thread驱动EEPROM_AD24C02
- 前言
- 一、硬件设计
- 二、软件设计
- 三、测试
- 1、eeprom_test()测试
- 2、基础操作字节实验
- 3、多字节读写
前言
- 存储容量2048位,内部组织256x8(2K),即256个字节的存储单元;分为16页,每页16个字节。
- 具有写保护,擦写寿命1,000,000次,数据保存期限100年。
- 写操作可按字节写,也可按页写。
- I2C通信,器件从机写地址0x50, 从机读地址0x51
一、硬件设计
- WP引脚上拉,这个引脚是写保护引脚,低电平解开保护,可以读写。高电平写保护,
- 通过IIC即可与之通信。
二、软件设计
-
创建工程
-
打开RT-Thread Settings
-
打开I2C设备驱动程序
-
使能I2C模块
-
进入board.h打开I2C1的的宏定义,SCL跟SDA引脚的绑定需要根据你实际硬件连接去修改。
-
主函数中这么写
-
在applications文件夹下新建一个system_deal文件夹,然后再在system_deal文件夹下新建一个system_deal.c和system_deal.h文件,这个文件夹里我放一个给板子闪灯的程序,判断板子是否跑起来
-
在system_deal.c文件里这么写
/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2025-04-18 Administrator the first version*/#include "system_deal.h"/*********************************************************************************************************** Function name: SystemLedRun** Descriptions: System Led Run** input parameters: NONE** output parameters: NONE** Returned value: NONE*********************************************************************************************************/
static void SystemLedRun(void)
{static uint8_t l_ucmode = 0;if (l_ucmode == 0){rt_pin_write(SYS_LED, PIN_HIGH);l_ucmode = 1;}else if (l_ucmode == 1){rt_pin_write(SYS_LED, PIN_LOW);l_ucmode = 0;}
}/*********************************************************************************************************** Function name: SysDeal_thread** Descriptions: SysDeal thread** input parameters: parameter** output parameters: NONE** Returned value: NONE*********************************************************************************************************/
static void SysDeal_thread(void* parameter)
{// set pinrt_pin_mode(SYS_LED, PIN_MODE_OUTPUT);rt_pin_write(SYS_LED, PIN_HIGH);while(1){SystemLedRun(); //闪个灯rt_thread_mdelay(500);}}/*********************************************************************************************************** Function name: SystemDealTaskInit** Descriptions: System Task Init** input parameters: NONE** output parameters: NONE** Returned value: NONE*********************************************************************************************************/
void SystemDealTaskInit(void)
{rt_thread_t SysDeal_tid;SysDeal_tid = rt_thread_create("sys_ctl", SysDeal_thread, RT_NULL, SYS_THREAD_STACK, SYS_THREAD_PRO, SYS_THREAD_TICK);if (SysDeal_tid != RT_NULL){rt_thread_startup(SysDeal_tid);}else{
#if DEBUG_LOG_ENABLErt_kprintf("/--> SysDeal create failed!\n");
#endif}
}/*********************************************************************************************************** Function name: SystemTaskInit** Descriptions: System Task Init** input parameters: NONE** output parameters: NONE** Returned value: NONE*********************************************************************************************************/
static void SystemTaskInit(void)
{SystemDealTaskInit(); // 15}/*********************************************************************************************************** Function name: SystemStartInit** Descriptions: System Start Init** input parameters: NONE** output parameters: NONE** Returned value: NONE*********************************************************************************************************/
void SystemStartInit(void)
{SystemTaskInit();
}
- 在system_deal.h文件里这么写
/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2025-04-18 Administrator the first version*/
#ifndef APPLICATIONS_SYSTEM_DEAL_SYSTEM_DEAL_H_
#define APPLICATIONS_SYSTEM_DEAL_SYSTEM_DEAL_H_#include <rtdevice.h>
#include <rtthread.h>
#include "board.h"
#include "stdio.h"/* system io */
#define SYS_LED GET_PIN(G, 13)/* thread information */
#define SYS_THREAD_STACK 1024
#define SYS_THREAD_PRO 15
#define SYS_THREAD_TICK 10extern void SystemStartInit(void);#endif /* APPLICATIONS_SYSTEM_DEAL_SYSTEM_DEAL_H_ */
- 在applications文件夹下新建drv_ad24c02文件夹,再在drv_ad24c02文件夹下新建drv_ad24c02.c和drv_ad24c02.h文件,这个文件夹里写的是ad24c02的驱动
- 在drv_ad24c02.c文件里这么写
/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2025-04-18 Administrator the first version*/
#include "drv_ad24c02.h"static struct rt_i2c_bus_device *i2c_bus = RT_NULL;
/*** eeprom write byte* @note This operation is write one bye to eeprom.** @param addr: the data address to write* data: the data write to the address** @return >= 0: successful* -1: error**/
rt_err_t eeprom_write_byte(uint8_t addr, uint8_t data)
{struct rt_i2c_msg msg;uint8_t buffer[2];buffer[0] = addr;buffer[1] = data;msg.addr = EEPROM_I2C_ADDR;msg.flags = RT_I2C_WR;msg.buf = buffer;msg.len = 2;if(rt_i2c_transfer(i2c_bus, &msg, 1) != 1){rt_kprintf("eeprom i2c data write error.\n");return RT_ERROR;}rt_thread_mdelay(5);return RT_EOK;
}
/*** eeprom read byte* @note This operation is read one bye from eeprom.** @param addr: the data address to read** @return data: the data read from the address***/
uint8_t eeprom_read_byte(uint8_t addr)
{struct rt_i2c_msg msg;uint8_t buffer[2];uint8_t data;msg.addr = EEPROM_I2C_ADDR;msg.flags = RT_I2C_WR;buffer[0] = addr;msg.buf = buffer;msg.len = 1;rt_i2c_transfer(i2c_bus, &msg, 1);msg.flags = RT_I2C_RD;msg.buf = &data;rt_i2c_transfer(i2c_bus, &msg, 1);return data;
}
/*** eeprom check* @note This operation is check eeprom.** @param** @return >= 0: successful* -1: error**/
static rt_err_t eeprom_check(uint8_t data)
{uint8_t temp;temp = eeprom_read_byte(EEPROM_SIZE - 1);if(temp != data){eeprom_write_byte(EEPROM_SIZE - 1, data);rt_thread_mdelay(5);temp = eeprom_read_byte(EEPROM_SIZE - 1);if(temp != data){
#if 1rt_kprintf("eeprom check data [0x%02X] not equal read data [0x%02X].\n", data, temp);
#endifreturn RT_ERROR;}rt_kprintf("eeprom check data [0x%02X] equal read data [0x%02X].\n", data, temp);}return RT_EOK;
}/*** eeprom init* @note This operation is eeprom init.** @param** @return >= 0: successful* -1: error**/
rt_err_t eeprom_init(void)
{i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(EEPROM_I2C_BUS_NAME);if (i2c_bus == RT_NULL){rt_kprintf("eeprom i2c bus find error.\n");return RT_ERROR;}rt_pin_mode(EEPROM_WP_PIN, PIN_MODE_OUTPUT);rt_pin_write(EEPROM_WP_PIN, PIN_LOW);if(eeprom_check(EEPROM_CHECK_VALUE) != RT_EOK){rt_kprintf("eeprom check error.\n");return RT_ERROR;}else {rt_kprintf("eeprom check success.\n");}return RT_EOK;
}/*** eeprom test* @note This operation is test eeprom.** @param** @return >= 0: successful* -1: error**/
static int eeprom_test(void)
{rt_uint8_t *rw_buf = RT_NULL;rw_buf = (rt_uint8_t *)rt_malloc(EEPROM_SIZE); //分配一个256字节大小的空间eeprom_init();//erase eepromfor(rt_uint16_t addr = 0; addr < EEPROM_SIZE; addr++){if(RT_EOK == eeprom_write_byte(addr, 0)){rt_kprintf("address [0x%02X] erase OK.\n", addr);}else{rt_kprintf("address [0x%02X] erase failed.\n", addr);}}rt_kprintf("\n");rt_thread_mdelay(1000);//read eepromfor(rt_uint16_t addr = 0; addr < EEPROM_SIZE; addr++){rw_buf[addr] = eeprom_read_byte(addr);rt_kprintf("address [0x%02X] data is [%d].\n", addr, rw_buf[addr]);}rt_kprintf("\n");rt_thread_mdelay(1000);//write eepromfor(rt_uint16_t addr = 0; addr < EEPROM_SIZE; addr++){if(RT_EOK == eeprom_write_byte(addr, 0XFF)){rt_kprintf("address [0x%02X] write OK.\n", addr);}else{rt_kprintf("address [0x%02X] write failed.\n", addr);}}rt_kprintf("\n");rt_thread_mdelay(1000);//read eepromfor(rt_uint16_t addr = 0; addr < EEPROM_SIZE; addr++){rw_buf[addr] = eeprom_read_byte(addr);rt_kprintf("address [0x%02X] data is [%d].\n", addr, rw_buf[addr]);}//freert_free(rw_buf);return RT_EOK;
}
MSH_CMD_EXPORT(eeprom_test, eeprom test);static void basic_test(int argc, char** argv)
{if (argc != 3){rt_kprintf("Usage: basic_test [addr(0-255)] [data(0-255)]\n");return;}uint8_t addr = atoi(argv[1]);uint8_t wr_data = atoi(argv[2]);// 写入并验证eeprom_write_byte(addr, wr_data);uint8_t rd_data = eeprom_read_byte(addr);rt_kprintf("Immediate read: Addr 0x%02X => Wr:0x%02X Rd:0x%02X %s \r\n",addr, wr_data, rd_data, (wr_data == rd_data) ? "OK" : "FAIL");// 重启后验证rt_kprintf("Power cycle device and run again to check persistence");
}
MSH_CMD_EXPORT(basic_test, basic single-byte test);static void read_test(int argc, char** argv)
{if(argc != 2){rt_kprintf("Usage: read_test [addr(0-255)]\n");return;}uint8_t addr = atoi(argv[1]);uint8_t rd_data = eeprom_read_byte(addr);rt_kprintf("Immediate read: Addr %d => Rd:%d \r\n",addr, rd_data);}
MSH_CMD_EXPORT(read_test, read single-byte test);
- 在drv_ad24c02.h文件里这么写
/** Copyright (c) 2006-2021, RT-Thread Development Team** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2025-04-18 Administrator the first version*/
#ifndef APPLICATIONS_DRV_AD24C02_DEAL_DRV_AD24C02_H_
#define APPLICATIONS_DRV_AD24C02_DEAL_DRV_AD24C02_H_#include <rtdevice.h>
#include <rtthread.h>
#include "board.h"
#include "stdio.h"
#include "stdlib.h"#define EEPROM_I2C_BUS_NAME "i2c1"
#define EEPROM_I2C_ADDR 0x50 //0xA0 << 1
#define EEPROM_SIZE 256 //Byte
#define EEPROM_CHECK_VALUE 0x5A/*********************************eeprom**************************************************/
#define EEPROM_WP_PIN GET_PIN(B, 4)extern rt_err_t eeprom_init(void); //ad24c02初始化
#endif /* APPLICATIONS_DRV_AD24C02_DEAL_DRV_AD24C02_H_ */
- 包含头文件
- 找个位置进行ad24c02初始化
- 包含一下ad24c02驱动头文件
- 编译通过
三、测试
1、eeprom_test()测试
在MSH中使用命令行敲出eeprom_test进行测试。
-
先打help可以看到目前有什么指令,然后输入eeprom_test进行测试,按TAB键可以自动补齐。
-
该测试函数首先会往eeprom的256个字节中写0,一个字节一个字节的写,每写成功一个都会返回erase OK
-
写完后,又会再读出来,可以看到我们写进去是0,那读出来也是0
-
然后又往这256个字节里面写,不过这回写的是0XFF
-
然后再读,0XFF对应十进制就是255。
-
检查打印,看是否都写成功,然后读出来是否是前面一次是0,后面这次是255。如果符合预期,说明咱的eeprom驱动写得没问题了。
2、基础操作字节实验
步骤:
- 在指定地址写入特定值
- 立即读取验证
- 断电重启再次读取验证持久性
在MSH中敲出命令行,使用basic_test ,第一个参数写地址,第二个参数写数据
可以看到有返回,当然我们写进去的地址跟数据使用的是十进制,返回的使用的是十六进制,所以看起来不一样,自己换算一下可以发现是一样的。
我们再用read_test去读这个23地址,我们刚刚就在这个23地址中写入了66
可以发现读出来的是66
进行一次重启(即掉电),可以发现读出来的还是66,说明eeprom是起作用的
3、多字节读写
新增这两个函数,这两个函数可以进行多字节读写
int16_t eeprom_write_params(uint8_t *buf, int16_t start_index, int16_t buf_len)
{static int write_count = 0;rt_kprintf("[EEPROM] write count : %d, write len : %d\n", ++write_count, buf_len);if (start_index + buf_len >= EEPROM_SIZE){rt_kprintf("EEPROM write params assert\n");return RT_ERROR;}// Write data to EEPROMfor (int16_t i = 0; i < buf_len; i++){if (eeprom_write_byte(start_index + i, buf[i]) != RT_EOK){rt_kprintf("EEPROM write error at address %d\n", start_index + i);return RT_ERROR;}}// Verify the written datauint8_t tmp_mem[buf_len];for (int16_t i = 0; i < buf_len; i++){tmp_mem[i] = eeprom_read_byte(start_index + i);if (tmp_mem[i] != buf[i]){rt_kprintf("EEPROM write verify failed at address %d\n", start_index + i);return RT_ERROR;}else{rt_kprintf("EEPROM write verify success at address %d\n", start_index + i);}}return RT_EOK;
}//eeprom read
int16_t eeprom_read_params(uint8_t *buf, int16_t start_index, int16_t buf_len)
{if (start_index + buf_len >= EEPROM_SIZE || buf == RT_NULL){rt_kprintf("EEPROM read params assert\n");return RT_ERROR;}// Read data from EEPROMfor (int16_t i = 0; i < buf_len; i++){buf[i] = eeprom_read_byte(start_index + i);}return RT_EOK;
}
再新加这个测试函数,用于验证
void eeprom_tes2(void)
{uint8_t write_buf[TEST_DATA_SIZE] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};uint8_t read_buf[TEST_DATA_SIZE] = {0};int16_t start_index = 0;// 初始化 EEPROMif (eeprom_init() != RT_EOK){rt_kprintf("EEPROM initialization failed\n");return;}// 向 EEPROM 写入数据if (eeprom_write_params(write_buf, start_index, TEST_DATA_SIZE) != RT_EOK){rt_kprintf("EEPROM write params failed\n");return;}rt_thread_mdelay(100); // 适当延时,确保写入完成// 从 EEPROM 读取数据if (eeprom_read_params(read_buf, start_index, TEST_DATA_SIZE) != RT_EOK){rt_kprintf("EEPROM read params failed\n");return;}// 验证写入和读取的数据是否一致for (int16_t i = 0; i < TEST_DATA_SIZE; i++){if (write_buf[i] != read_buf[i]){rt_kprintf("Data verification failed at index %d: write %d, read %d\n", i, write_buf[i], read_buf[i]);return;}}rt_kprintf("EEPROM read and write test passed\n");
}MSH_CMD_EXPORT(eeprom_tes2, EEPROM read and write test);
验证结果
相关文章:
基于RT-Thread驱动EEPROM_AD24C02
基于RT-Thread驱动EEPROM_AD24C02 前言一、硬件设计二、软件设计三、测试1、eeprom_test()测试2、基础操作字节实验3、多字节读写 前言 存储容量2048位,内部组织256x8(2K),即256个字节的存储单元ÿ…...
VUE中通过DOM导出PDF
最终效果 前端导出PDF的核心在于样式的绘制上,这里其实直接使用CSS进行绘制和布局就行,只不过需要计算好每页DIV盒子的大小,防止一页放不下造成样式错乱。 项目依赖 项目是Vue3 TS npm i html2canvas1.4.1 npm i jspdf3.0.1工具类(htmlToPdf…...
sql语句面经手撕(定制整理版)
一张表 店铺id 商品id 销售数量 问:查询总销售数量最多的店铺 SELECT shop_id,SUM(quantity) AS total_quantity FROM sales GROUP BY shop_id ORDER BY total_quantity DESC LIMIT 1; 学生总分名最高的 SELECT student_id,SUM(score) AS total_score FROM score…...
pdf 不是扫描件,但却无法搜索关键词【问题尝试解决未果记录】
一、不是扫描件但不能搜索的原因 1. 情况一:文字被转成了“图形文字” 有些PDF文件虽然看起来像是文字,其实是图片或者矢量图格式,不能直接搜索。 2. 情况二:PDF被加密 有些PDF设置了“内容复制/提取”权限受限,即使…...
android14优化ntp时间同步
简介 网络时间协议NTP(Network Time Protocol)是TCP/IP协议族里面的一个应用层协议,用来使客户端和服务器之间进行时钟同步,提供高精准度的时间校正。 当机器的ntp时间同步出现问题时,可以从ntp配置方面进行优化&…...
【Ansible】之inventory主机清单
前言 本篇博客主要解释Ansible主机清单的相关配置知识 一、inventory 主机清单 Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。 如果是名称类似的主机,可以使用列表的方式表示各个主机…...
QT5.14安装以及新建基础项目
进入qt中文网站:Qt | 软件开发全周期的各阶段工具 额,考虑新手可能还是找不到,我就分享一下我下载的的吧 通过网盘分享的文件:qt-opensource-windows-x86-5.14.2.exe 链接:https://pan.baidu.com/s/1yQTRp-b_ISje5B3UWb7Apw?pw…...
Git 用法总结
换到新项目组后,没有好好使用git 。有点疲劳了。 不过还是建议能提尽提。少提 多提。与己方便。与人方便 1,拉取最新分支后。先不要直接改代码,可以根据修改需求。创建本地分支 git checkout -b feature/wlan 。 然后你改代码。改了后。合…...
付费专栏·Python潮流周刊电子书合集(epub、pdf、markdown)下载
付费专栏 Python 潮流周刊目前年费 148,全年约 50 期。 这里分享的是前 60 期的精美电子书,包含有多种不同版本(epub、pdf 和 markdown),免费下载(下载方式见文末)。 展示 pdf 版本的部分精美…...
o.redisson.client.handler.CommandsQueue : Exception occured. Channel
1, 版本 <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>2.15.2</version> </dependency>2,问题 2025-05-12 10:46:47.436 ERROR 27780 --- [sson-netty-5-…...
养生:拥抱健康生活的全方位指南
养生是一种综合性的健康管理方式,旨在通过多种方法颐养生命、增强体质、预防疾病,以实现延年益寿的目标1。以下为你详细介绍养生的各个方面: 心态养生:塑造健康心灵的基石 保持积极心态:积极的心态能提升生活质量&am…...
CSS3 伪元素(Pseudo-elements)大全
CSS3 伪元素(Pseudo-elements)大全 CSS3 伪元素用于选择元素的特定部分,以双冒号 :: 开头(CSS3 规范推荐写法,但单冒号 : 也支持以保持向后兼容)。 主要 CSS3 伪元素列表 ::before 在元素内容前插入生成的…...
养生:开启健康生活的全新篇章
养生是一场关乎生活品质与身心健康的持续修行,从饮食调养到运动锻炼,从睡眠管理到心态塑造,每个环节都对健康有着深远影响。以下为你提供全面且实用的养生指南。 饮食养生:科学膳食,滋养生命 合理的饮食是养生的根基…...
解读RTOS:第一篇 · RTOS 基础与选型指南
1. 引言 在嵌入式系统开发中,随着产品功能的不断丰富和系统复杂度的急剧上升,裸机循环往复的 main() 与中断驱动模式已难以满足项目的实时响应、任务隔离与资源管理需求。RTOS(实时操作系统)因其对任务管理、调度和通信机制的内建支持,成为越来越多嵌入式产品的首选。本文…...
基于Vue3.0的高德地图api教程005:实现绘制线并编辑功能
文章目录 6、绘制多段线6.1 绘制多段线6.1.1 开启绘制功能6.1.2 双击完成绘制6.1.3 保存到数据库6.2 修改多段线6.2.1 点击线,进入编辑模式6.2.2 编辑线6.3 完整代码6、绘制多段线 6.1 绘制多段线 6.1.1 开启绘制功能 实现代码: const changeSwitchDrawPolyline = ()=>…...
C++ asio网络编程(5)简单异步echo服务器
上一篇文章:C asio网络编程(4)异步读写操作及注意事项 文章目录 前言一、Session类1.代码2.代码详解3.实现Session类1.构造函数2.handle_read3.介绍一下boost的封装函数和api4.handle_write 二、Server类1.代码2.代码思路详解 三、客户端四、运行截图与流程图 前言 提示&…...
VBA会被Python代替吗
VBA不会完全被Python取代、但Python在自动化、数据分析与跨平台开发等方面的优势使其越来越受欢迎、两者将长期并存且各具优势。 Python以其易于学习的语法、强大的开源生态系统和跨平台支持,逐渐成为自动化和数据分析领域的主流工具。然而,VBA依旧在Exc…...
在Web应用中集成Google AI NLP服务的完整指南:从Dialogflow配置到高并发优化
在当今数字化客服领域,自然语言处理(NLP)技术已成为提升用户体验的关键。Google AI提供了一系列强大的NLP服务,特别是Dialogflow,能够帮助开发者构建智能对话系统。本文将详细介绍如何在Web应用中集成这些服务,解决从模型训练到高并发处理的全套技术挑战。 一、Dialogflow…...
Linux服务器连接SSH工具FinalShell安装使用支持Linux文件上传下载
前言 记录连接Linux服务器SSH工具FinalShell,支持可视化上传下载及查看服务器负载状态 安装使用 安装地址 官网下载:https://finalshell-ssh.com/ 通过网盘分享的文件:shell 链接: https://pan.baidu.com/s/1ZFcD_Js-r_lE3IV8wuuA5A?pwde72f 提取码:…...
【Java ee初阶】IP协议
网络层 IP 协议 1) 地址管理 针对网络上的各种设备,所在的位置,进行描述和区分 > IP 地址 2) 路由选择 网络结构非常复杂 挑选出合适的路径 IP 协议的报文结构 ipv4 ipv6 其他版本没有大规模推广使用~~ IP 协议中,报头也是变长的&a…...
WSL-Ubuntu 中安装 Git LFS 记录
#记录工作 一、问题背景 在 Windows Subsystem for Linux(WSL)的 Ubuntu 环境下进行开发时,当我们需要管理 Git 仓库中的大文件,使用 Git LFS(Large File Storage)是一个很好的解决方案。但在执行git lfs…...
Ubuntu源码版comfyui的安装
Comfyui也出桌面版了,但是想让大家多个人都使用怎么办呢?也有方法,安装Linux版,启动后会生成个网页地址,打开就能用了。 1、先来看下本地安装环境配置: 系统:Ubuntu 22.04 内存:2…...
Clang实现C++文件分析,含Python实战
最近的项目,需要获取到C代码中的Git修改过的函数信息,决定通过抽象语法树AST的方式,分析出文件内容后,通过匹配git diff修改的行号信息得知是什么函数。了解到Clang 能够进行C、C代码的分析,记录一下。 一、Clang AST…...
MFC listctrl修改背景颜色
在 MFC 中修改 ListCtrl 控件的行背景颜色,需要通过自绘(Owner-Draw)机制实现。以下是详细的实现方法: 方法一:通过自绘(Owner-Draw)实现 步骤 1:启用自绘属性 在对话框设计器中选…...
[Git]ssh模式每次提交都要输入密码
问题描述 连接用的ssh,不是https。每次git提交都要输入密码,很麻烦。 原因分析 ssh模式需要在git服务端保存密钥,不然每次都会校验用户的身份。 解决方案 1.生成密钥 进到用户路径下 C:\Users\szx\, 打开bash 生成密钥: s…...
请解释 React Native 的新架构(Fabric 和 TurboModules)与旧架构的主要区别
React Native 的新架构(Fabric 和 TurboModules)是对旧架构的重大革新,主要解决了旧架构在性能、线程模型和原生互操作性等方面的瓶颈。以下是新旧架构的核心区别: 1. 线程模型与异步通信 旧架构: 三层线程模型&…...
大小端的判断方法
大小端(Endianness) 是计算机存储多字节数据(如整数、浮点数)时的两种不同方式,决定了字节在内存中的排列顺序。 1. 大端(Big-Endian) 高位字节存储在低地址,低位字节存储在高地址。…...
技术视界 | 青龙机器人训练地形详解(四):复杂地形精讲之斜坡
在前几篇文章中,我们依次讲解了如何创建一个地形、如何将地形添加到训练环境中,并在上一期深入分析了复杂地形之一——台阶地形的创建方式与训练意义。本文将继续聚焦复杂地形训练中另一类代表性地形——斜坡(Slope)与金字塔斜坡&…...
典籍知识问答重新生成和消息修改Bug修改
1.Bug: {messageId: "temp-user-1747051925999",…} messageId : "temp-user-1747051925999" newContent : "关于选中的内容:\"The ancient people lived long by following natural laws\",我的问题是&…...
交易所开发-如何开发一个交易所
交易所开发全流程指南:从架构设计到合规落地 ——2025年数字资产交易平台的构建逻辑与技术实践 一、开发核心流程:五阶段方法论 1. 需求定位与合规先行 市场细分:明确交易所类型(CEX、DEX或混合型),选择目…...
工具篇-如何在Github Copilot中使用MCP服务?
Model Context Protocol (MCP) 是由 Anthropic 公司于 2024 年 11 月推出的一种开放协议标准,目的在于标准化 LLM 与外部数据源、工具及服务之间的交互方式。 MCP 被广泛类比为 “AI 领域的 USB-C 接口 ”。 一、vscode的安装 下载vscode Visual Studio …...
MATLAB机器人系统工具箱中的loadrobot和importrobot
loadrobot和importrobot是 MATLAB 机器人系统工具箱中用于创建机器人模型的两个核心函数,它们的主要区别可以从以下几个方面来理解: 1. 模型来源 loadrobot 直接加载工具箱预定义的机器人模型(如 UR5e、Panda、Kinova 等)。这些模…...
django之视图
django vs drf 首先要区分django 和 django rest framework(drf)。 django是前后端不分离的,后端写模板(template)渲染成html之后返回给浏览器。 drf是适应前后端分离的架构,基于django做的封装,提供的rest API规范…...
深入探讨dubbo组件的实践
目录 1、dubbo概述 1.1、介绍 1.2、RPC 1.3、区别 1.4、优点 2、dubbo分层 2.1、层级分类 1. Service 服务层(业务层) 2. Config 配置层 3. Proxy 服务代理层 4. Registry 注册中心层 5. Cluster 集群容错层 6. Monitor 监控层 7. Protoco…...
2.1 微积分基本想法
总结性表达 微积分的核心思想在于用简单图形逼近复杂形状的面积。牛顿与莱布尼茨通过"以直代曲"的突破性思路,将曲线围成的面积分解为无限个矩形之和,形成两大核心工具: 极限思想:通过无限细分矩形底边(Δ…...
学习threejs,使用Physijs物理引擎,加载各种几何体网格对象
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...
Excel分组计算求和的两种实现方案
文章目录 背景样例数据方案一、函数求和实现步骤 方案二、数据透视表实现步骤 背景 在Excel文档中,经常会进行数据的求和计算,可使用不同的方式实现,记录下来,方便备查。 样例数据 已有商品销量信息,包含销售日期、…...
nestjs[一文学懂如何在nestjs中对npm功能包封装]
问题描述 NPM(Node Package Manager)是Node.js的包管理工具,它允许开发者轻松地分享、安装和管理依赖包,促进了代码的复用性和项目协作。而npm插件库将是nodejs开发中不可缺失的重要组成因素。 在nestjs中,官方已经给…...
PHP 连接和使用 Kafka 的指南
首先说明,我的是系统版本是:Ubuntu 22.04.3,下面是详细步骤 ###### PHP 连接和使用 Kafka 的指南 ###### # 安装依赖 sudo apt-get install -y librdkafka-dev # 安装必要的依赖 # 对于 Ubuntu/Debian sudo apt-get update sudo apt-get in…...
# 07_Elastic Stack 从入门到实践(七)---1
07_Elastic Stack 从入门到实践(七)—1 一、Filebeat入门之读取 Nginx 日志文件 1、首先启动 Elasticsearch 集群 和 Nginx 服务,打开GoogleChrome 浏览器,点击 elasticsearch-head 插件,连接Elasticsearch 集群 服务器。 # 查看网卡名 $ ip addr# 修改网卡配置,改为…...
CSS-PureCss样式开发
CSS-PureCss样式开发 1-开发说明 1-引入Pure.css2-直接拷贝代码 2-参考网址 purecss中文网 3-代码模板 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"wid…...
学习笔记:Conda 环境共享
1. 环境共享的重要性 环境共享是协作项目中非常实用的功能,它能确保整个项目的协作人员都使用相同的软件包,并保证这些包的版本正确。这可以避免因环境配置不同而导致的“在我的机器上可以运行”之类的问题。 2. 导出当前环境配置 如果需要将当前的 C…...
蓝牙AVDTP协议概述
1.AVDTP 概念 AVDTP 即 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL(音视频分配传输协 议),主要负责 A/V stream 的协商、建立及传输程序,还指定了设备之前传输 A/V stream 的消息格式. AVDTP 的传输机制和消息格式是以 RTP 为基…...
Java面试终极篇:Sentinel+Seata+Kafka Streams高并发架构实战
面试官:张总(严肃脸) 程序员:小王(紧张冒冷汗) 第一轮:分布式基础 张总:说说Spring Cloud Alibaba的Sentinel和Nacos的区别? 小王:(结巴&#…...
提权相关记录
Windows potato本地提权 常见potato提权:BadPotato、EfsPotato、SweetPotato、JuicyPotato0、PrintNotifyPotato、RottenPotato 提权前置条件:拥有SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限其中一个。 可以通过命令whoami /priv或whoa…...
信息化、数字化、数智化之间的区别和联系
在如今这个信息技术飞速发展的时代,我们常常会听到“信息化”、“数字化”和“数智化”这三个术语。对于大多数人来说,这些词汇听起来既高深又晦涩,但其实它们和我们的生活、工作密切相关。如果你能理解它们的概念与区别,你不仅能…...
制造业IT管理方法论:柔性变更与数据治理的融合实践
1. 引言 随着工业4.0时代的深入发展,信息技术(IT)与运营技术(OT)的融合日益紧密,对制造企业的IT管理提出了前所未有的挑战与机遇。传统的IT管理框架,如ITIL(信息技术基础架构库&…...
深入了解 gmx_RRCS:计算原理、操作步骤及输出文件解析
前段时间,我写了一篇介绍gmx_RRCS的推文,之后有不少人希望我能再出一个更详细的版本,尤其是对gmx_RRCS输出文件含义进行解读。大家的反馈我都看到了,所以准备再写一篇,仔细讲讲输出文件里各项内容是什么意思࿰…...
MySQL 8.0 OCP 1Z0-908 题目解析(1)
题目001 Choose two. User fwuserlocalhost is registered with the SQL Enterprise Firewall and has been granted privileges for the sakila database. Examine these commands that you executed and the results: mysql> SELECT MODE FROM INFORMATION_SCHEMA.SQL…...
【漫话机器学习系列】254.假设空间(Hypothesis Space)
假设空间(Hypothesis Space)详解:理解模型选择的核心概念 在机器学习、深度学习、统计建模等领域,我们常常会听到一个专业术语——假设空间(Hypothesis Space)。假设空间的理解,直接关系到模型…...