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

单片机--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]; 是一个声明数组的语句。以下是其组成部分及含义的详细解释:


语句分解与解释

  1. char

    • 表示数组的元素类型是 char,即每个数组元素占用 1字节(8位)。
    • 在51单片机中,char 默认是有符号类型(取值范围:-128127),如果需要无符号,可以使用 unsigned char
  2. idata

    • idata 是存储类说明符,表示这个数组存储在 内部数据存储区(Internal Data RAM) 中。
    • 在51单片机中,内部数据RAM分为:
      • 直接地址区(低128字节,0x00~0x7F)
      • 高128字节RAM(0x80~0xFF,需间接访问)
    • 使用 idata,编译器会在低128字节或高128字节RAM中分配存储空间。
  3. alarm_cnt_100[120]

    • 定义了一个名为 alarm_cnt_100 的数组,数组长度为 120
    • 该数组包含 120 个元素,每个元素占用 1 字节,总共需要 120字节 的存储空间。

综合意义

该语句的含义是:
在51单片机的内部RAM(idata区)中分配一个名为 alarm_cnt_100 的数组,它包含 120 个 char 类型的元素,每个元素占用 1 字节,总共占用 120 字节的RAM空间。


注意事项

  1. 内存占用问题

    • 标准51单片机内部RAM容量有限(通常为256字节,低128字节可直接访问,高128字节需间接访问)。
    • 如果定义的数组大小(如120字节)接近内部RAM容量,可能会导致RAM不足,进而出现程序运行错误。
  2. idata 的作用

    • 如果不显式指定 idata,编译器会自动选择合适的存储区域(可能是 dataidata)。
    • 使用 idata 明确指定存储区,可以优化资源分配,避免与其他内存区域冲突。
  3. 适配问题

    • 如果RAM不足,建议:
      • 优化数组大小。
      • 使用外部RAM(xdata 存储类)代替内部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 存储类,编译器会根据变量的地址自动选择适当的访问方式,包括是否需要间接寻址。你无需手动处理间接寻址,编译器会负责生成相应的代码。


具体解释

  1. 低128字节区域(地址 0x00~0x7F)

    • 如果变量被分配在低128字节的内部RAM中,编译器会使用 直接寻址 方式访问,因为低128字节支持直接寻址,效率较高。
  2. 高128字节区域(地址 0x80~0xFF)

    • 如果变量被分配在高128字节区域(0x80~0xFF),由于该区域只能通过 间接寻址 访问,编译器会自动生成使用间接寻址的代码。例如通过寄存器 R0R1 访问。
    • 你在代码中直接写访问操作即可,编译器会在后台处理具体的访问方式。

示例代码

以下是一个简单例子说明 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);
}

编译器如何处理?

编译器会根据变量的地址自动生成不同的指令:

  1. 低128字节(直接寻址示例):

    MOV A, var1   ; 从低128字节的地址直接读取到累加器
    MOV P0, A     ; 输出到P0端口
    
  2. 高128字节(间接寻址示例):

    MOV R0, #var2 ; 将高128字节的地址加载到R0
    MOV A, @R0    ; 使用间接寻址从高128字节地址读取数据到累加器
    MOV P1, A     ; 输出到P1端口
    

注意事项

  1. 访问速度差异

    • 低128字节采用直接寻址,效率更高。
    • 高128字节需使用间接寻址,指令多一步,速度稍慢。
  2. 编译器分配策略

    • 大多数情况下,编译器会优先将变量分配到低128字节。
    • 当低128字节空间不足时,才会使用高128字节。
  3. 手动优化

    • 如果对性能要求较高,可以通过优化变量定义的存储类(如尽量使用 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 文件,了解变量被分配到的具体地址。


注意事项

  1. 硬件限制

    • 高128字节RAM仅支持间接寻址,直接指定的变量会依赖编译器生成间接寻址代码。
  2. 地址冲突

    • 高128字节RAM的地址与 SFR 地址重叠,务必确保你的变量地址不会与 SFR 冲突。
  3. 适用范围

    • 不建议频繁手动操作变量地址,尤其在较复杂程序中可能导致管理混乱。仅在内存紧张或特定需求(如优化性能)时使用。

通过这些方法,你可以将变量手动分配到高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]

  1. 编译器会尝试将变量分配到 idata 区(包括低128字节和高128字节RAM)。
  2. 如果变量被分配到高128字节RAM,编译器会生成间接寻址代码来访问这些变量。

