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

嵌入式蓝桥杯做题总结

第十二届省赛

按键代码

——自认为比较巧妙,定时器3被设置为10ms进入一次中断,代替了HAL_Delay(10)的方法消抖;

运用状态机机思想实现检测多个按键检测——且分为两个状态,其中一个状态PB1和PB2的按键不可使用

struct Key key[4] = {0, 0, 0};
uint8_t f;
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == TIM3){key[0].Key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);key[2].Key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);key[3].Key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);key[1].Key_sta = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);}//注意B2和B3对应Key[2]和Key[3];而B4对应Key[1];// Note that B2 and B3 correspond to Key[2] and Key[3]; B4 corresponds to Key[1];if (Para_flag==0) f=2;else f=4;//让按键B2~B3不可以在界面一中使用//注意上面的赋值// Make keys B2 to B3 unavailable in interface 1// Note the above assignmentfor (int i=0; i<f; i++){switch (key[i].sta){case 0:if (key[i].Key_sta==0){key[i].sta=1;}break;case 1:if (key[i].Key_sta==0){key[i].sta=2;}else{key[i].sta=0;}break;case 2:if(key[i].Key_sta==1) {key[i].sta=0;if(key[i].time<100){key[i].flag=1;key[i].time=0;}}else{key[i].time++;if (key[i].time>=100){key[i].long_flag=1;key[i].time=0;}}break;}}
}
//注意Time是用于检测长按按键的,本体用不上

菜单函数

在菜单中实现了按键二次检测 伏笔回收

