单片机--51- RAM
1.概览某个51单片机对空间区域的划分:
2.RAM被分配的区域是256bytes,
通常8051单片机ram是128bytes
8052的ram是256bytes(其中高128位的地址和sfr区域地址重合,物理区域不同)
extern uint32_t alarm_cnt_1;
uint32_t alarm_cnt_1=0;
在这种常规的生命和定义下,变量会被保存在0x0008h--0x007e的地址内,
超出就会报警;
存储类 | 位置 | 特点 |
---|---|---|
data | 内部RAM的低128字节 | 直接寻址,访问速度最快,但空间有限。 |
idata | 内部RAM的全部区域 | 可访问整个内部RAM,但高128字节需间接寻址,访问速度稍慢。 |
xdata | 外部RAM(扩展存储器) | 存储容量大,但访问需要额外的MOVX指令,速度较慢。 |
code | 程序存储器(Flash/ROM) | 用于存储常量或程序代码,访问速度较快,但只读。 |
直接寻址和间接寻址,是由编译器解释编译后,自动执行的,不需要手动造作。
关键字使用示例:
int var100[1] ; 默认分配地址(例如ram256bytes,通常也只分配到低128ram,)
int idata var100[1] ; 分配到整个RAM区域(通常低128ram不够用,使用idata,可以充分使用高128ram)
int xdata var100[1] ; 分配到外部ram
int code var100[1] ; 分配到rom
char idata var1 _at_ 0x80; 定义一个变量var1,会被分配到地址0x80,如果中间有没有使用的地址,也会跳过
_at_:关键字,指定地址
例如
指定地址:
char idata var1 _at_ 0x80; map文件: TYPE BASE LENGTH RELOCATION SEGMENT NAME-----------------------------------------------------* * * * * * * D A T A M E M O R Y * * * * * * *REG 0000H 0008H ABSOLUTE "REG BANK 0"DATA 0008H 0048H UNIT ?DT?MAINDATA 0050H 0017H UNIT ?DT?UART0DATA 0067H 0008H UNIT ?DT?TIMER0006FH 0011H *** GAP ***IDATA 0080H 0001H ABSOLUTE IDATA 0081H 0001H UNIT ?STACK不指定地址:
char idata var1; map文件: TYPE BASE LENGTH RELOCATION SEGMENT NAME-----------------------------------------------------* * * * * * * D A T A M E M O R Y * * * * * * *REG 0000H 0008H ABSOLUTE "REG BANK 0"DATA 0008H 0048H UNIT ?DT?MAINDATA 0050H 0017H UNIT ?DT?UART0DATA 0067H 0008H UNIT ?DT?TIMER0IDATA 006FH 0001H UNIT ?ID?MAINIDATA 0070H 0001H UNIT ?STACK
有关这些关键字的报警:
SRC\main.c(103): error C274: 'var1': absolute specifier illegal
使用xdata修饰,使用xdata修饰是保存在外部RAM,有些单片机上也有外部ram,有些没有:
extern uint32_t xdata alarm_cnt_2;
uint32_t xdata alarm_cnt_2=0;
TYPE BASE LENGTH RELOCATION SEGMENT NAME
-----------------------------------------------------
* * * * * * * D A T A M E M O R Y * * * * * * *
REG 0000H 0008H ABSOLUTE "REG BANK 0"
DATA 0008H 0058H UNIT ?DT?MAIN
DATA 0060H 0017H UNIT ?DT?UART0
DATA 0077H 0008H UNIT ?DT?TIMER0
IDATA 007FH 0001H UNIT ?STACK
* * * * * * * X D A T A M E M O R Y * * * * * * *
XDATA 0000H 0010H UNIT ?XD?MAIN
也可以强制把变量数据保存在0X80--0xff区域,但是禁止这样做,很容易和sfr发生冲突。
好的,了解您想将一个 int 型变量保存在 51 单片机的 0x80 - 0xFF 地址范围。虽然我们之前强调了 0x80 - 0xFF 这个区域主要用于 SFR (特殊功能寄存器),不推荐直接存储变量数据,但为了满足你的需求,我将展示如何在技术上尝试实现,并再次强调风险和替代方案。重要警告(再次提醒):极不推荐: 除非有绝对特殊的原因,否则不要将变量直接存储在 SFR 区域。这极易导致程序崩溃、硬件错误,并严重降低代码的可读性和可维护性。理解风险: 这样做会直接覆盖 SFR 的值,可能会导致不可预测的硬件行为。数据污染: SFR有自己的用途,随意覆盖,会导致程序错误。不可移植: SFR 的地址和功能依赖于具体的单片机型号,代码的移植性极差。替代方案: 请尽可能使用内部 RAM (DATA) 或外部 RAM (XDATA) 来存储变量数据。技术实现(仅供参考,风险自担):由于 0x80 - 0xFF 主要是 SFR 区域,直接存储 int 类型变量是行不通的,我们需要拆解int数据,逐字节进行操作。声明 int 型变量:先定义您要存储的 int 型变量:int my_int = 0x1234; // 示例 int 值
content_copy
download
Use code with caution.
C使用指针声明一个 unsigned char 类型的指针, 然后将指针指向 0x80-0xff 的某个地址,然后用指针来操作该地址的内存空间:unsigned char* ptr;ptr = (unsigned char*)0xA0;//假设使用0xA0地址
content_copy
download
Use code with caution.
C使用间接寻址将 int 型变量拆分为两个字节 (低字节和高字节) ,然后分别使用间接寻址写入到对应的地址:unsigned char* ptr = (unsigned char*)0xA0;*ptr = (unsigned char)(my_int & 0x00FF); // 写入低字节
ptr++; // 地址加1
*ptr = (unsigned char)((my_int >> 8) & 0x00FF); // 写入高字节
content_copy
download
Use code with caution.
C取出数据:从对应的地址读取数据:ptr = (unsigned char*)0xA0;
int tmp_int = 0;
tmp_int = *ptr | (*(ptr+1)<<8)
content_copy
download
Use code with caution.
C使用 sfr 关键字 (不推荐,仅作演示):声明 SFR 别名: 为了使用方便,我们也可以使用sfr关键字,来定义一个指向SFR地址的变量,但请注意这只是定义了一个变量名,该变量名会和SFR的地址重合,使用这个变量并不会修改SFR。volatile sfr my_address = 0xA0;
content_copy
download
Use code with caution.
C类型转换: 注意我们这里定义的是SFR变量名,而不是unsigned char类型的指针,my_address 是一个特殊功能寄存器,不能直接作为内存地址来使用。不推荐: 虽然这种方式可以把数据写入到指定地址,但是需要非常小心,避免修改SFR的值,这是一种非常危险的操作。示例: 使用这种方法,可以通过以下方式把int类型数据拆分到两个地址:volatile sfr my_address_low = 0xA0;volatile sfr my_address_high = 0xA1;unsigned int my_int = 0x1234;my_address_low = (unsigned char)my_int; // low byte
my_address_high = (unsigned char)(my_int >> 8); // high byte
content_copy
download
Use code with caution.
C读取数据:unsigned int temp_data = 0;temp_data = (unsigned int)my_address_low | ((unsigned int)my_address_high<<8);
content_copy
download
Use code with caution.
C代码示例 (极其危险,请勿在实际项目中使用):#include <reg52.h>
#include <stdio.h>// 非常不推荐!!!
volatile sfr my_address_low = 0xA0; // 使用SFR 0xA0 地址,非常不建议这样做
volatile sfr my_address_high = 0xA1; // 使用SFR 0xA1 地址,非常不建议这样做
int my_int = 0x1234; // 要存储的 int 型变量void main() {unsigned char* ptr;ptr = (unsigned char*)0xA0;// 将 int 分解成两个字节,并分别存入*ptr = (unsigned char)(my_int & 0x00FF);ptr++; // 地址加1*ptr = (unsigned char)((my_int >> 8) & 0x00FF);// 将存储在0xA0和0xA1的数据读取出来int tmp_int = 0;ptr = (unsigned char*)0xA0;tmp_int = *ptr | (*(ptr+1)<<8);printf("read data from 0xA0: %x\n",tmp_int);// 使用SFR别名,非常不建议这样做my_address_low = (unsigned char)my_int; // low bytemy_address_high = (unsigned char)(my_int >> 8); // high byte// 读取数据unsigned int temp_data = 0;temp_data = (unsigned int)my_address_low | ((unsigned int)my_address_high<<8);printf("read data from sfr address: %x\n",temp_data);while(1); // 避免程序运行到其他区域
}
content_copy
download
Use code with caution.
C解释:我们定义一个unsigned char*类型的指针, 指向0xA0的地址,这样我们就可以使用指针来操作这个地址的内存单元了。将int变量的值分解为低字节和高字节,分别写入到0xA0 和 0xA1地址。我们可以通过指针或者SFR变量名读取这个值。我们使用printf来打印读取到的值。非常重要: 这个示例仅用于演示, 绝对不推荐在实际项目中使用。风险:破坏 SFR 功能: 直接修改 SFR 可能导致硬件功能异常,例如端口输出错误、串口无法工作、定时器不准确等。代码难以维护: 这种方式代码可读性非常差,不利于团队协作和后续维护。兼容性问题: 不同型号的单片机 SFR 地址可能不同,代码的兼容性很差,移植性基本为0。程序崩溃: 如果错误的修改了某些SFR, 很可能导致程序崩溃。难以定位错误: 排查这种因为错误的访问SFR导致的错误非常困难,增加了调试难度。正确做法(再次强调):内部 RAM (DATA): 优先使用内部 RAM (地址 0x00 - 0x7F) 存储变量。外部 RAM (XDATA): 如果内部 RAM 不够用,考虑使用外部 RAM (XDATA)。结构体: 可以使用结构体来存储多个变量。联合体: 可以使用联合体,将不同的类型数据存储到同一片区域。动态内存分配: 如果数据量不确定,需要使用动态内存分配。总结:我为您展示了如何在技术上将 int 型变量存储在 51 单片机的 SFR 区域,但这是一种非常危险和不规范的做法,请务必谨慎使用。在大多数情况下,应该使用内部 RAM 或外部 RAM 来存储数据,使用 SFR 来控制硬件。如果您还有其他问题,请随时提出,我会尽力为您解答。
关于ram的问答:
问:char idata alarm_cnt_100[120] 解释;
答:
在标准51单片机中,char idata alarm_cnt_100[120];
是一个声明数组的语句。以下是其组成部分及含义的详细解释:
语句分解与解释
-
char
:- 表示数组的元素类型是
char
,即每个数组元素占用 1字节(8位)。 - 在51单片机中,
char
默认是有符号类型(取值范围:-128
到127
),如果需要无符号,可以使用unsigned char
。
- 表示数组的元素类型是
-
idata
:idata
是存储类说明符,表示这个数组存储在 内部数据存储区(Internal Data RAM) 中。- 在51单片机中,内部数据RAM分为:
- 直接地址区(低128字节,0x00~0x7F)
- 高128字节RAM(0x80~0xFF,需间接访问)
- 使用
idata
,编译器会在低128字节或高128字节RAM中分配存储空间。
-
alarm_cnt_100[120]
:- 定义了一个名为
alarm_cnt_100
的数组,数组长度为120
。 - 该数组包含
120
个元素,每个元素占用 1 字节,总共需要 120字节 的存储空间。
- 定义了一个名为
综合意义
该语句的含义是:
在51单片机的内部RAM(idata区)中分配一个名为 alarm_cnt_100
的数组,它包含 120 个 char
类型的元素,每个元素占用 1 字节,总共占用 120 字节的RAM空间。
注意事项
-
内存占用问题:
- 标准51单片机内部RAM容量有限(通常为256字节,低128字节可直接访问,高128字节需间接访问)。
- 如果定义的数组大小(如120字节)接近内部RAM容量,可能会导致RAM不足,进而出现程序运行错误。
-
idata
的作用:- 如果不显式指定
idata
,编译器会自动选择合适的存储区域(可能是data
或idata
)。 - 使用
idata
明确指定存储区,可以优化资源分配,避免与其他内存区域冲突。
- 如果不显式指定
-
适配问题:
- 如果RAM不足,建议:
- 优化数组大小。
- 使用外部RAM(
xdata
存储类)代替内部RAM。
- 如果RAM不足,建议:
简单使用示例
以下是一个使用 alarm_cnt_100
数组的示例:
#include <reg51.h>char idata alarm_cnt_100[120]; // 在内部RAM中定义一个120字节的数组void main() {unsigned char i;// 初始化数组for (i = 0; i < 120; i++) {alarm_cnt_100[i] = i; // 将数组元素依次赋值为 0~119}// 使用数组中的某个值P0 = alarm_cnt_100[10]; // 将第11个元素的值输出到P0端口while (1);
}
补充:idata
与其他存储类的区别
存储类 | 位置 | 特点 |
---|---|---|
data | 内部RAM的低128字节 | 直接寻址,访问速度最快,但空间有限。 |
idata | 内部RAM的全部区域 | 可访问整个内部RAM,但高128字节需间接寻址,访问速度稍慢。 |
xdata | 外部RAM(扩展存储器) | 存储容量大,但访问需要额外的MOVX指令,速度较慢。 |
code | 程序存储器(Flash/ROM) | 用于存储常量或程序代码,访问速度较快,但只读。 |
合理选择存储类,可以更高效地利用单片机的内存资源!
问:idata 内部RAM的全部区域 可访问整个内部RAM,但高128字节需间接寻址,访问速度稍慢。 这个是程序自己会进行间接寻址吗,
答:
是的,如果使用 idata
存储类,编译器会根据变量的地址自动选择适当的访问方式,包括是否需要间接寻址。你无需手动处理间接寻址,编译器会负责生成相应的代码。
具体解释
-
低128字节区域(地址 0x00~0x7F):
- 如果变量被分配在低128字节的内部RAM中,编译器会使用 直接寻址 方式访问,因为低128字节支持直接寻址,效率较高。
-
高128字节区域(地址 0x80~0xFF):
- 如果变量被分配在高128字节区域(
0x80~0xFF
),由于该区域只能通过 间接寻址 访问,编译器会自动生成使用间接寻址的代码。例如通过寄存器R0
或R1
访问。 - 你在代码中直接写访问操作即可,编译器会在后台处理具体的访问方式。
- 如果变量被分配在高128字节区域(
示例代码
以下是一个简单例子说明 idata
的访问:
#include <reg51.h>// 定义变量,明确使用 idata 存储类
char idata var1 = 0xAA; // 编译器可能将其分配到低128字节
char idata var2 = 0xBB; // 编译器可能将其分配到高128字节void main(void) {P0 = var1; // 访问低128字节时,编译器生成直接寻址的代码P1 = var2; // 如果 var2 位于高128字节,编译器生成间接寻址的代码while (1);
}
编译器如何处理?
编译器会根据变量的地址自动生成不同的指令:
-
低128字节(直接寻址示例):
MOV A, var1 ; 从低128字节的地址直接读取到累加器 MOV P0, A ; 输出到P0端口
-
高128字节(间接寻址示例):
MOV R0, #var2 ; 将高128字节的地址加载到R0 MOV A, @R0 ; 使用间接寻址从高128字节地址读取数据到累加器 MOV P1, A ; 输出到P1端口
注意事项
-
访问速度差异:
- 低128字节采用直接寻址,效率更高。
- 高128字节需使用间接寻址,指令多一步,速度稍慢。
-
编译器分配策略:
- 大多数情况下,编译器会优先将变量分配到低128字节。
- 当低128字节空间不足时,才会使用高128字节。
-
手动优化:
- 如果对性能要求较高,可以通过优化变量定义的存储类(如尽量使用
data
)或检查编译器分配的内存映射表。
- 如果对性能要求较高,可以通过优化变量定义的存储类(如尽量使用
总结:
你只需指定 idata
存储类,编译器会根据变量的地址自动选择适当的访问方式(直接或间接寻址)。用户无需手动处理间接寻址的细节,这些都由编译器生成的代码自动完成。
问:可以手动指定到高128ram吗
答:
在51单片机中,你可以通过手动方式将变量分配到高128字节RAM。具体方法有以下几种:
方法 1:直接使用 idata
并控制地址分配
编译器在分配 idata
区域的变量时,会按照其策略从低地址到高地址分配。如果你想明确将变量放入高128字节RAM,可以通过 汇编插入 或 特殊编译选项 控制。
示例代码:
#include <reg51.h>char idata var1 _at_ 0x80; // 将变量 var1 明确放入高128字节RAM地址 0x80
char idata var2 _at_ 0x81; // 将变量 var2 明确放入高128字节RAM地址 0x81void main(void) {var1 = 0x55; // 访问高128字节RAMvar2 = 0xAA;while (1);
}
注意:
_at_
是某些编译器(如 Keil C51)的特性,可以指定变量的绝对地址。不是所有 C 编译器都支持这个关键字。
方法 2:通过间接寻址手动操作高128字节RAM
如果编译器不支持直接指定变量地址,你可以通过手动使用指针间接访问高128字节RAM。
示例代码:
#include <reg51.h>void main(void) {unsigned char idata *ptr; // 定义一个指针变量指向 idata 区ptr = (unsigned char idata *)0x80; // 指向高128字节RAM地址 0x80*ptr = 0x55; // 写入数据到高128字节RAM地址 0x80ptr = (unsigned char idata *)0x81; // 指向高128字节RAM地址 0x81*ptr = 0xAA; // 写入数据到高128字节RAM地址 0x81while (1);
}
方法 3:结合汇编代码手动分配地址
在 C 语言中插入汇编代码,直接操作高128字节RAM的地址。
示例代码:
#include <reg51.h>void main(void) {__asmMOV R0, #0x80 ; 指向高128字节RAM地址 0x80MOV A, #0x55 ; 准备写入数据 0x55MOV @R0, A ; 写入数据到高128字节RAM__endasm;while (1);
}
编译器内存管理工具
大部分 C 编译器(如 Keil C51)提供了内存分配的配置文件,可以通过修改链接文件(如 .xcl
或 .m51
文件)手动分配变量的内存地址。
在 Keil 中,你可以检查 MAP 文件,了解变量被分配到的具体地址。
注意事项
-
硬件限制:
- 高128字节RAM仅支持间接寻址,直接指定的变量会依赖编译器生成间接寻址代码。
-
地址冲突:
- 高128字节RAM的地址与 SFR 地址重叠,务必确保你的变量地址不会与 SFR 冲突。
-
适用范围:
- 不建议频繁手动操作变量地址,尤其在较复杂程序中可能导致管理混乱。仅在内存紧张或特定需求(如优化性能)时使用。
通过这些方法,你可以将变量手动分配到高128字节RAM,并有效利用51单片机的内存资源。
问:char idata alarm_cnt_100[120] 在占用了高128ram区域会和sfr冲突吗
答:
在标准51单片机中,char idata alarm_cnt_100[120]
不会与 SFR(特殊功能寄存器)冲突,即使它占用了高128字节的 RAM 区域。原因如下:
高128字节RAM与SFR的关系
-
地址重叠:
高128字节RAM(地址范围0x80
~0xFF
)与 SFR 地址范围相同,但两者是通过不同的访问方式区分的:- 直接寻址(Direct Addressing):访问的是 SFR。
- 间接寻址(Indirect Addressing):访问的是高128字节RAM。
-
关键点:只要编译器生成的代码正确地使用了间接寻址方式操作高128字节RAM,变量与 SFR 不会冲突。
idata
存储类的行为
当你声明 char idata alarm_cnt_100[120]
:
- 编译器会尝试将变量分配到
idata
区(包括低128字节和高128字节RAM)。 - 如果变量被分配到高128字节RAM,编译器会生成间接寻址代码来访问这些变量。
例如:
- 变量分配在高128字节地址
0x80
~0xFF
。 - 对这些地址的访问始终使用寄存器(如
R0
、R1
)和@
符号的间接寻址。
由于访问高128字节RAM不涉及直接寻址,变量不会干扰或覆盖 SFR 的内容。
示例解释
假设你定义了如下代码:
char idata alarm_cnt_100[120]; // 变量可能部分分配到高128字节RAMvoid main(void) {alarm_cnt_100[0] = 0x55; // 写入高128字节RAMalarm_cnt_100[1] = 0xAA; // 写入高128字节RAMwhile (1);
}
编译器会生成类似以下的汇编代码:
MOV R0, #0x80 ; 指针指向高128字节RAM的起始地址
MOV A, #0x55 ; 准备数据
MOV @R0, A ; 写入高128字节RAM地址 0x80INC R0 ; 指针指向高128字节RAM的下一个地址
MOV A, #0xAA ; 准备数据
MOV @R0, A ; 写入高128字节RAM地址 0x81
这种方式完全避免了与 SFR 的直接寻址冲突。
注意事项
-
编译器生成代码的正确性:
- 确保编译器(如 Keil C51)能够正确地处理高128字节RAM和 SFR 的访问方式。
- 大多数主流编译器都能很好地区分间接寻址(高128字节RAM)和直接寻址(SFR)。
-
RAM分配策略:
- 如果
idata
的低128字节不足,编译器才会使用高128字节RAM。 - 你可以通过编译器生成的 MAP 文件 查看
alarm_cnt_100
的实际分配地址。
- 如果
-
硬件限制:
- 某些兼容性较差的51单片机可能不支持完整的高128字节RAM,需检查具体型号的硬件手册。
结论
char idata alarm_cnt_100[120]
占用高128字节RAM时不会与 SFR 冲突,因为编译器会通过间接寻址区分高128字节RAM和 SFR 区域。只需确保编译器生成的代码正确,并避免手动混用直接和间接寻址操作即可安全使用。
资料:
为什么8051单片机内部RAM存储单元是128个,只有低128位而没有高128位?_百度知道 (baidu.com)
51单片机内部RAM的问题、STC单片机内部扩展RAM的应用 - 51单片机 (51hei.com)
怎么才能用51单片机中的高128位内部ram啊? - 24小时必答区
相关文章:
单片机--51- RAM
1.概览某个51单片机对空间区域的划分: 2.RAM被分配的区域是256bytes, 通常8051单片机ram是128bytes 8052的ram是256bytes(其中高128位的地址和sfr区域地址重合,物理区域不同) extern uint32_t alarm_cnt_1; uint32…...
【机器学习】梯度下降
文章目录 1. 梯度下降概念2. 梯度下降的技巧2.1 动态设置学习率2.2 Adagrad调整梯度2.3 随机梯度下降(SGD)2.4 特征缩放 3. 梯度下降理论基础 1. 梯度下降概念 梯度:Loss 对参数在某一点的偏微分,函数沿梯度的方向具有最大的变化…...
攻防世界web第十题Web_python_template_injection
这是题目,从题目上看是一个python模板注入类型的题目。 首先测试是否存在模板注入漏洞,构造http://61.147.171.105:57423/{{config}} 得到 说明存在模板注入漏洞,继续注入 构造http://61.147.171.105:57423/{{‘’.class.mro}}: 得到 再构造…...
【《python爬虫入门教程11--重剑无峰168》】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 【《python爬虫入门教程11--selenium的安装与使用》】 前言selenium就是一个可以实现python自动化的模块 一、Chrome的版本查找?-- 如果用edge也是类似的1.chrome…...
VUE echarts 教程二 折线堆叠图
VUE echarts 教程一 折线图 import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom); var option {title: {text: Stacked Line},tooltip: {trigger: axis},legend: {data: [Email, Union Ads, Video Ads, Dir…...
gitlab的搭建及使用
1、环境准备 服务器准备 CentOS Linux release 7.9.2009 (Core),内存至少4G。 修改主机名和配置ip地址 hostnamectl set-hostname <hostname> 关闭主机的防火墙 # 关闭防火墙 systemctl stop firewalld #临时关闭防火墙 systemctl disable firewalld …...
openEuler ARM使用vdbench50407
openEuler ARM 使用 vdbench50407 系统信息:openEuler 22.03 (LTS-SP4) Linux 5.10.0-216.0.0.115.oe2203sp4.aarch64 1. 软件包获取 vdbench src https://www.oracle.com/downloads/server-storage/vdbench-source-downloads.htmlvdbench bin https://www.oracle.…...
如何使用 JPA 实现分页查询并返回 VO 对象
JPA分页踩坑指南 1.原生sql查询返回vo类包含主键id,无法自动映射,需要用到投影ResultTransformer,所以我定义了一个投影工具类 JpaCommonService 2.异步调用原生查询方法的时候,需要用 NativeQuery<?> query entityMa…...
【SQL Server】教材数据库(1)
1 利用sql建立教材数据库,并定义以下基本表: 学生(学号,年龄,性别,系名) 教材(编号,书名,出版社编号,价格) 订购(学号…...
cmake学习_incomplete
文章目录 cmake使用举例cmake示例模板编译时库查找基础知识模块模式导入目标 交叉编译配置基础知识模板实际使用 使用实例链接库解决符号冲突 参考资料 老规矩,先放官方文档 如何构建从互联网下载的源代码包:User Interaction Guide 想使用第三方库的开发者:Using …...
过度与动画的区别?
过渡(Transition): 过渡效果是由元素的状态变化触发的,例如:当鼠标悬停在某个元素上、或当某个 CSS 属性值发生改变时。 必须指定起始状态和结束状态。过渡会在两者之间自动平滑过渡。 过渡的触发通常是用户交互或通过…...
tcpdump指南(1)
大家读完觉得有意义记得关注和点赞!!! tcpdump是一种在网络上转储流量的网络工具。 这篇文章服务器作为一些常用命令的指南。如需完整指南, 请参阅手册页,或在 Linux 计算机上。man tcpdump 1 基本选项 帮助摘要&#…...
Linux(Centos 7.6)网卡信息没有了问题处理
1.问题现象 虚拟机打开后,使用ifconfig查看IP信息,虚拟机默认的网卡名称是ens33,ifconfig没有看到相关问题,远程连接工具Xshell也不能正常访问该虚拟机。 [rootnode1 ~]# ifconfig lo: flags73<UP,LOOPBACK,RUNNING> mtu…...
基于SpringBoot的校园二手交易平台的设计与实现(源码+SQL+LW+部署讲解)
文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…...
springboot523基于Spring Boot的大学校园生活信息平台的设计与实现(论文+源码)_kaic
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本大学校园生活信息平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…...
week05_nlp大模型训练·词向量文本向量
1、词向量训练 1.1 CBOW(两边预测中间) 一、CBOW 基本概念 CBOW 是一种用于生成词向量的方法,属于神经网络语言模型的一种。其核心思想是根据上下文来预测中心词。在 CBOW 中,输入是目标词的上下文词汇,输出是该目标…...
FreeRTOS Lwip Socket APi TCP Server 1对多
源文件 /********************************************************************************* file lwip_tcp_driver.cpp* brief TCP Server implementation using LwIP******************************************************************************* at…...
SonarQube相关的maven配置及使用
一、maven 全局配置 <settings><pluginGroups><pluginGroup>org.sonarsource.scanner.maven</pluginGroup></pluginGroups><profiles><profile><id>sonar</id><activation><activeByDefault>true</acti…...
【蓝桥杯选拔赛真题87】python输出字符串 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析
目录 python输出字符串 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python输出字符串 第十五届蓝桥杯青少年组python比赛选拔赛真题详细解析…...
嵌入式开发中的机器人表情绘制
机器人的表情有两种,一种是贴图,一钟是调用图形API自绘。 贴图效果相对比较好,在存储空间大的情况下是可以采用的。 自绘比较麻烦,但在资源和空缺少的情况下,也是很有用的。而且自绘很容易通过调整参数加入随机效果&…...
本机实现Llama 7B推理及部署
本机实现Llama 7B推理及部署 使用llamafile在Windows系统部署 部署步骤:首先从https://www.modelscope.cn/api/v1/models/bingal/llamafile-models/repo?Revision=master&FilePath=llamafile-0.6.2.win.zip下载llamafile并解压得到llamafile.exe文件, 再从https://www.…...
HarmonyOS NEXT 实战之元服务:静态案例效果---我的热门应用服务
背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: Index import { authentica…...
二十三种设计模式-工厂方法模式
工厂方法模式是一种创建型设计模式,其核心思想是通过定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法模式将对象的实例化推迟到子类中进行,从而使得扩展变得容易,而不需要修改现有的代码,符合开闭原则&…...
硬件工程师面试题 21-30
把常见的硬件面试题进行总结,方便及时巩固复习。其中包括网络上的资源、大佬们的大厂面试题,其中可能会题目类似,加强印象即可。 更多硬件面试题:硬件工程师面试题 1-10硬件工程师面试题 11-20 21、单片机最小系统需要什么&#x…...
深度学习中的HTTP:从请求到响应的计算机网络交互
在现代深度学习应用中,HTTP(超文本传输协议)不仅仅是网页浏览的基础协议,它也在机器学习和人工智能的服务架构中扮演着至关重要的角色。本文将深入探讨HTTP在深度学习中的应用,并阐明它如何支持模型的训练、推理及API服…...
基于submitit实现Python函数的集群计算
一、项目介绍 Submitit是一款轻量级工具,旨在简化Python函数在Slurm集群上的提交过程。它不仅提供了对作业结果、日志文件等的无缝访问,更让开发者能够在本地执行与Slurm集群间切换自如,极大地提高了代码的可移植性和灵活性。 Slurm作为一种…...
开源GTKSystem.Windows.Forms框架:C# Winform跨平台运行深度解析
开源GTKSystem.Windows.Forms框架:C# Winform跨平台运行深度解析 一、跨平台框架的崛起 1.1 跨平台技术的现状与需求 在当今快速发展的科技时代,软件开发的需求日益多样化。随着移动设备和操作系统的不断涌现,开发者面临着前所未有的挑战&…...
uniapp Stripe 支付
引入 Stripe npm install stripe/stripe-js import { loadStripe } from stripe/stripe-js; Stripe 提供两种不同类型组件 Payment Element 和 Card Element:如果你使用的是 Payment Element,它是一个更高级别的组件,能够自动处理多种支…...
虚拟机用网线连其他设备(ROS多机网络配置)
电脑配置 把局域网的网线插入电脑,点击这边 配置以太网的IP 比如说我ROS主机的IP想设为192.168.144.10,那我笔记本的以太网IP可以设为192.168.144.8。 假设还有另外一个电脑(ROS从机),他的IP被设置未192.168.144.4…...
20241218-信息安全理论与技术复习题
20241218-信息安全理论与技术复习题 一、习题1 信息安全的基本属性是(D )。 A、机密性 B、可用性 C、完整性 D、上面 3 项都是 “会话侦听和劫持技术” 是属于(B)的技术。 A、 密码分析还原 B、 协议漏洞渗透 C、 应用漏洞分析与渗透 D、 D…...
家谱管理系统|Java|SSM|VUE| 前后端分离
【技术栈】 1⃣️:架构: B/S、MVC 2⃣️:系统环境:Windowsh/Mac 3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7 4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库…...
音频进阶学习九——离散时间傅里叶变换DTFT
文章目录 前言一、DTFT的解释1.DTFT公式2.DTFT右边释义1) 复指数 e − j ω n e^{-j\omega n} e−jωn2)序列与复指数相乘 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn复指数序列复数的共轭正交正交集 3)复指数序列求和 3.DTF…...
pytorch 计算图中的叶子节点介绍
1. 什么是叶子节点? 在 PyTorch 的自动微分机制中,叶子节点(leaf node) 是计算图中: 由用户直接创建的张量,并且它的 requires_gradTrue。这些张量是计算图的起始点,通常作为模型参数或输入变…...
CSS系列(42)-- Backdrop Filter详解
前端技术探索系列:CSS Backdrop Filter详解 🎨 致读者:探索背景滤镜的艺术 👋 前端开发者们, 今天我们将深入探讨 CSS Backdrop Filter,这个强大的视觉效果特性。 基础效果 🚀 模糊效果 /…...
【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(一)
****非斜体正文为原文献内容(也包含笔者的补充),灰色块中是对文章细节的进一步详细解释! 三、传统微调范式(Traditional Fine-Tuning Paradigm) 在这个范式中,首先在大量未标记的文本数据上预…...
ChatGPT 与 AGI:人工智能的当下与未来走向全解析
在人工智能的浩瀚星空中,AGI(通用人工智能)无疑是那颗最为璀璨且备受瞩目的星辰。OpenAI 对 AGI 的定义为“在最具经济价值的任务中超越人类的高度自治系统”,并勾勒出其发展的五个阶段,当下我们大多处于以 ChatGPT 为…...
Redis - 1 ( 11000 字 Redis 入门级教程 )
一:服务端高并发分布式结构演进之路 1.1 常见概念 概念定义生活例子类比应用(Application)/ 系统(System)为完成一整套服务的程序或一组相互配合的程序群。为完成一项任务而组成的由一个人或一群相互配合的人构成的团…...
python opencv的sift特征检测(Scale-Invariant Feature Transform)
sift 官方文档地址:https://docs.opencv.org/4.10.0/da/df5/tutorial_py_sift_intro.html 创建SIFT实例cv2.SIFT.create()特征检测sift.detect描述子sift.compute/sift.detectAndCompute画特征cv2.drawKeypoints 原图 特征点 代码 import cv2first ./12.pngsif…...
Xilinx FPGA的Bitstream比特流加密设置方法
关于Xilinx FPGA的Bitstream比特流加密设置方法更多信息可参阅应用笔记xapp1084。 使用加密bitstream分两个步骤: 将bitstream的AES密钥存储在FPGA芯片内将使用AES密钥加密的Bitstream通过SPI Flash或JTAG加载至FPGA芯片 AES密钥可以存储在两个存储区之一&#x…...
如何通过深度学习提升大分辨率图像预测准确率?
随着科技的不断进步,图像处理在各个领域的应用日益广泛,特别是在医疗影像、卫星遥感、自动驾驶、安防监控等领域中,大分辨率图像的使用已经成为了一项不可或缺的技术。然而,大分辨率图像带来了巨大的计算和存储压力,同…...
Oracle SqlPlus常用命令简介
参考资料 【SQL*Plus】SETシステム変数の設定前後の具体例 目录 一. 执行系命令1.1 执行系统命令1.2 执行sql脚本文件1.2.1 在数据库中执行sql脚本1.2.2 通过sqlplus执行sql脚本 二. show命令2.1 显示SqlPlus中的全部环境变量2.2 显示指定环境变量的设置 三. 时间显示3.1 set …...
【微服务】【Sentinel】认识Sentinel
文章目录 1. 雪崩问题2. 解决方案3. 服务保护技术对比4. 安装 Sentinel4.1 启动控制台4.2 客户端接入控制台 参考资料: 1. 雪崩问题 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,这就是雪崩。动图演示: 在微服务系统…...
C++并行处理支持库 之六
C并行处理支持库 之六 std::promise构造器APIs应用实例 通过使用Futures标准库,我们可以获取异步任务返回值,捕获异步任务引发的异常。异步任务就是在独立线程中启动运行的函数。 这些值以共享状态进行通信,其中异步任务可以写入其返回值&…...
Linux-frp_0.61.1内网穿透的配置和使用
下载frp frp官网 https://gofrp.org/zh-cn/docs/setup/ frp安装包下载地址 https://github.com/fatedier/frp/releases?page1 下载之后在服务器上 解压 tar -zxvf frp_0.61.1_linux_amd64.tar.gztar:一个用于压缩和解压缩的工具。-z:表示使用 gzi…...
SpringBoot集成ECDH密钥交换
简介 对称加解密算法都需要一把秘钥,但是很多情况下,互联网环境不适合传输这把对称密码,有密钥泄露的风险,为了解决这个问题ECDH密钥交换应运而生 EC:Elliptic Curve——椭圆曲线,生成密钥的方法 DH&…...
深度学习的魔法世界
技术文章:深度学习的魔法世界 引言 嘿,今天我们要一起探索一个非常酷的魔法世界——深度学习!这是一门让计算机变得超级聪明的科学。我们会用最简单的语言来解释深度学习的基本概念,让你们也能轻松理解。 一、深度学习的六大魔…...
【超级详细】Vue3项目上传文件到七牛云的详细笔记
概述 继上一篇笔记介绍如何绑定七牛云的域名之后,这篇笔记主要介绍了如何在Vue3项目中实现文件上传至七牛云的功能。我们将使用Cropper.js来处理图像裁剪,并通过自定义组件和API调用来完成整个流程。 这里直接给出关键部分js代码,上传之前要先…...
设计模式-建造者模式
在面向对象的设计中,建造者模式(Builder Pattern) 是一种常用的设计模式,它属于创建型模式,旨在将复杂对象的创建与其表示分离。通过该模式,我们可以一步一步地构造一个复杂的对象,避免构造函数…...
springboot+vue实现SSE服务器发送事件
思路 一个基于订阅发布机制的SSE事件。客户端可以请求订阅api(携带客户端id),与服务器建立SSE链接;后续服务器需要推送消息到客户端时,再根据客户端id从已建立链接的会话中找到目标客户端,将消息推送出去。…...
IDEA | SpringBoot 项目中使用 Apifox 上传接口
目录 1 安装 Apifox Helper 插件2 获取 Apifox 的 API 访问令牌3 IDEA 中设置 API 访问令牌4 IDEA 中上传接口5 常见问题5.1 如何自动设置目录名5.2 如何自动设置接口名5.3 如何更改上传位置 Apifox 官方指南: https://apifox.com/help/applications-and-p…...