例如:

  • 变量分配在高128字节地址 0x80 ~ 0xFF
  • 对这些地址的访问始终使用寄存器(如 R0R1)和 @ 符号的间接寻址。

由于访问高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 的直接寻址冲突。


注意事项

  1. 编译器生成代码的正确性

    • 确保编译器(如 Keil C51)能够正确地处理高128字节RAM和 SFR 的访问方式。
    • 大多数主流编译器都能很好地区分间接寻址(高128字节RAM)和直接寻址(SFR)。
  2. RAM分配策略

    • 如果 idata 的低128字节不足,编译器才会使用高128字节RAM。
    • 你可以通过编译器生成的 MAP 文件 查看 alarm_cnt_100 的实际分配地址。
  3. 硬件限制

    • 某些兼容性较差的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单片机对空间区域的划分&#xff1a; 2.RAM被分配的区域是256bytes&#xff0c; 通常8051单片机ram是128bytes 8052的ram是256bytes&#xff08;其中高128位的地址和sfr区域地址重合&#xff0c;物理区域不同&#xff09; extern uint32_t alarm_cnt_1; uint32…...

【机器学习】梯度下降

文章目录 1. 梯度下降概念2. 梯度下降的技巧2.1 动态设置学习率2.2 Adagrad调整梯度2.3 随机梯度下降&#xff08;SGD&#xff09;2.4 特征缩放 3. 梯度下降理论基础 1. 梯度下降概念 梯度&#xff1a;Loss 对参数在某一点的偏微分&#xff0c;函数沿梯度的方向具有最大的变化…...

攻防世界web第十题Web_python_template_injection

这是题目&#xff0c;从题目上看是一个python模板注入类型的题目。 首先测试是否存在模板注入漏洞&#xff0c;构造http://61.147.171.105:57423/{{config}} 得到 说明存在模板注入漏洞&#xff0c;继续注入 构造http://61.147.171.105:57423/{{‘’.class.mro}}: 得到 再构造…...

【《python爬虫入门教程11--重剑无峰168》】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 【《python爬虫入门教程11--selenium的安装与使用》】 前言selenium就是一个可以实现python自动化的模块 一、Chrome的版本查找&#xff1f;-- 如果用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)&#xff0c;内存至少4G。 修改主机名和配置ip地址 hostnamectl set-hostname <hostname> 关闭主机的防火墙 # 关闭防火墙 systemctl stop firewalld #临时关闭防火墙 systemctl disable firewalld …...

openEuler ARM使用vdbench50407

openEuler ARM 使用 vdbench50407 系统信息&#xff1a;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&#xff0c;无法自动映射&#xff0c;需要用到投影ResultTransformer&#xff0c;所以我定义了一个投影工具类 JpaCommonService 2.异步调用原生查询方法的时候&#xff0c;需要用 NativeQuery<?> query entityMa…...

【SQL Server】教材数据库(1)

1 利用sql建立教材数据库&#xff0c;并定义以下基本表&#xff1a; 学生&#xff08;学号&#xff0c;年龄&#xff0c;性别&#xff0c;系名&#xff09; 教材&#xff08;编号&#xff0c;书名&#xff0c;出版社编号&#xff0c;价格&#xff09; 订购&#xff08;学号…...

cmake学习_incomplete

