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

RT_Thread 调试笔记:串口打印、MSH控制台 相关

说明:记录日常使用 RT_Thread 开发时做的笔记。

持续更新中,欢迎收藏。

1.打印相关

1.打印宏定义,可以打印打印所在文件,函数,行数。

#define PRINT_TRACE() printf("-------%s:%s:%d------\r\n", __FILE__, __FUNCTION__, __LINE__);
__FILE__:正在编译文件的路径及文件名
__LINE__:正在编译文件的行号
__DATE__:编译时刻的日期字符串 如“July 19 2019”
__TIME__:编译时刻的时间字符串  如”22:00:00“
__FUNCTION__:函数名,类型为:字符常量指针
__VER__:IDE版本信息,类型为:整型

2. rt thread 3.1.5  nano版本中添加 rt_kprintf() 函数功能

.1 rtconfig.h头文件中开启控制台相关宏  #define RT_USING_CONSOLE
.2 在 board.c 中 添加串口初始化函数 和  rt_kprintf() 串口输出调用的函数 rt_hw_console_output()

#ifdef RT_USING_CONSOLEstatic int uart_init(void)
{
//#error "TODO 2: Enable the hardware uart and config baudrate."USART1_Init();return 0;
}
INIT_BOARD_EXPORT(uart_init);void rt_hw_console_output(const char *str)
{
//#error "TODO 3: Output the string 'str' through the uart."/* empty console output */rt_enter_critical();while (*str != '\0'){HAL_UART_Transmit(&Uart1Handle, (uint8_t *) (str++), 1, 1000);}rt_exit_critical();
}#endif

3. printf 重定向

可通过搜索功能查找到函数 fputc(),修改函数体中的串口数据发送函数。

/* printf 重定向  */
int fputc(int ch, FILE *f)
{
#if PRINTF_PORT_JLINKSEGGER_RTT_PutChar(0, ch);
#elseHAL_UART_Transmit(&Uart1Handle, (uint8_t *)&ch, 1, 1000);
#endifreturn (ch);
}int fgetc(FILE *f)
{int ch;HAL_UART_Receive(&Uart1Handle, (uint8_t *)&ch, 1, 1000);return (ch);
}

 4.串口打印函数

1.0 RT官方文档对print函数介绍

https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/libc/compiler

标准输出函数 (printf 家族)

printf 函数

在 Keil 和 IAR 编译平台下,用户可以直接使用 printf 函数;在 GCC 下,需要额外使能 RT_USING_POSIX_FS 和 RT_USING_POSIX_STDIO 宏才能使用 printf 函数。

rt_kprintf 函数 与 printf 函数的使用选择

        如果不是特殊需求,建议使用 rt_kprintf 函数,因为 printf 是由编译平台内部提供的,其空间占用、以及内存使用情况我们无从得知,printf 函数要比 rt_kprintf 函数的 ROM 占用大很多。

        无论是 rt_kprintf 函数以及 printf 函数都是非线程函数,在多线程同时使用的情况下,会出现交叉打印的现象,该问题是正常现象,因为根据 C 标准的要求,printf 函数就是非线程安全的。

        原生 rt_kprintf 函数是经过优化的,占用空间要比 printf 函数小很多。但是 rt_kprintf 函数并不支持浮点类型的输出。因此:

  1. 如需 rt_kprintf 函数支持浮点类型的输出,可以安装 rt_vsnprintf_full 软件包
  2. 如需 rt_kprintf 函数支持线程安全输出,可以安装 rt_kprintf_threadsafe 软件包
  3. 上述两个软件包可以同时安装使用,以同时让 rt_kprintf 支持线程安全和浮点类型输出的能力。

        其他字符串格式化输出函数 (例如 snprintf 等)

        其他字符串格式化输出函数(例如 snprintf 等)都是可以直接使用的。

        强烈建议用户使用 rt_snprintf 等 RT-Thread 这侧的函数来代替 snprintf 等函数以降低资源消耗。尤其是在 GCC 编译链下,Newlib(GCC 工具链内部默认的 C 库)内置提供的 snprintf 函数是非线程安全的,在多线程无保护输出浮点数的情况下可能会引发死机(snprintf 函数非线程安全是不正常的)。

        同理,原生 rt_snprintf 等函数不支持浮点输出,用户可以通过安装 rt_vsnprintf_full 软件包 来支持浮点数输出。

