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 函数并不支持浮点类型的输出。因此:
- 如需 rt_kprintf 函数支持浮点类型的输出,可以安装 rt_vsnprintf_full 软件包
- 如需 rt_kprintf 函数支持线程安全输出,可以安装 rt_kprintf_threadsafe 软件包
- 上述两个软件包可以同时安装使用,以同时让 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控制台 相关
说明:记录日常使用 RT_Thread 开发时做的笔记。 持续更新中,欢迎收藏。 1.打印相关 1.打印宏定义,可以打印打印所在文件,函数,行数。 #define PRINT_TRACE() printf("-------%s:%s:%d------\r\n", __FIL…...
(适趣AI)Vue笔试题
📑前言 本文主要是【Vue】——(适趣AI)Vue笔试题的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 …...
Matytype的安装问题(word及PPT报错问题)
特别针对:mathtype安装了多次,又卸载了多次的用户。 Word报弹错错误:参考 mathtype安装后,打开word出现没找到dll的错误,这个问题较好解决。 如何解决MathType兼容Office 2016-MathType中文网 PPT(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","…...
专业级的渗透测试服务,助力航空业数字化安全启航
某知名航空公司是中国首批民营航空公司之一,运营国内外航线200多条,也是国内民航最高客座率的航空公司之一。在数字化发展中,该航空公司以数据驱动决策,通过精细化管理、数字创新和模式优化等方式,实现了精准营销和个…...
【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文件夹,在store文件夹下创建index.js文件,内容如下: 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 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers MURP: Multi-Agent Ultra-Wideband Relative Pose Estimation with Constrained Communications in 3D Environments Authors A…...
FBL刷写
刷写 1、刷写需求的理解2、刷写流程2.1、预编程阶段:保证在编程阶段的动作能够正常操作,控制器给响应。整车功能不会出现问题 刷写某一控制器时,避免其他控制器集DTC,85控制DTC; 28 通信控制.保证总线负载率不要过高(下…...
OpenCV-Python(24):模板匹配
原理及介绍 模板匹配是一种常用的图像处理技术,它用于在一幅图像中寻找与给定模板最匹配的区域(在一副大图中搜寻查找模版图像位置的方法)。模板匹配的基本思想是将模板图像在目标图像上滑动,并计算它们的相似度,找到相似度最高的位置即为匹配…...
机器学习--回归算法
🌳🌳🌳小谈:一直想整理机器学习的相关笔记,但是一直在推脱,今天发现知识快忘却了(虽然学的也不是那么深),但还是浅浅整理一下吧,便于以后重新学习。 …...
计算机网络——多址复用技术
1. 频分多址(FDMA) 1.1 基本原理 频率分配:在FDMA系统中,整个可用的频带被分割成多个较小的频带或通道。每个通道分配给一个用户。 时间利用:用户在分配给他们的频道上持续进行通信,不受时间限制。 1.2 优…...
stm32 HAL库 4096线ABZ编码器
[TOC]目录 ABZ编码器 4096线 买的是这个 AB相代表计数方向,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类似,可参照对比理解 Document :文档对象。每份HTML页面都是一个文档对象,Document 是 jsoup 体系中最顶层的结构。 Element:元素对象。一个 Document 中可以着包含着多个 Element 对象&#…...
如何在 C# 12 中使用主构造函数
C# 12 中最引人注目的新功能之一是对主构造函数的支持。主构造函数的概念并不新鲜。包括 Scala、Kotlin 和 OCaml 在内的多种编程语言都支持直接在声明类的位置集成构造函数参数。 在本文中,我们将仔细研究主构造函数以及如何在 C# 12 中使用它们。若要运行本文中提…...
Zookeeper之Java客户端实战
ZooKeeper应用的开发主要通过Java客户端API去连接和操作ZooKeeper集群。可供选择的Java客户端API有: ZooKeeper官方的Java客户端API。第三方的Java客户端API,比如Curator。 接下来我们将逐一学习一下这两个java客户端是如何操作zookeeper的。 1. ZooKe…...
将文本文件导入Oracle数据库的简便方法:SQL Loader Express
需求 我有一个文本文件dbim.txt,是通过alert log生成的,内容如下: 2020-09-11 2020-09-11 ... 2023-12-03 2023-12-03 2023-12-26我已经在Oracle数据库中建立了目标表: 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状态栏居中显…...
讲解eureca和nacus的区别
Eureca和Nacus都是远程过程调用(RPC)框架,用于实现分布式系统中不同节点之间的通信。它们之间的主要区别如下: 架构设计:Eureca是一个基于JavaScript的RPC框架,它使用了WebSockets作为传输层协议。Eureca C…...
python中parsel模块的css解析
一、爬虫页面分类 1.想要爬取的内容全部在标签中,可以使用xpath去进行解析如下图 2.想要爬取的内容呈现json的数据特征,用.json()转换为字典格式 3.页面不规则,标签中包含大括号,如下面想要获取键值内容怎么做,先用re正…...
Oracle OCP怎么样线上考试呢
大家好!今天咱们就来聊聊Oracle OCP这个让人又爱又恨的认证。为啥说又爱又恨呢?因为它既是IT界的“金字招牌”,又是一块硬骨头,不是那么容易啃下来的。好了,废话不多说,我们直奔主题,来看看关于…...
如何让自己的写的程序在阿里云一直运行
购买了阿里云服务器后,每次要用自己写在阿里云的服务器程序都要连接到云端 然后./运行该程序,而且每次一断开终端,该服务器就会自动停止,这样使用相当麻烦。那怎样才能让我们的服务器一直在云端后台运行,即便退出终端…...
【计算机图形学】NAP: Neural 3D Articulation Prior
文章目录 1. 这篇论文做了什么事,有什么贡献?2. Related Work铰接物体建模3D中的Diffusion model扩散模型 3. Pipeline铰接树参数化基于Diffusion的铰接树生成去噪网络 4. 实验评价铰接物体生成——以往做法与本文提出的新指标NAP捕捉到的铰接物体分布质…...
知识付费平台搭建?找明理信息科技,专业且高效
明理信息科技知识付费saas租户平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和…...
CentOS7部署Kafka
CentOS7部署Kafka 一、部署1、前置条件2、下载与解压3、修改配置4、启动kafka二、使用详解1、创建一个主题2、展示所有主题3、启动消费端接收消息4、生产端发送消息三、代码集成pom.xmlapplication.propertiesKafkaConfiguration.javaKafkaConsumer.javaKafkaProducer.javaVehi…...
JS的防抖和节流
目录 防抖 搜索框带来的问题 实现的思路 案例 封装防抖函数 节流 滚动条加载带来的问题 实现的思路 案例 封装节流函数 防抖 搜索框带来的问题 需求:根据输入框内容来请求数据 <!DOCTYPE html> <html lang"en"> <head><…...
互联网加竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类
文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径,图像尺寸,数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…...
pip安装报错SSL
confirming the ssl certificate: HTTPSConnectionPool(hostmirrors.cloud.tencent.com, port443) 错误代码如上 偶然搜索:ubuntu pip出错 confirming the ssl certificate: HTTPSConnectionPool(host‘mirrors.cloud.tencent.com’, port443) 看到这个回答 【日常踩…...
物流建设网站总结/百度网盘资源搜索
点蓝字关注我们大胆热爱Hello Everybody【火影秘术小课堂】开课了本期的主题【c盘满了怎么办】火粉们赶紧搬好小板凳,准备上课吧1c盘为什么会满在如今这个信息爆炸增长的时代,我们要看的信息越来越多,也就意味着在电脑里有意无意留存的资料也…...
资源搜索/重庆seo网站推广优化
MVCC(Mutil-Version Concurrency Control)MVCC 是一种多版本并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。在Mysql的InnoDB引擎中就是指在已提交读(READ COMMITTD)和可重复读(REPEATABLE READ)这两种隔离级别下的事务对于SELECT操作会…...
新一站保险网/放心网站推广优化咨询
接上文:http://blog.csdn.net/l241002209/article/details/72763774[mysqllocalhost MySQL-5.6.36-1.linux_glibc2.5.x86_64.rpm-bundle]$ mysql -uroot -p123456#设置远程访问#root是允许远程访问的账户名(可以是其他的),"192.168.7.200"表示…...
网站做301跳转的方法/免费推客推广平台
今天,小编就据目前互联网行业的发展,以及大数据Hadoop分布式集群等等来讲解一下,政企如何搭建大数据计算服务平台。互联网信息技术的迅猛发展,云计算、物联网、智能科技、AI、超级计算机等等的出现和发展,使数据量不断…...
酒泉哪家公司可以做网站/搜狐视频
点击左上方蓝字关注我们【飞桨开发者说】尹梓琦,北京理工大学在读本科生,关注图深度学习,图挖掘算法和谱图理论随着深度学习在欧几里得空间的成功应用,例如CNN,RNN等极大的提高了图像分类,序列预测等任务的…...
福田蒙派克6座/广州seo网络优化公司
服务器数据恢复故障描述: 这次要为大家介绍的数据恢复案例是一台存储因硬盘出现故障导致的数据丢失。这台存储设备为某常见品牌的DS5300型号存储,存储连接扩展柜。存储的最底层是十几块硬盘组成的几组raid5磁盘阵列。管理员有一天发现了存储的多组raid阵…...