文章目录 cmake使用举例cmake示例模板编译时库查找基础知识模块模式导入目标 交叉编译配置基础知识模板实际使用 使用实例链接库解决符号冲突 参考资料 老规矩&#xff0c;先放官方文档 如何构建从互联网下载的源代码包:User Interaction Guide 想使用第三方库的开发者:Using …...

过度与动画的区别?

过渡&#xff08;Transition&#xff09;&#xff1a; 过渡效果是由元素的状态变化触发的&#xff0c;例如&#xff1a;当鼠标悬停在某个元素上、或当某个 CSS 属性值发生改变时。 必须指定起始状态和结束状态。过渡会在两者之间自动平滑过渡。 过渡的触发通常是用户交互或通过…...

tcpdump指南(1)

大家读完觉得有意义记得关注和点赞&#xff01;&#xff01;&#xff01; tcpdump是一种在网络上转储流量的网络工具。 这篇文章服务器作为一些常用命令的指南。如需完整指南&#xff0c; 请参阅手册页&#xff0c;或在 Linux 计算机上。man tcpdump 1 基本选项 帮助摘要&#…...

Linux(Centos 7.6)网卡信息没有了问题处理

1.问题现象 虚拟机打开后&#xff0c;使用ifconfig查看IP信息&#xff0c;虚拟机默认的网卡名称是ens33&#xff0c;ifconfig没有看到相关问题&#xff0c;远程连接工具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

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本大学校园生活信息平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…...

week05_nlp大模型训练·词向量文本向量

1、词向量训练 1.1 CBOW&#xff08;两边预测中间&#xff09; 一、CBOW 基本概念 CBOW 是一种用于生成词向量的方法&#xff0c;属于神经网络语言模型的一种。其核心思想是根据上下文来预测中心词。在 CBOW 中&#xff0c;输入是目标词的上下文词汇&#xff0c;输出是该目标…...

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比赛选拔赛真题详细解析…...

嵌入式开发中的机器人表情绘制

机器人的表情有两种&#xff0c;一种是贴图&#xff0c;一钟是调用图形API自绘。 贴图效果相对比较好&#xff0c;在存储空间大的情况下是可以采用的。 自绘比较麻烦&#xff0c;但在资源和空缺少的情况下&#xff0c;也是很有用的。而且自绘很容易通过调整参数加入随机效果&…...

本机实现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 实战之元服务:静态案例效果---我的热门应用服务

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1完整代码案例如下&#xff1a; Index import { authentica…...

二十三种设计模式-工厂方法模式

工厂方法模式是一种创建型设计模式&#xff0c;其核心思想是通过定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法模式将对象的实例化推迟到子类中进行&#xff0c;从而使得扩展变得容易&#xff0c;而不需要修改现有的代码&#xff0c;符合开闭原则&…...

硬件工程师面试题 21-30

把常见的硬件面试题进行总结&#xff0c;方便及时巩固复习。其中包括网络上的资源、大佬们的大厂面试题&#xff0c;其中可能会题目类似&#xff0c;加强印象即可。 更多硬件面试题&#xff1a;硬件工程师面试题 1-10硬件工程师面试题 11-20 21、单片机最小系统需要什么&#x…...

深度学习中的HTTP:从请求到响应的计算机网络交互

在现代深度学习应用中&#xff0c;HTTP&#xff08;超文本传输协议&#xff09;不仅仅是网页浏览的基础协议&#xff0c;它也在机器学习和人工智能的服务架构中扮演着至关重要的角色。本文将深入探讨HTTP在深度学习中的应用&#xff0c;并阐明它如何支持模型的训练、推理及API服…...

基于submitit实现Python函数的集群计算

一、项目介绍 Submitit是一款轻量级工具&#xff0c;旨在简化Python函数在Slurm集群上的提交过程。它不仅提供了对作业结果、日志文件等的无缝访问&#xff0c;更让开发者能够在本地执行与Slurm集群间切换自如&#xff0c;极大地提高了代码的可移植性和灵活性。 Slurm作为一种…...

开源GTKSystem.Windows.Forms框架:C# Winform跨平台运行深度解析