#include "menu.h"
uint8_t data1=2, data2=4, data3=2;
double data4=3.5, data5=2;
char text1[30] = " ", text2[30] = " ",text3[30] = " ", text4[30] = " ";
char flag_m=0,Para_flag=0,PWM_Flag=1;void Menu(void)
{if (key[0].flag==1){flag_m=!flag_m;LCD_Clear(Black);//每次展示菜单前先清屏key[0].flag=0;}if (key[1].flag==1){PWM_Flag=!PWM_Flag;key[1].long_flag=0;key[1].flag=0;}//PWM和低电平的设置if (PWM_Flag==0)  __HAL_TIM_SetCompare(&htim15, TIM_CHANNEL_1, 20);else              __HAL_TIM_SetCompare(&htim15, TIM_CHANNEL_1, 0);if (flag_m==0){Para_flag = 0;show_Data();}else{Para_flag = 1;show_Para();}
}
void show_Data(void)
{data3=8-data1-data2;sprintf(text1, "       Data         ");sprintf(text2, "   CNBR:%d          ",data1);sprintf(text3, "   VNBR:%d          ",data2);sprintf(text4, "   IDLE:%d          ",data3);LCD_DisplayStringLine(Line2, (unsigned char *)text1);LCD_DisplayStringLine(Line4, (unsigned char *)text2);LCD_DisplayStringLine(Line6, (unsigned char *)text3);LCD_DisplayStringLine(Line8, (unsigned char *)text4);  
}void show_Para(void)
{sprintf(text1, "       Para         ");sprintf(text2, "   CNBR:%.2f          ",data4);sprintf(text3, "   VNBR:%.2f          ",data5);LCD_DisplayStringLine(Line2, (unsigned char *)text1);LCD_DisplayStringLine(Line4, (unsigned char *)text2);LCD_DisplayStringLine(Line6, (unsigned char *)text3);if (key[2].flag==1){data4+=0.5;data5+=0.5;key[2].long_flag=0;key[2].flag=0;}if (key[3].flag==1){data4-=0.5;data5-=0.5;key[3].long_flag=0;key[3].flag=0;}
}

我认为最难的就是串口部分

也可能是我的方法过于难了,应该可以使用先把串口数据存到数组,然后在数组中依靠下标来检测错误

遇到的难题--就是串口接收时检测到数据不符合格式,虽然重新开始存入数据,但是数据缓存区的数据没有被清空,会被带到下一次数据中,因此在寻找清空缓存区的方法过程中浪费很多时间,所幸也找到了对应的方法--暂时关闭中断接收,再在while循环中打开

//printf函数重写
int fputc(int c, FILE *stream)
{uint8_t ch[1]={c};HAL_UART_Transmit(&huart1, (unsigned char *)ch, 1, 0xFFFF);return c;
}uint8_t rx=0;
uint8_t Index=0;
char temp_t[5];
char temp_n[5];
char temp_time[11];
char temp_minute[3];
char trash;
uint8_t usart_state=0;//用于标志是否接收完数据 是否可以进入处理函数//方法1 在串口处初步处理信息——出现bug是无法清除串口缓存区导致的
//串口接收中断函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1){if (Index<4){HAL_UART_Receive_IT(&huart1, &rx, 1);temp_t[Index++]=rx;}else if(Index==4){HAL_UART_Receive_IT(&huart1, &rx, 1);if (rx!=':'){//目的:出现错误时会打印出两个Error,尝试在出现错误后读取数据并清空数据来解决问题//方法一:失败——找不到对应的寄存器//把剩下的数据读出即可//实现方法while(sr&rx_flag)xxx=dr
//        while(USART1->ISR&0x10)
//        {
//          HAL_UART_Receive_IT(&huart1, &rx, 1);
//          trash=rx;
//        }//方法二:这个函数似乎不起作用
//        __HAL_UART_FLUSH_DRREGISTER(&huart1);
//        //方法三:似乎也不起作用
//        while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)==SET)
//        {
//          HAL_UART_Receive_IT(&huart1, &rx, 1);
//        }
//        __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);//方法三:直接在这关闭串口中断接收,然后在while循环中再打开 效果出奇地好//可能关闭中断接收后,对应的缓存区的数据也被清除了HAL_UART_AbortReceive_IT(&huart1);Index=0;printf("Erorr\r\n");}else{Index++;}}else if (Index<9){HAL_UART_Receive_IT(&huart1, &rx, 1);temp_n[(Index++)-5]=rx;}else if (Index==9){HAL_UART_Receive_IT(&huart1, &rx, 1);if (rx!=':'){
//        while(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)==SET)
//        {
//          HAL_UART_Receive_IT(&huart1, &rx, 1);
//        }
//        __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);HAL_UART_AbortReceive_IT(&huart1);Index=0;printf("Erorr\r\n");}else{Index++;}}else if (Index>9)//前大段数字{if(Index<20){HAL_UART_Receive_IT(&huart1, &rx, 1);temp_time[(Index++)-10]=rx;}else//只有分{HAL_UART_Receive_IT(&huart1, &rx, 1);temp_minute[(Index++)-20] = rx;}}if (Index==22){usart_state=1; Index=0;//表示一组数据接收完成 置标志位 可以进入数据处理函数}
//    if (Index==22)
//    {
//      for (int i=0;i<4;i++) printf("%c", temp_t[i]);
//      printf(":");
//      for (int i=0;i<4;i++) printf("%c", temp_n[i]);
//      printf(":");
//      for (int i=0;i<12;i++) printf("%c", temp_time[i]);
//    }}
}
#include "Myusart.h"struct In in[8]={0};
uint8_t yn=0;//是否在车库内
uint8_t outcar_index=0;
double Money=0;
uint16_t Time_parking=0;
struct Time temp_time_struct;void USART_Deal(void)
{if (usart_state==1){//置零以便下次工作usart_state=0;//先把字符串数组的最后一位置为'\0'——必要操作temp_n[4]='\0';temp_t[4]='\0';temp_time[10]='\0';temp_minute[2]='\0';//对时间进行处理//注意strtol最大只能转int32_t的数 uint64_t number=strtol(temp_time, NULL, 10);//字符串数字转int类型uint8_t number1=strtol(temp_minute, NULL, 10);temp_time_struct.Y=number/1000000;//yeartemp_time_struct.M=number/10000%100;//monthtemp_time_struct.D=number/100%100;//daytemp_time_struct.h=number%100;//hourtemp_time_struct.m=number1;//min//Error情况if ((temp_time_struct.M>12)&& (temp_time_struct.D>31)&& (temp_time_struct.h>23)&& (temp_time_struct.m>59)){printf("Erorr\r\n");return ;}//遍历结构体数组寻找number1;//min是否已经停在车库for(int i=0; i<8; i++){if (in[i].YN==1){if (!strcmp(temp_n, in[i].num)){outcar_index=i;yn=1;//出停车库//并把对应车辆所有清零}else {yn=0;}}else {yn=0;}}//是否在车库内之后的操作if (yn==1){//出停车库//并把对应车辆所有清零in[outcar_index].YN=0;Time_parking = (temp_time_struct.Y-in[outcar_index].t.Y)*8760+(temp_time_struct.M-in[outcar_index].t.M)*720+(temp_time_struct.D-in[outcar_index].t.D)*24+(temp_time_struct.h-in[outcar_index].t.h)+(bool)(temp_time_struct.m-in[outcar_index].t.m);if(!(strcmp(temp_t, "CNBR\0"))){Money=Time_parking*data4;data1--;}if ((!strcmp(temp_t, "VNBR\0"))){Money=Time_parking*data5;data2--;}printf("%s:%s:%d:%.2f\r\n", temp_t, temp_n, Time_parking, Money);printf("%d\r\n", in[outcar_index].YN);}else//进入停车库 记录信息{//判断车位是否已满 如果已满则取消操作data3=8-data1-data2;if ((data3-1)<0){printf("Erorr\r\n");return ;}else{if(!(strcmp(temp_t, "CNBR\0"))){data1++;}if ((!strcmp(temp_t, "VNBR\0"))){data2++;}}//寻找结构体数组中的空位uint8_t temp_index=0;for(int i=0; i<8; i++){if (in[i].YN==0){temp_index=i;}}//赋值strcpy(in[temp_index].type, temp_t);strcpy(in[temp_index].num, temp_n);//注意strtol最大只能转int32_t的数 uint64_t number=strtol(temp_time, NULL, 10);//字符串数字转int类型uint8_t number1=strtol(temp_minute, NULL, 10);in[temp_index].t.Y=number/1000000;//yearin[temp_index].t.M=number/10000%100;//monthin[temp_index].t.D=number/100%100;//dayin[temp_index].t.h=number%100;//hourin[temp_index].t.m=number1;//minin[temp_index].YN=1;printf("%s-",in[temp_index].type);printf("%s-",in[temp_index].num);printf("%d-%d-%d-%d-%d\r\n",in[temp_index].t.Y,in[temp_index].t.M,in[temp_index].t.D,in[temp_index].t.h,in[temp_index].t.m);}}}

串口代码的优化

这次采取的方法是先把数据存到数组中,再根据下标判断数据是否符合规范

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if (huart->Instance == USART1){HAL_UART_Receive_IT(&huart1, &rx, 1);data[data_index++] = rx;if (data_index>=22){//关闭串口接收中断——清空缓存区,以免有多余信息HAL_UART_AbortReceive_IT(&huart1);data_index=0;usart_state=1;
//      printf("%s", data);}}
}
void Usart_Deal_Better(void)
{if (usart_state==1){//置零以便下次工作usart_state=0;if (!(data[3]==':')&&!(data[9]==':'))//判断':'格式{printf("Error");return ;}//判断数字是否正确strncpy(temp_time, data+10, 10);strncpy(temp_minute, data+20, 2);temp_time[10]='\0';temp_minute[2]='\0';uint64_t number=strtol(temp_time, NULL, 10);//字符串数字转int类型uint8_t number1=strtol(temp_minute, NULL, 10);temp_time_struct.Y=number/1000000;//yeartemp_time_struct.M=number/10000%100;//monthtemp_time_struct.D=number/100%100;//daytemp_time_struct.h=number%100;//hourtemp_time_struct.m=number1;//minif ((temp_time_struct.Y>2099)||(temp_time_struct.Y<2000)||(temp_time_struct.M>12)||(temp_time_struct.D>31)||(temp_time_struct.h>23)||(temp_time_struct.m>59)){printf("Error\r\n");return ;}//判断是否在停车场中//复制编号出来strncpy(temp_n, data+5, 4); for (int i=0; i<8; i++){if (in[i].YN==1){if (!strcmp(temp_n, in[i].num))//如果在停车场中{if (strncmp(data, in[i].type, 4)){printf("Error\r\n");return ;}else {outcar_index=i;yn=1;break;}}else//不在停车场中{yn=0;}}else yn=0;}uint8_t temp_index=0;//用于寻找结构体数组内的空位if (yn==0)//新来的{if (strncmp(data,"CNBR", 4)&&strncmp(data,"VNBR", 4))//判断停车类型{printf("Error\r\n");return ;}else//类型输入正确{data3=8-data1-data2;if ((data3-1)<=0){printf("Error\r\n");return ;}else//停车位充足{if (!strncmp(data,"CNBR", 4)){data1++;}if (!strncmp(data,"VNBR", 4)){data2++;}for (int i=0; i<8; i++)//寻找结构体数组中的空位{if (in[i].YN==0){temp_index=i;break;}}//登记信息strncpy(in[temp_index].type, data, 4);strncpy(in[temp_index].num, data+5, 4);strncpy(temp_time, data+10, 10);strncpy(temp_minute, data+20, 2);temp_time[10]='\0';temp_minute[2]='\0';uint64_t number=strtol(temp_time, NULL, 10);//字符串数字转int类型uint8_t number1=strtol(temp_minute, NULL, 10);in[temp_index].t.Y=temp_time_struct.Y;in[temp_index].t.M=temp_time_struct.M;in[temp_index].t.D=temp_time_struct.D;in[temp_index].t.h=temp_time_struct.h;in[temp_index].t.m=temp_time_struct.m;in[temp_index].YN=1;printf("%s-",in[temp_index].type);printf("%s-",in[temp_index].num);printf("%d-%d-%d-%d-%d\r\n",in[temp_index].t.Y,in[temp_index].t.M,in[temp_index].t.D,in[temp_index].t.h,in[temp_index].t.m);}}}else//出停车库 {in[outcar_index].YN=0;strncpy(temp_t, data, 4);Time_parking = (temp_time_struct.Y-in[outcar_index].t.Y)*8760+(temp_time_struct.M-in[outcar_index].t.M)*720+(temp_time_struct.D-in[outcar_index].t.D)*24+(temp_time_struct.h-in[outcar_index].t.h);if ((temp_time_struct.m-in[outcar_index].t.m>0)){Time_parking++;}  if(!(strcmp(temp_t, "CNBR\0"))){Money=Time_parking*data4;data1--;}if ((!strcmp(temp_t, "VNBR\0"))){Money=Time_parking*data5;data2--;}printf("%s:%s:%d:%.2f\r\n", temp_t, temp_n, Time_parking, Money);}}
}

十三届省赛

IIC部分

IIC的读写eeprom和读读eeprom之间必须要有时间间隔,否则会出现写入错误或者读出错误

例如图中的Delay10ms

ADC采样部分

由于之前ADC采集两个电位器电压是用了不同的两个ADC,而这次题目要求是用同一个ADC的不同通道,这就涉及到了ADC多通道采集的问题了

首先cubemx配置,打开对应的输入引脚

再打开扫描模式,连续转换,DMA转运

 

 代码甚至只需要一句

自己创建一个数组存储数据

HAL_ADC_Start_DMA(&hadc2, (uint32_t *)ADC_value,2);

仔细看芯片手册,板子上的电压采集是J11和J12口,因为没看清楚,导致浪费了3个小时检查错误

且要注意一直打开DMA转运会严重拖慢程序的执行,即导致板子上程序运行极为缓慢,所以可以在交互后需要获取ADC的值时打开ADC_DMA转运,接收好数据后立马关闭,这样就不会太大地影响板子的运行速度了

if (B4==0)//Data{HAL_ADC_Start_DMA(&hadc2, (uint32_t *)ADC_value,2);HAL_Delay(10);data1=ADC_value[0]*3.3/4096;data2=ADC_value[1]*3.3/4096;recd1++;recd1_5++;recdPA4_buff[PA4_Index++]=data1;recdPA5_buff[PA5_Index++]=data2;if (recd2<data1)    {recd2=data1;}if (recd3>data1)    {recd3=data1;}if (recd2_5<data2)  {recd2_5=data2;}if (recd3_5>data2)  {recd3_5=data2;}HAL_ADC_Stop_DMA(&hadc2);//记得关闭DMA,否则会导致程序运行缓慢}

 

相关文章:

嵌入式蓝桥杯做题总结

第十二届省赛 按键代码 ——自认为比较巧妙&#xff0c;定时器3被设置为10ms进入一次中断&#xff0c;代替了HAL_Delay(10)的方法消抖&#xff1b; 运用状态机机思想实现检测多个按键检测——且分为两个状态&#xff0c;其中一个状态PB&#xff11;和PB&#xff12;的按键不…...

Spring Boot 常用注解大全

以下是Spring Boot中常用的注解及其详细解释以及相应的代码示例&#xff1a; SpringBootApplication: 这个注解用于标识一个Spring Boot应用的主类。它整合了 Configuration&#xff0c;EnableAutoConfiguration 和 ComponentScan。 SpringBootApplication public class Demo…...

(MATLAB)第十二章-数列与极限

目录 12.1 数列 12.1.1 数列求和 1. 累计求和函数sum() 2. 忽略NaN累计求和函数 nansum() 3. 求此元素位置之前的元素和函数cumsum() 4. 求梯形累计和函数cumtrapz() 12.1.2 数列求积 1. 元素连续相乘函数 prod() 2. 求累计积函数 cumprod() 3. 阶乘函数 ffactorial(n…...

OJ输入问题+准备

写在之前&#xff1a; 发现题目输入是这样的&#xff1a; 我的问题&#xff1a;如何通过空格分割这些输入的字符串并分别保存&#xff01;&#xff01;&#xff08;C语言scanf好解决一点但我选择C....&#xff09; C引入了ostringstream、istringstream、stringstream这三个类…...

软考高级:主动攻击和被动攻击概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…...

cuda python torch 虚拟环境配置

以下是Pytorch和CUDA对应的版本 以下是Pytorch和Python对应的版本 检查cuda与Python版本是否匹配 import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.empty(3,4,devicecuda))cuda 删除cuda conda uninstall cudatoolkit --forceconda u…...

激光炸弹 刷题笔记

前置知识 二维前缀和 子矩阵的和 刷题笔记 {二维前缀和}-CSDN博客 思路 参考二维前缀和 将子矩阵的和 做成动态矩阵 一个个矩阵搜索 符合要求边长 矩阵中的元素和最大值 将x1,y1用i-k,j-k表示即可 x2,y2用i&#xff0c;j表示 代码 #include<iostream> #include<…...

Vue3学习记录(三)--- 组合式API之生命周期和模板引用

一、生命周期 1、简介 ​ 生命周期&#xff0c;指的是一个 Vue 实例从创建到销毁的完整阶段&#xff0c;强调的是一个时间段。 ​ 生命周期钩子函数&#xff0c;指的是 Vue 实例提供的内置函数&#xff0c;函数的参数为一个回调函数。这些钩子函数会在实例生命周期的某些固定…...

Batch Normalization和Layer Normalization和Group normalization

文章目录 前言一、Group normalization二、批量规范化(Batch Normalization)三、层规范化&#xff08;Layer Normalization&#xff09; 前言 批量规范化和层规范化在神经网络中的每个批次或每个层上进行规范化&#xff0c;而GroupNorm将特征分成多个组&#xff0c;并在每个组内…...

命名实体识别NER(综合代码示例)

一、命名实体识别发展方向 二、中文数据集 CCKS2017开放的中文的电子病例测评相关的数据。 评测任务一&#xff1a;https://biendata.com/competition/CCKS2017_1/ 评测任务二&#xff1a;https://biendata.com/competition/CCKS2017_2/ CCKS2018开放的音乐领域的实体识别任务…...

关于jQuery日历插件:daterangepicker

关于options singleDatePicker: false 双日历&#xff0c;true 单日历 timePicker&#xff1a;false 不显示时分秒&#xff0c;true 显示时分秒 timePickerIncreament&#xff1a;1 默认值 {singleDatePicker : false, //是否显示单日历框 dateLimit : { days : 30 }, //起…...

【贪心算法】最大子序和

给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组是数组中的一个连续部分。 示例 1&#xff1a; 输入&#xff1a;nums [-2,1,-3,4,-1,2,1,-5,4] 输出&#xff1a;6…...

爬虫逆向网站案例

一、相关网页 东方财富人气排行榜 二、查找url 三、寻找curl并复制 四、打开Convert curl commands to code (curlconverter.com) 五、修改并执行代码 import requestscookies {st_si: 73974981954644,st_pvi: 39724919122964,st_sp: 2024-03-05%2018%3A27%3A22,st_inirUrl:…...

蓝桥杯复习之前缀和

题目链接&#xff1a;https://www.luogu.com.cn/problem/P8649 思路&#xff1a; 看到区间和&#xff0c;第一反应肯定是前缀和&#xff0c;我们求出前缀和后对前缀和数组每一个值模k&#xff0c;然后对一个数组的值查看前面有几个相同的&#xff0c;举个例子&#xff1a;…...

动态规划(算法竞赛、蓝桥杯)--背包DP求具体方案

1、B站视频链接&#xff1a;E20 背包DP 求具体方案_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N1010; int v[N],w[N]; int f[N][N],p[N][N];int main(){int n,m;cin>>n>>m;for(int i1;i<n;i)cin>>v[i]>>w[i…...

go写mysql取得自增字段值

场景&#xff1a;有多张表&#xff0c;依据其中一张表的自增字段取得 id 值作为对象ID&#xff0c;然后使用这个Id插入到其他它表中。 如下一张 MySQL 的 innodb 表 X&#xff0c;用 go 编写程序&#xff0c;不指定 a 的值&#xff0c;指定 b 和 c 的值&#xff0c;往表 X 插入…...

Vue 3的Composition API和vue2的不同之处

Vue 3的Composition API是Vue.js框架的一个重要更新&#xff0c;它提供了一种新的组件逻辑组织和复用方式。在Vue 2中&#xff0c;我们通常使用Options API&#xff08;data、methods、computed等&#xff09;来组织组件的逻辑&#xff0c;但这种组织方式在处理复杂组件时可能会…...

go语言基础 -- 面向对象编程

go语言面向对象编程思想 面向对象编程离不开封装、继承、多态三个特性&#xff0c;go语言与其他c、java不太一样&#xff0c;没有类的概念&#xff0c;面向对象的实现也有些区别&#xff0c;下面分别描述。 go语言封装 结构体中字段如欲对外隐藏&#xff0c;首字母小写&…...

HarmonyOS—编译构建概述

编译构建是将应用/服务的源代码、资源、第三方库等&#xff0c;通过编译工具转换为可直接在硬件设备上运行的二进制机器码&#xff0c;然后再将二进制机器码封装为HAP/APP软件包&#xff0c;并为HAP/APP包进行签名的过程。其中&#xff0c;HAP是可以直接运行在模拟器或真机设备…...

下载element-ui 资源,图标 element-icons.woff,element-icons.ttf 无法解码文件字体

css下载地址&#xff1a;https://unpkg.com/element-ui2.15.14/lib/theme-chalk/index.css js下载地址&#xff1a;https://unpkg.com/element-ui2.15.14/lib/index.js 图标及文字文件下载地址&#xff1a; element-icons.woff:&#xff1a; ​ https://unpkg.com/element-…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码"&#xff1a;Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力&#xff0c;从金融交易到交通管控&#xff0c;这些关乎国计民生的关键领域…...