1.1 串口打印函数,可以直接打印字符串,或者变量值。(以下两种方式)

 rt_kprintf("led_test");

打印某个变量的数据,如打印 count 变量值

    while (1){rt_kprintf("thread1 count: %d\n", count ++);rt_thread_mdelay(500);}

1.2 printf 打印函数参数格式

描述:
        C 库函数 int printf(const char *format, ...) 发送格式化输出到标准输出 stdout。
printf()函数的调用格式为:

printf("<格式化字符串>", <参量表>);

声明:下面是 printf() 函数的声明。

printf("<格式化字符串>", <参量表>);

参数:
        format -- 这是字符串,包含了要被写入到标准输出 stdout 的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier,具体讲解如下:

格式字符

意义

d

以十进制形式输出带符号整数(正数不输出符号)

o

以八进制形式输出无符号整数(不输出前缀0)

x,X

以十六进制形式输出无符号整数(不输出前缀Ox)

u

以十进制形式输出无符号整数

f

以小数形式输出单、双精度实数

e,E

以指数形式输出单、双精度实数

g,G

以%f或%e中较短的输出宽度输出单、双精度实数

c

输出单个字符

s

输出字符串

p

输出指针地址

lu

32位无符号整数

llu

64位无符号整数

1.3 按固位数输出

        按固位数输出,比如4位 xxxx,6位 xxxxxx ,以下用 %x举例,其他格式也是相同用法。
应用说明,如果16进制(%x)输出 0x061E, 实际打印出的结果是 61E ,开始的0被省略掉。
如果需要按固定4位打印,则需要把 %x 改为 %04x,这样就能输出061E。

rt_kprintf("CpuID[0] = %08x ,CpuID[1] = %08x , CpuID[2] = %08x \r\n",CpuID[0],CpuID[1],CpuID[2]);

1.4 串口打印2,串口输出2,如通过串口打印输出一个字符数组。(非 rt_kprintf )

static rt_device_t serial;                                 /* 串口设备句柄 */
static char str[] = "中国加油,武汉加油,全世界加油!\r\n";  /* 需要发送的数据 */
//中间省略了串口配置的部分
rt_device_write(serial, 0, str, (sizeof(str)-1));
//打印输出,str是数组名可直接作为数组首地址的地址指针,sizeof(srt)计算数组的大小,这个语句可以自动全部打印输出str数组

1.5 RT THREAD 串口发送数据(非 rt_kprintf 函数)

向串口中写入数据,可以通过如下函数完成:

rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size);

参数

描述

dev

设备句柄

pos

写入数据偏移量,此参数串口设备未使用

buffer

内存缓冲区指针,放置要写入的数据

size

写入数据的大小

返回

——

写入数据的实际大小

如果是字符设备,返回大小以字节为单位;

0

需要读取当前线程的 errno 来判断错误状态

        调用这个函数,会把缓冲区 buffer 中的数据写入到设备 dev 中,写入数据的大小是 size。
向串口写入数据示例程序如下所示:

#define SAMPLE_UART_NAME       "uart2"    /* 串口设备名称 */
static rt_device_t serial;                /* 串口设备句柄 */
char str[] = "hello RT-Thread!\r\n";
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* 配置参数 */
/* 查找串口设备 */
serial = rt_device_find(SAMPLE_UART_NAME);/* 以中断接收及轮询发送模式打开串口设备 */
rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);
/* 发送字符串 */
rt_device_write(serial, 0, str, (sizeof(str) - 1));

1.6 打印输出数据按格式对齐

        比如输出数据1和11对齐,即输出01,11,这样有助于通过串口输出的数据整齐,方便后期数据处理;如下图,时分秒按2位显示对齐,只有各位数的,在十位补空格。这样让整个数据格式整齐。

        具体输出函数如下,在需要显示指定位数的地方 %2d ,表示按2位数据格式输出10进制数据。
经过测试发现,如果限制数据为 %2d 但是实际数据是3位,则输出任然按3位输出。