开源GTKSystem.Windows.Forms框架&#xff1a;C# Winform跨平台运行深度解析 一、跨平台框架的崛起 1.1 跨平台技术的现状与需求 在当今快速发展的科技时代&#xff0c;软件开发的需求日益多样化。随着移动设备和操作系统的不断涌现&#xff0c;开发者面临着前所未有的挑战&…...

uniapp Stripe 支付

引入 Stripe npm install stripe/stripe-js import { loadStripe } from stripe/stripe-js; Stripe 提供两种不同类型组件 Payment Element 和 Card Element&#xff1a;如果你使用的是 Payment Element&#xff0c;它是一个更高级别的组件&#xff0c;能够自动处理多种支…...

虚拟机用网线连其他设备(ROS多机网络配置)

电脑配置 把局域网的网线插入电脑&#xff0c;点击这边 配置以太网的IP 比如说我ROS主机的IP想设为192.168.144.10&#xff0c;那我笔记本的以太网IP可以设为192.168.144.8。 假设还有另外一个电脑&#xff08;ROS从机&#xff09;&#xff0c;他的IP被设置未192.168.144.4…...

20241218-信息安全理论与技术复习题

20241218-信息安全理论与技术复习题 一、习题1 信息安全的基本属性是&#xff08;D )。 A、机密性 B、可用性 C、完整性 D、上面 3 项都是 “会话侦听和劫持技术” 是属于&#xff08;B&#xff09;的技术。 A、 密码分析还原 B、 协议漏洞渗透 C、 应用漏洞分析与渗透 D、 D…...

家谱管理系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库…...

音频进阶学习九——离散时间傅里叶变换DTFT

文章目录 前言一、DTFT的解释1.DTFT公式2.DTFT右边释义1&#xff09; 复指数 e − j ω n e^{-j\omega n} e−jωn2&#xff09;序列与复指数相乘 x [ n ] ∗ e − j ω n x[n]*e^{-j\omega n} x[n]∗e−jωn复指数序列复数的共轭正交正交集 3&#xff09;复指数序列求和 3.DTF…...

pytorch 计算图中的叶子节点介绍

1. 什么是叶子节点&#xff1f; 在 PyTorch 的自动微分机制中&#xff0c;叶子节点&#xff08;leaf node&#xff09; 是计算图中&#xff1a; 由用户直接创建的张量&#xff0c;并且它的 requires_gradTrue。这些张量是计算图的起始点&#xff0c;通常作为模型参数或输入变…...

CSS系列(42)-- Backdrop Filter详解

前端技术探索系列&#xff1a;CSS Backdrop Filter详解 &#x1f3a8; 致读者&#xff1a;探索背景滤镜的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Backdrop Filter&#xff0c;这个强大的视觉效果特性。 基础效果 &#x1f680; 模糊效果 /…...

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(一)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 三、传统微调范式&#xff08;Traditional Fine-Tuning Paradigm&#xff09; 在这个范式中&#xff0c;首先在大量未标记的文本数据上预…...

ChatGPT 与 AGI:人工智能的当下与未来走向全解析

在人工智能的浩瀚星空中&#xff0c;AGI&#xff08;通用人工智能&#xff09;无疑是那颗最为璀璨且备受瞩目的星辰。OpenAI 对 AGI 的定义为“在最具经济价值的任务中超越人类的高度自治系统”&#xff0c;并勾勒出其发展的五个阶段&#xff0c;当下我们大多处于以 ChatGPT 为…...

Redis - 1 ( 11000 字 Redis 入门级教程 )

一&#xff1a;服务端高并发分布式结构演进之路 1.1 常见概念 概念定义生活例子类比应用&#xff08;Application&#xff09;/ 系统&#xff08;System&#xff09;为完成一整套服务的程序或一组相互配合的程序群。为完成一项任务而组成的由一个人或一群相互配合的人构成的团…...

python opencv的sift特征检测(Scale-Invariant Feature Transform)

sift 官方文档地址&#xff1a;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分两个步骤&#xff1a; 将bitstream的AES密钥存储在FPGA芯片内将使用AES密钥加密的Bitstream通过SPI Flash或JTAG加载至FPGA芯片 AES密钥可以存储在两个存储区之一&#x…...

如何通过深度学习提升大分辨率图像预测准确率?

随着科技的不断进步&#xff0c;图像处理在各个领域的应用日益广泛&#xff0c;特别是在医疗影像、卫星遥感、自动驾驶、安防监控等领域中&#xff0c;大分辨率图像的使用已经成为了一项不可或缺的技术。然而&#xff0c;大分辨率图像带来了巨大的计算和存储压力&#xff0c;同…...

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. 雪崩问题 微服务调用链路中的某个服务故障&#xff0c;引起整个链路中的所有微服务都不可用&#xff0c;这就是雪崩。动图演示&#xff1a; 在微服务系统…...

C++并行处理支持库 之六

C并行处理支持库 之六 std::promise构造器APIs应用实例 通过使用Futures标准库&#xff0c;我们可以获取异步任务返回值&#xff0c;捕获异步任务引发的异常。异步任务就是在独立线程中启动运行的函数。 这些值以共享状态进行通信&#xff0c;其中异步任务可以写入其返回值&…...

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&#xff1a;一个用于压缩和解压缩的工具。-z&#xff1a;表示使用 gzi…...

SpringBoot集成ECDH密钥交换

简介 对称加解密算法都需要一把秘钥&#xff0c;但是很多情况下&#xff0c;互联网环境不适合传输这把对称密码&#xff0c;有密钥泄露的风险&#xff0c;为了解决这个问题ECDH密钥交换应运而生 EC&#xff1a;Elliptic Curve——椭圆曲线&#xff0c;生成密钥的方法 DH&…...

深度学习的魔法世界

技术文章&#xff1a;深度学习的魔法世界 引言 嘿&#xff0c;今天我们要一起探索一个非常酷的魔法世界——深度学习&#xff01;这是一门让计算机变得超级聪明的科学。我们会用最简单的语言来解释深度学习的基本概念&#xff0c;让你们也能轻松理解。 一、深度学习的六大魔…...

【超级详细】Vue3项目上传文件到七牛云的详细笔记

概述 继上一篇笔记介绍如何绑定七牛云的域名之后&#xff0c;这篇笔记主要介绍了如何在Vue3项目中实现文件上传至七牛云的功能。我们将使用Cropper.js来处理图像裁剪&#xff0c;并通过自定义组件和API调用来完成整个流程。 这里直接给出关键部分js代码&#xff0c;上传之前要先…...

设计模式-建造者模式

在面向对象的设计中&#xff0c;建造者模式&#xff08;Builder Pattern&#xff09; 是一种常用的设计模式&#xff0c;它属于创建型模式&#xff0c;旨在将复杂对象的创建与其表示分离。通过该模式&#xff0c;我们可以一步一步地构造一个复杂的对象&#xff0c;避免构造函数…...

springboot+vue实现SSE服务器发送事件

思路 一个基于订阅发布机制的SSE事件。客户端可以请求订阅api&#xff08;携带客户端id&#xff09;&#xff0c;与服务器建立SSE链接&#xff1b;后续服务器需要推送消息到客户端时&#xff0c;再根据客户端id从已建立链接的会话中找到目标客户端&#xff0c;将消息推送出去。…...

IDEA | SpringBoot 项目中使用 Apifox 上传接口

目录 1 安装 Apifox Helper 插件2 获取 Apifox 的 API 访问令牌3 IDEA 中设置 API 访问令牌4 IDEA 中上传接口5 常见问题5.1 如何自动设置目录名5.2 如何自动设置接口名5.3 如何更改上传位置 Apifox 官方指南&#xff1a; https://apifox.com/help/applications-and-p…...