rt_kprintf("%d.%d.%d/%2d:%2d:%2d:AHT10 温度:%d;SHT30 湿度:%d;SHT30 温度:%d;SHT30 湿度:%d;\n",\rtc_data_hex[6],rtc_data_hex[5],rtc_data_hex[4],rtc_data_hex[2],rtc_data_hex[1],rtc_data_hex[0],\AHT10_temperature,AHT10_humidity,SHT30_temperature,SHT30_humidity);

1.7 rt_kprintf 打印输出数据按格式对齐

        使用 rt_kprintf 函数打印小数、浮点数,

rt_kprintf("表头 PA7 电压 = %d.%03d ,   传感器 PB0 电压 = %d.%03d\n", vol_bt / 1000, vol_bt % 1000, vol_sig / 1000, vol_sig % 1000);

1.8 调试信息、编译信息打印,如:编译路径,时间,日期,文件名字等等

__FILE__:正在编译文件的路径及文件名
__LINE__:正在编译文件的行号
__DATE__:编译时刻的日期字符串 如“July 19 2019”
__TIME__:编译时刻的时间字符串  如”22:00:00“
__FUNCTION__:函数名,类型为:字符常量指针
__VER__:IDE版本信息,类型为:整型char BuildFile[] = __FILE__;
int  BuildLine = __LINE__;
char BuildDate[] = __DATE__;
char BuildTime[] = __TIME__;
/* 为打印调试提供文件,行数,函数名等附加信息:*/
rt_kprintf("编译文件路径:%s\n", BuildFile);
rt_kprintf("编译代码所在行:%d\n", TestLine);
rt_kprintf("编译日期:%s\n", BuildDate);
rt_kprintf("编译时间:%s\n", BuildTime);

打印效果

1.9 串口底层直接发送数据

for( i = 0 ; i < Send_Count; i++)  //循环发送,直到发送完毕
{while((USART1->SR&0X40)==0);//判断串口数据是否发送完USART1->DR = DataScope_OutPut_Buffer[i]; //从串口丢一个字节数据出去
}

1.10 串口函数 rt_kprintf 打印字符串数组

/*定义一个字符串数组*/
u_char Adc_Channel_Name[CH_NUM][12] = \{{"ch1_vh2_r "},\{"ch1_vh1_ra"},\{"ch1_vh1_la"},\{"ch1_vh2_l "},\{"ch1_vh1_rb"},\{"ch1_vh1_lb"},\{"ch2_vh2_r "},\{"ch2_vh1_ra"},\{"ch2_vh1_la"},\{"ch2_vh2_l "},\{"ch2_vh1_rb"},\{"ch2_vh1_lb"},\{"ch1_th1   "},\{"ch2_th1   "},\{"24v_th1   "},\{"3v3_th1   "},\};/*通道名称*/---------------------  /*打印输出*/if (argc != 3 ){rt_kprintf("校准命令:请输入校准命令 和 校准目标值,单位mV,输入如: vcf ch1_vh2_r 14000 \n");rt_kprintf("当前采样电压 \n");for (uint8_t var = 0; var < CH_NUM; ++var){rt_kprintf("%s = %d \n",&Adc_Channel_Name[var][0],Adc_Channel_InVol[var]);}return;} 

输出效果

1.11 关于 %*.*s , %.*s

        小数点.后“*”表示输出位数,具体的数据来自参数表 printf 格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个“*”代替那个常量,然后在后面提供变量给“*”。同样,小数点.前也可以添加*,也要用户输入一个位宽值来代替,表示输出的字符所占位宽。也就是说,前面定义输出总宽度,后面定义输出字符个数。

举例:

#include <cstdio>  
#include <iostream>  int main()  
{      char *s = "this is test example";  int a,b;  printf("%.*s\n", 10, s);//这里的常量10就是给*号的,你也可以用一个变量来控制宽度  printf("%*.*s\n", 20, 10, s);//常量20控制输出所占位宽,也可以用一个变量控制  std::cin>>a>>b; //输入15 10  printf("%*.*s\n", a, b, s);//输出为:-----this is te  前面定义输出总宽度,后面定义输出字符个数std::cin.get();  std::cin.ignore();//暂停程序执行  
}  
输出结果为:this is te----------this is te//-代表空格15  10 //输入-----this is te转载于:https://www.cnblogs.com/ph829/p/5576832.html

1.12 打印宏定义内容

#define def_buffer_swver_data  "SW-MCU-V1.3-20210720"  /* 软件版本号 *//* 软件版本号打印 */
rt_kprintf("软件版本号: ");
rt_kprintf("%s",def_buffer_swver_data);
rt_kprintf("\r\n");

1.13 仿 rt_kprintf()函数,用在调试串口外的串口,更方便发送数据

 修改代码中 rt_device_write() 串口句柄参数,就可以像 rt_kprintf()一样使用自定义的串口了。

/*** This function will print a formatted string on system console* 本函数基于 系统的 rt_kprintf 改动而来,主要改动了 指向串口硬件的变量  yl_uart_device* @param fmt the format*/
void yl_kprintf(const char *fmt, ...)
{rt_device_t  yl_uart_device = serial_uart3;   /* 定义一个本函数用的串口硬件句柄 */va_list args;rt_size_t length;static char rt_log_buf[RT_CONSOLEBUF_SIZE];va_start(args, fmt);/* the return value of vsnprintf is the number of bytes that would be* written to buffer had if the size of the buffer been sufficiently* large excluding the terminating null byte. If the output string* would be larger than the rt_log_buf, we have to adjust the output* length. */length = rt_vsnprintf(rt_log_buf, sizeof(rt_log_buf) - 1, fmt, args);if (length > RT_CONSOLEBUF_SIZE - 1)length = RT_CONSOLEBUF_SIZE - 1;if (yl_uart_device == RT_NULL){rt_hw_console_output(rt_log_buf);}else{rt_uint16_t old_flag = yl_uart_device->open_flag;yl_uart_device->open_flag |= RT_DEVICE_FLAG_STREAM;//rt_device_write(serial_uart3, 0, rt_log_buf, length); /* 串口对应 RS232 */yl_rt_device_write(serial_uart3, 0, rt_log_buf, length);/* 串口对应硬件是RS485接口 */yl_uart_device->open_flag = old_flag;}va_end(args);
}
RTM_EXPORT(yl_kprintf);

1.14 仿 rt_kprintf()函数,方便打印调试信息的开关

通过宏定义来统一管理调试信息输出的开关

以下代码通过仿  LOG_D("Hello RT-Thread!"); 改变而得。/**************************以下内容放到 .h 文件中**************************************/
#define DEBUG_PRINTF_ONOFF 0        /* 调试信息打印开关 */
/* 调试信息打印函数 */
#define debug_printf(fmt, ...)                                  \do                                                          \{                                                           \if(DEBUG_PRINTF_ONOFF)rt_kprintf(fmt, ##__VA_ARGS__);   \}                                                           \while (0)/************************** .c 文件中的调用 **************************************/   for (uint8_t var = 0; var < max; ++var){debug_printf("函数回调功能触发  =  %d \r\n",var);rt_thread_mdelay(100);}

2. MSH 控制台功能

1. rt thread 3.1.5  nano版本中添加 MSH 控制台功能

.1 在 keil 软件包中勾选 shell 功能

.2 在 finsh_port.c 中看提示开启宏和串口接收函数。

添加 shell 功能后编译 在 finsh_port.c 文件中会有2个错误的提示。

/* 在 rtconfig.h  中开启 #include "finsh_config.h 宏 */
#ifndef RT_USING_FINSH
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h 
#endif#ifdef RT_USING_FINSH/* 定义串口接收功能 */
RT_WEAK char rt_hw_console_getchar(void)
{/* Note: the initial value of ch must < 0 */int ch = -1;//#error "TODO 4: Read a char from the uart and assign it to 'ch'."return ch;
}#endif /* RT_USING_FINSH */

.3 定义一个接收函数,放到 rt_hw_console_getchar 中调用

前提:串口已经实现了对串口数据的接收,接收的数据存储在了接收缓存中,缓存的前2个字节用于存储 shell 取了第几个字节数据,第3个字节开始存储串口收到的数据。

void read_uart1_ch(int *ch)
{uint16_t *count = NULL;count = (uint16_t *)usart1_rx_buf;*ch = usart1_rx_buf[*count];if (*ch == 0){*ch = -1;}else{*count = *count +1;}
}

3.调试笔记:

1.rt thread  内存申请失败调试笔记

问题描述:
1.在线程中调用了一个函数A,该函数会申请内存函数结束前会再释放。测试中发现这个函数在线程中调用几次后就提示异常,申请不到内存。
2:请教:内存的释放 是否是在 rt_free 后就完成?
3:大概逻辑

线程()
{while(n){调用函数:A(申请内存,执行相关工作,释放内存);延时;调用函数:A(申请内存,执行相关工作,释放内存);延时;}
}

 问题已解决自己回答:
1:调试发现内存堆分配了15K,关掉发现问题的线程后,发现系统跑起来其他线程都运行后,内存最大已经使用了13K多,这就反应了为什么前几次能申请到内存后面就申请不到了,因为这个线程运行的比较早开始时内存充足可以申请到,后面问题线程延时时系统调度启动了别的线程,导致内存堆空间减少,延时结束继续申请内存时就出现了内存不足。
2:增大内存堆后问题解决。

2. rt-thread 3.1.5 内存堆大小设置

.1 修改位置

在 board.c 文件中修改  #define RT_HEAP_SIZE (30*1024)
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/** Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP* the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes*/
#define RT_HEAP_SIZE (30*1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];

.2 官方介绍: RT-Thread 堆区大小设置

​RT-Thread 堆区大小设置

链接:https://www.cnblogs.com/jzcn/p/16427067.html

介绍了 RT-THREAD 内存堆的设置,STM32内存分布情况。

相关文章:

RT_Thread 调试笔记:串口打印、MSH控制台 相关

说明&#xff1a;记录日常使用 RT_Thread 开发时做的笔记。 持续更新中&#xff0c;欢迎收藏。 1.打印相关 1.打印宏定义&#xff0c;可以打印打印所在文件&#xff0c;函数&#xff0c;行数。 #define PRINT_TRACE() printf("-------%s:%s:%d------\r\n", __FIL…...

(适趣AI)Vue笔试题

&#x1f4d1;前言 本文主要是【Vue】——&#xff08;适趣AI&#xff09;Vue笔试题的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 …...

Matytype的安装问题(word及PPT报错问题)

特别针对&#xff1a;mathtype安装了多次&#xff0c;又卸载了多次的用户。 Word报弹错错误&#xff1a;参考 mathtype安装后&#xff0c;打开word出现没找到dll的错误&#xff0c;这个问题较好解决。 如何解决MathType兼容Office 2016-MathType中文网 PPT&#xff08;PowerPoi…...

docker拉取镜像提示 remote trust data does not exist for xxxxxx

1、How can I be sure that I am pulling a trusted image from docker 2、docker: you are not authorized to perform this operation: server returned 401. 以上两个问题可以试试以下解决办法 DOCKER_CONTENT_TRUSTfalse 本人是使用jenkins部署自己的项目到docker容器出现…...

ElasticSearch Nested类型全文检索、聚合查询

ElasticSearch Nested类型全文检索、聚合查询 Nested类型全文检索 创建索引 PUT /products1 {"mappings": {"properties": {"fulltext": {"type": "text"},"name": {"type": "text","…...

专业级的渗透测试服务,助力航空业数字化安全启航

​某知名航空公司是中国首批民营航空公司之一&#xff0c;运营国内外航线200多条&#xff0c;也是国内民航最高客座率的航空公司之一。在数字化发展中&#xff0c;该航空公司以数据驱动决策&#xff0c;通过精细化管理、数字创新和模式优化等方式&#xff0c;实现了精准营销和个…...

【docker】安装 Redis

查看可用的 redis版本 docker search redis拉取 redis最新镜像 docker pull redis:latest查看本地镜像 docker images创建挂在文件 mkdir -pv /test1/docker_volume/redis/datamkdir -pv /test1/docker_volume/redis/confcd /test1/docker_volume/redis/conf/touch redis.con…...

pinia的独立维护,统一导出及持久化

目录 1.说明及示例 2.注意 1.说明及示例 在src下创建store文件夹&#xff0c;在store文件夹下创建index.js文件&#xff0c;内容如下&#xff1a; import { createPinia } from "pinia"; // pinia的持久化 import piniaPluginPersistedstate from "pinia-pl…...

【AI视野·今日Robot 机器人论文速览 第六十七期】Mon, 1 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Mon, 1 Jan 2024 Totally 16 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers MURP: Multi-Agent Ultra-Wideband Relative Pose Estimation with Constrained Communications in 3D Environments Authors A…...

FBL刷写

刷写 1、刷写需求的理解2、刷写流程2.1、预编程阶段&#xff1a;保证在编程阶段的动作能够正常操作&#xff0c;控制器给响应。整车功能不会出现问题 刷写某一控制器时&#xff0c;避免其他控制器集DTC,85控制DTC&#xff1b; 28 通信控制.保证总线负载率不要过高&#xff08;下…...

OpenCV-Python(24):模板匹配

原理及介绍 模板匹配是一种常用的图像处理技术&#xff0c;它用于在一幅图像中寻找与给定模板最匹配的区域(在一副大图中搜寻查找模版图像位置的方法)。模板匹配的基本思想是将模板图像在目标图像上滑动&#xff0c;并计算它们的相似度&#xff0c;找到相似度最高的位置即为匹配…...

机器学习--回归算法

&#x1f333;&#x1f333;&#x1f333;小谈&#xff1a;一直想整理机器学习的相关笔记&#xff0c;但是一直在推脱&#xff0c;今天发现知识快忘却了&#xff08;虽然学的也不是那么深&#xff09;&#xff0c;但还是浅浅整理一下吧&#xff0c;便于以后重新学习。 &#x1…...

计算机网络——多址复用技术

1. 频分多址&#xff08;FDMA&#xff09; 1.1 基本原理 频率分配&#xff1a;在FDMA系统中&#xff0c;整个可用的频带被分割成多个较小的频带或通道。每个通道分配给一个用户。 时间利用&#xff1a;用户在分配给他们的频道上持续进行通信&#xff0c;不受时间限制。 1.2 优…...

stm32 HAL库 4096线ABZ编码器

[TOC]目录 ABZ编码器 4096线 买的是这个 AB相代表计数方向&#xff0c;Z代表过零点 cubemx配置 定时器Encoder 也可以选上DMA 中断 Z相GPIO中断 找一个空闲管脚 打开对应中断 代码 不用DMA int main(void) {short Enc_cnt 0;HAL_TIM_Encoder_Start_IT(&ht…...

Java爬虫之Jsoup

1.Jsoup相关概念 Jsoup很多概念和js类似&#xff0c;可参照对比理解 Document &#xff1a;文档对象。每份HTML页面都是一个文档对象&#xff0c;Document 是 jsoup 体系中最顶层的结构。 Element&#xff1a;元素对象。一个 Document 中可以着包含着多个 Element 对象&#…...

如何在 C# 12 中使用主构造函数

C# 12 中最引人注目的新功能之一是对主构造函数的支持。主构造函数的概念并不新鲜。包括 Scala、Kotlin 和 OCaml 在内的多种编程语言都支持直接在声明类的位置集成构造函数参数。 在本文中&#xff0c;我们将仔细研究主构造函数以及如何在 C# 12 中使用它们。若要运行本文中提…...

Zookeeper之Java客户端实战

ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有&#xff1a; ZooKeeper官方的Java客户端API。第三方的Java客户端API&#xff0c;比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…...

将文本文件导入Oracle数据库的简便方法:SQL Loader Express

需求 我有一个文本文件dbim.txt&#xff0c;是通过alert log生成的&#xff0c;内容如下&#xff1a; 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表&#xff1a; create table dbim(a varchar(16));我想把日志文件导入Or…...

element-ui table-自定义表格某列的表头样式或者功能

自带表格 自定义表格某列的表头样式或者功能 <el-table><el-table-column :prop"date">//自定义表身每行数据<template slot-scope"scope">{{scope.row[scope.column.label] - ? - : scope.row[scope.column.label]}}</template>…...

Android 13.0 SystemUI状态栏居中显示时间和修改时间显示样式

1.概述 在13.0的系统rom定制化开发中,在systemui状态栏系统时间默认显示在左边和通知显示在一起,但是客户想修改显示位置,想显示在中间,所以就要修改SystemUI 的Clock.java 文件这个就是管理显示时间的,居中显示的话就得修改布局文件了 效果图如下: 2.SystemUI状态栏居中显…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...