【2】GD32H7xx 串口Idle + DMA接收不定长数据

目录

  • 1. IDLE中断相关介绍
  • 2. D-Cache与DMA同时使用
    • 2.1 I-Cache与D-Cache
    • 2.2 D-Cache与DMA同时使用时的数据一致性问题
      • 2.2.1 CPU读取DMA写入到SRAM的数据
      • 2.2.2 DMA读取CPU写入到SRAM的数据
  • 3. Uart Idle + DMA收发程序
  • 4. 程序测试

1. IDLE中断相关介绍

在 GD32H7xx MCU 中,串口的 Idle 中断检测机制如下:
  首先,当有数据开始被接收时,串口的接收数据寄存器非空(RXNE 位被置位),此时开始启动对空闲状态的检测。从检测到有数据接收这一刻起,串口会持续监测数据总线。如果在接下来一个字节对应的传输周期内,总线上都没有新的数据被接收,串口的硬件逻辑就会将空闲中断标志位(IDLE 位)置 1,从而触发空闲中断。
  需要注意的是,空闲中断标志位(IDLE 位)并非在空闲期间一直保持置 1 的状态。另外,空闲中断标志位(IDLE 位)不会被硬件自动清零。在系统响应中断后,需要在中断服务程序中通过软件手动将其清零,以便为下一次的空闲检测做好准备。
这样的机制能够准确且高效地检测到串口数据接收的空闲状态,尤其适用于处理不定长的数据接收,为系统提供了及时处理接收数据的时机。

  串口Idle + DMA 收发数据的优势:

  • 高效性:DMA 可以在后台自动完成数据从串口缓冲区到内存的传输,无需 CPU 频繁参与,释放 CPU 资源用于其他重要任务。
  • 实时性:通过 Idle 中断能及时检测到一帧数据接收完毕,迅速进行处理,减少数据处理的延迟。
  • 降低 CPU 负载:CPU 不必一直监控串口状态和进行数据搬移,专注于核心业务逻辑。
  • 处理不定长数据:由于能在 Idle 中断时确定一帧数据结束,所以适合接收长度不固定的数据,提高了系统对不同数据格式的适应性。
  • 稳定性:减少了由于 CPU 繁忙导致的数据丢失或处理不及时的风险。

2. D-Cache与DMA同时使用

2.1 I-Cache与D-Cache

  GD32H7 MCU 中的 I-Cache(Instruction Cache,指令缓存)和 D-Cache(Data Cache,数据缓存)具有以下特点和作用:

  • I-Cache(指令缓存):
    • 加速指令获取:存储最近使用的指令,减少从较慢的主存储器(如闪存)中获取指令的次数,从而提高 CPU 取指的速度,提升程序执行效率。
    • 提高系统性能:有助于减少指令访问的延迟,使 CPU 能够更快地获取下一条要执行的指令,尤其在处理复杂和大型程序时效果显著。
  • D-Cache(数据缓存):
    • 数据暂存:用于缓存经常访问的数据,避免频繁从主存读取数据,加快数据访问速度。
    • 优化数据读写:提高数据读写的局部性,减少对主存的访问,降低数据访问的功耗和延迟。

  当CPU读取指令或数据时,CPU首先将访问地址发送到I-Cache或D-Cache进行比对,如果比对匹配,则说明数据在I-Cache或D-Cache中,然后CPU直接从I-Cache或D-Cache中取出数据并继续执行指令或访问数据。如果比对不匹配,则说明数据不在I-Cache或D-Cache中,此时CPU就会从主存储器中读取数据。GD32H7xx的I-Cache和D-Cache大小都是32KB。
  这两种缓存的存在有助于提高 GD32H7 MCU 的整体性能,使其能够更高效地处理各种任务,特别是在对实时性和性能要求较高的应用场景中具有重要意义。然而,在某些特殊应用中,可能需要对缓存进行精细的管理和控制,以确保数据的一致性和准确性。

2.2 D-Cache与DMA同时使用时的数据一致性问题

  GD32H7xx 在Cache未命中时将为数据分配高速缓存行,将32字节数据从主存储器存放至Cache,后续访问这些主存储器地址时,Cache会被命中,直接从Cache中读取数据。当SRAM上启用了Cache时,CPU和DMA同时访问SRAM会存在一致性问题。

2.2.1 CPU读取DMA写入到SRAM的数据

  当DMA从外设读取数据并更新到SRAM中的接收缓冲区recv_buf[ ]时,此时CPU尝试读取recv_buf[ ],读取到的是Cache中缓存的数据,而不是SRAM中的新数据。
解决方式:
1.在DMA接收数据完成之后,对Cache中的recv_buf[ ]进行无效操作。执行Cache无效操作后使得Cache中的recv_buf[ ]无效,CPU在尝试读取recv_buf[ ]时,Cache不会命中。

// destination : DMA接收buffer
// RECV_BUF_SIZE: DMA接收buffer size
SCB_InvalidateDCache_by_Addr ((uint32_t *)recv_buf, RECV_BUF_SIZE); 

2.为保证Cache line 边界对齐,recv_buf[ ]的大小必须是32字节对齐

__attribute__ ((aligned(32))) uint8_t recv_buf[RECV_BUF_SIZE];

2.2.2 DMA读取CPU写入到SRAM的数据

  当CPU在更新传输缓冲区send_buf[ ]中要待传输数据时,将仅更新Cache中数据而不会更新SRAM中的数据,当DMA读取send_buf[ ]中数据时,会从SRAM中读取,而不是CPU更新的Cache中的新数据。
解决方式:
1.在启动DMA传输之前,执行Cache清理操作,将Cache中send_buf[ ]刷新到SRAM中。

SCB_CleanDCache_by_Addr((uint32_t*)send_buf, SEND_BUF_SIZE); // cache 清理

2.send_buf[ ]的大小必须是32字节对齐

__attribute__ ((aligned(32))) uint8_t send_buf[SEND_BUF_SIZE];

3. Uart Idle + DMA收发程序

#define UART7_RDATA_ADDRESS      (&USART_RDATA(UART7))
#define UART7_TDATA_ADDRESS      (&USART_TDATA(UART7))
#define ARRAYNUM(arr_nanme)       (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme)))#define UART7_DMA_TX_BUF_LEN	64
#define UART7_DMA_RX_BUF_LEN	128__attribute__ ((aligned(32))) uint8_t txbuffer[UART7_DMA_TX_BUF_LEN];
__attribute__ ((aligned(32))) uint8_t rxbuffer[UART7_DMA_RX_BUF_LEN];osSemaphoreId_t uart7_rx_sem;	
osSemaphoreId_t uart7_tx_sem;	
uint8_t g_uart7_rx_len;// 信号量属性
const osSemaphoreAttr_t uart7_rx_sem_attr = 
{.name = "uart7_rx_sem",
};// 信号量属性
const osSemaphoreAttr_t uart7_tx_sem_attr = 
{.name = "uart7_tx_sem",
};/*\brief      enable uart7 rx\param[in]  none\retval		none
*/
static void uart7_rx_en(void)
{dma_single_data_parameter_struct dma_init_struct;dma_deinit(DMA0, DMA_CH1);dma_single_data_para_struct_init(&dma_init_struct);dma_init_struct.request 	 = DMA_REQUEST_UART7_RX;dma_init_struct.direction	 = DMA_PERIPH_TO_MEMORY;dma_init_struct.memory0_addr  = (uint32_t)rxbuffer;dma_init_struct.memory_inc	 = DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;dma_init_struct.number		 = UART7_DMA_RX_BUF_LEN;dma_init_struct.periph_addr  = (uint32_t)UART7_RDATA_ADDRESS;dma_init_struct.periph_inc	 = DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.priority	 = DMA_PRIORITY_ULTRA_HIGH;dma_single_data_mode_init(DMA0, DMA_CH1, &dma_init_struct);dma_circulation_disable(DMA0, DMA_CH1);usart_dma_receive_config(UART7, USART_RECEIVE_DMA_ENABLE);dma_interrupt_enable(DMA0, DMA_CH1, DMA_INT_FTF);dma_channel_enable(DMA0, DMA_CH1);}/*\brief      disable uart7 rx\param[in]  none\retval		none
*/
static void uart7_rx_dis(void)
{dma_channel_disable(DMA0,DMA_CH1);
}/*\brief      DMA0 Channel0 IRQ Handle\param[in]  none\retval		none
*/
void DMA0_Channel0_IRQHandler(void)
{if (RESET != dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_FTF)) {dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_FTF);dma_channel_disable(DMA0,DMA_CH0);	//LogI("DMA0_Channel0_IRQHandler tx finish\r\n");}
}/*\brief      DMA0 Channel1 IRQ Handle\param[in]  none\retval		none本例子中没有用到这个中断
*/
void DMA0_Channel1_IRQHandler(void)
{//LogI("DMA0_Channel1_IRQHandler\r\n");if (RESET != dma_interrupt_flag_get(DMA0, DMA_CH1, DMA_INT_FLAG_FTF)) {dma_interrupt_flag_clear(DMA0, DMA_CH1, DMA_INT_FLAG_FTF);//memcpy(txbuffer, rxbuffer, 32);//usart_transmit_dma(txbuffer, 32);/*dma_single_data_parameter_struct dma_init_struct;dma_deinit(DMA0, DMA_CH1);dma_single_data_para_struct_init(&dma_init_struct);dma_init_struct.request      = DMA_REQUEST_UART7_RX;dma_init_struct.direction    = DMA_PERIPH_TO_MEMORY;dma_init_struct.memory0_addr  = (uint32_t)rxbuffer;dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;dma_init_struct.number       = 32;dma_init_struct.periph_addr  = (uint32_t)(&USART_RDATA(UART7));dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.priority     = DMA_PRIORITY_ULTRA_HIGH;dma_single_data_mode_init(DMA0, DMA_CH1, &dma_init_struct);dma_circulation_disable(DMA0, DMA_CH1);usart_dma_receive_config(UART7, USART_RECEIVE_DMA_ENABLE);dma_interrupt_enable(DMA0, DMA_CH1, DMA_INT_FTF);dma_channel_enable(DMA0, DMA_CH1);*/}
}/*\brief      UART7 IRQ Handle\param[in]  none\retval		none
*/
void UART7_IRQHandler()
{uart7_rx_dis();if (RESET != usart_interrupt_flag_get(UART7, USART_INT_FLAG_IDLE)) {usart_interrupt_flag_clear(UART7, USART_INT_FLAG_IDLE);LogI("USART_INT_FLAG_IDLE\r\n");uint16_t remian_len, len;remian_len = dma_transfer_number_get(DMA0,DMA_CH1);len = UART7_DMA_RX_BUF_LEN - remian_len;  //本次收到的数据长度LogI("recv len = %d ; remian_len = %d\r\n", len, remian_len);SCB_InvalidateDCache_by_Addr ((uint32_t *)rxbuffer, UART7_DMA_RX_BUF_LEN); // 对cache中rxbuffer无效if(len > 0){g_uart7_rx_len = len;osSemaphoreRelease(uart7_rx_sem);}}uart7_rx_en();
}void uart7_init(void)
{rcu_periph_clock_enable(RCU_GPIOE);rcu_periph_clock_enable(RCU_UART7);nvic_irq_enable(UART7_IRQn, 2, 0);gpio_af_set(GPIOE, GPIO_AF_8, GPIO_PIN_0);gpio_af_set(GPIOE, GPIO_AF_8, GPIO_PIN_1);gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_0);gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_0);gpio_mode_set(GPIOE, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_1);gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_100_220MHZ, GPIO_PIN_1);usart_deinit(UART7);usart_word_length_set(UART7, USART_WL_8BIT);usart_stop_bit_set(UART7, USART_STB_1BIT);usart_parity_config(UART7, USART_PM_NONE);usart_baudrate_set(UART7, 115200U);usart_flag_clear(UART7, USART_FLAG_IDLE);usart_transmit_config(UART7, USART_TRANSMIT_ENABLE);usart_receive_config(UART7, USART_RECEIVE_ENABLE);usart_interrupt_enable(UART7, USART_INT_IDLE);usart_enable(UART7);
}/*\brief      uart7_dma_send\param[in]  buf: send data\param[in]	len: data len\retval		none
*/
void uart7_dma_send(char* buff, int size)
{memcpy(txbuffer, buff, size);SCB_CleanDCache_by_Addr((uint32_t*)txbuffer, size); // cache 清理dma_memory_address_config(DMA0, DMA_CH0, DMA_MEMORY_0, (uint32_t)txbuffer);dma_transfer_number_config(DMA0, DMA_CH0, size);LogI("uart7_dma tx len:%d\r\n", size);dma_channel_enable(DMA0, DMA_CH0);
}void usart_transmit(char* buff, int size)
{for (int i = 0; i < size; ++i) {usart_data_transmit(UART7, buff[i]);while (RESET == usart_flag_get(UART7, USART_FLAG_TBE)) {}}
}/*\brief      uart7 dma config\param[in]  none\param[in]	none\retval		none
*/
void uart7_dma_config(void)
{rcu_periph_clock_enable(RCU_DMA0);rcu_periph_clock_enable(RCU_DMAMUX);nvic_irq_enable(DMA0_Channel0_IRQn, 2, 0);//nvic_irq_enable(DMA0_Channel1_IRQn, 2, 1);dma_single_data_parameter_struct dma_init_struct;SCB_CleanDCache_by_Addr((uint32_t*)txbuffer, UART7_DMA_TX_BUF_LEN);//TXdma_deinit(DMA0, DMA_CH0);dma_single_data_para_struct_init(&dma_init_struct);dma_init_struct.request      = DMA_REQUEST_UART7_TX;dma_init_struct.direction    = DMA_MEMORY_TO_PERIPH;dma_init_struct.memory0_addr  = (uint32_t)txbuffer;dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;dma_init_struct.periph_addr  = (uint32_t)UART7_TDATA_ADDRESS;dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.priority     = DMA_PRIORITY_MEDIUM;dma_single_data_mode_init(DMA0, DMA_CH0, &dma_init_struct);dma_circulation_disable(DMA0, DMA_CH0);usart_dma_transmit_config(UART7, USART_TRANSMIT_DMA_ENABLE);dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_FTF);//dma_channel_enable(DMA0, DMA_CH0);//RXdma_deinit(DMA0, DMA_CH1);dma_single_data_para_struct_init(&dma_init_struct);dma_init_struct.request      = DMA_REQUEST_UART7_RX;dma_init_struct.direction    = DMA_PERIPH_TO_MEMORY;dma_init_struct.memory0_addr  = (uint32_t)rxbuffer;dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_8BIT;dma_init_struct.number       = UART7_DMA_RX_BUF_LEN;dma_init_struct.periph_addr  = (uint32_t)UART7_RDATA_ADDRESS;dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;dma_init_struct.priority     = DMA_PRIORITY_ULTRA_HIGH;dma_single_data_mode_init(DMA0, DMA_CH1, &dma_init_struct);dma_circulation_disable(DMA0, DMA_CH1);usart_dma_receive_config(UART7, USART_RECEIVE_DMA_ENABLE);//dma_interrupt_enable(DMA0, DMA_CH1, DMA_INT_FTF);dma_channel_enable(DMA0, DMA_CH1);
}/*\brief      uart7_idle_dma_test_thread\param[in]  none\param[in]	none\retval		none
*/
void uart7_idle_dma_test_thread(void)
{LogI("uart7_idle_dma_test_thread run...\r\n");uint32_t ret;static uint16_t pollcnt = 0;uart7_rx_sem = osSemaphoreNew(2, 0, &uart7_rx_sem_attr);	uart7_init();uart7_dma_config();while(1){ret = osSemaphoreAcquire(uart7_rx_sem, 100);   //等待接收数据if(ret == osErrorTimeout)                          //超时{//LogI("Acquire uart7_rx_sem timeout\r\n");}else{LogI("uart7 recv data:");uint8_t i;for(i=0; i < g_uart7_rx_len; i++){printf("[%d]=%d,", i, rxbuffer[i]);}printf("\r\n");uart7_dma_send((char *)rxbuffer, g_uart7_rx_len);}}}

4. 程序测试

程序功能:通过IDLE中断和串口的DMA收发功能实现将收到的数据再发出去。
经过测试程序功能正常。
在这里插入图片描述


To Be Continue …

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/10317.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

python数据结构基础(8)

今天来使用python实现二叉树,二叉树中每个节点都是Node类对象,通过Tree类中的add()方法逐个向二叉树中加入树节点,构成完全二叉树或者非完全二叉树,代码如下: class Node(object):"""树节点类&#xff0c;用于构建二叉树。Attributes:- val: 节点存储的值。- r…

IEEE 1588:电信网络的精确时间协议 (PTP)

IEEE 1588&#xff1a;电信网络的精确时间协议 IEEE 1588 PTP 概述PTP 协议特征同步类型IEEE 1588 PTP 角色IEEE 1588 PTP 的工作原理PTP 设备类型PTP 消息类型事件消息一般信息 PTP 时钟类规范PTP 配置文件 https://www.techplayon.com/ieee-1588-precision-time-protocol-ptp…

深度学习基础—了解词嵌入

引言 上图是使用one-hot向量表示词向量的一种方式&#xff0c;这种表示方式优点是方面简洁&#xff0c;但是缺点也很明显&#xff0c;就是词与词之间独立性太强&#xff0c;没有关联&#xff0c;这样使得算法对相关词的泛化能力不强。 举个例子&#xff0c;假如我们已经学习到了…

实战:索引的命中机制

在 SQL Server 中,查询是否能命中索引(即是否能使用 Index Seek)取决于多个因素,包括索引的结构、查询条件的排列、和数据库优化器的策略。以下是一些常见的命中索引和不能命中索引的情况,及其详细解释: 一、命中索引的情况 1. 前导列匹配(典型的命中索引场景) 索引结…

Mac 安装protobuf2.5.0

文章目录 一、修改platform_macros.h二、编译protobuf三、配置环境变量四、测试 一、修改platform_macros.h platform_macros.h的目录位置为/Users/xxxx/protobuf-2.5.0/src/google/protobuf/stubs 在platform_macros.h中增加如下代码 #elif defined(__arm64__) #define GOOG…

ubuntu24.04安装matlab失败

又是摸鱼摆烂的一天&#xff0c;好难过&#xff5e; 官方教程&#xff1a;https://ww2.mathworks.cn/help/install/ug/install-products-with-internet-connection.html 问题描述&#xff1a;https://ww2.mathworks.cn/matlabcentral/answers/2158925-cannot-install-matlab-r2…

python使用turtle画图快速入门,轻松完成作业练习

turtle介绍 turtle是一个绘图库&#xff0c;可以通过编程进行绘图。其模拟了一个乌龟在屏幕上的运动过程。该库通常用于给青少年学习编程&#xff0c;当然&#xff0c;也可以使用其进行作图。 在一些学校中&#xff0c;可能在python学习的课程中&#xff0c;要求完成turtle绘…

智能 AI 视觉识别系统打造高效流量统计方案

智能AI视觉算法解决方案&#xff0c;涵盖客流人数统计、车流量统计、牲畜养殖场计数、物品点包计数、超员报警、火焰识别报警及驾驶行为报警等功能。可精准统计商场、车站等地客流&#xff0c;区分车型统计车流量并预警拥堵&#xff0c;准确计数牲畜及物品&#xff0c;检测工厂…

UVa514 解析:火车车厢重排序问题的模拟栈实现

来源:UVa514 铁轨 Rails。 这是一个火车车厢重排序的问题,通过模拟栈操作的算法实现。这种算法非常适用于具有栈结构特性的问题,比如括号匹配、货物堆放、编译器中语法检查。本文给出了C++的两种代码实现和Python的一种实现。 题目描述 某城市有一个火车站,铁轨铺设如图。…

ENSP OSPF和BGP引入

路由协议分为&#xff1a;内部网关协议和外部网关协议。内部网关协议用于自治系统内部的路由&#xff0c;包括&#xff1a;RIP和OSPF。外部网关协议用于自治系统之间的路由&#xff0c;包括BGP。内部网关协议和外部网关协议配合来共同完成网络的路由。 BGP:边界网关路由协议(b…

华为OD机试真题-矩形绘制

题目描述 实现一个简单的绘图模块&#xff0c;绘图模块仅支持矩形的绘制和擦除 当新绘制的矩形与之前的图形重善时&#xff0c;对图形取并集 当新擦除的矩形与之前的图形重善时&#xff0c;对图形取差集 给定一系列矩形的绘制和擦除操作&#xff0c;计算最终图形的面积。下…

Android下的系统调用 (syscall),内联汇编syscall

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 什么是系统调用 (syscall) 系统调用是操作系统提供给应用程序的一组接口&#xff0c;允许用户空间程序与内核进行交互。 在 Android&#xff08;基于 Linux …

初始JavaEE篇 —— 网络编程(2):了解套接字,从0到1实现回显服务器

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;JavaEE 目录 TCP 与 UDP Socket套接字 UDP TCP 网络基础知识 在一篇文章中&#xff0c;我们了解了基础的网络知识&#xff0c;网络的出…

【月之暗面kimi-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

架构师备考-概念背诵(软件工程)

软件工程 软件开发生命周期: 软件定义时期:包括可行性研究和详细需求分析过程,任务是确定软件开发工程必须完成的总目标,具体可分成问题定义、可行性研究、需求分析等。软件开发时期:就是软件的设计与实现,可分成概要设计、详细设计、编码、测试等。软件运行和维护:就是…

[FBCTF 2019]rceservice 详细题解

知识点: json字符串 PHP正则表达式元字符 PCRE回溯机制绕过正则表达式 %0a 换行符绕过正则表达式(详细讲解) 提示 Enter command as JSON 题目还有一个附件,打开是index.php文件源码 <?php putenv(PATH/home/rceservice/jail); if (isset($_REQUEST[cmd])) {$json $_…

【竞技宝】DOTA2-梦幻联赛S24:圣剑美杜莎强拆基地终结比赛

北京时间11月9日,DOTA2的梦幻联赛S24继续进行。本日迎来第二阶段的B组二、三名加赛PARI对阵spirit。本场比赛双方前两局战至1-1平,决胜局同样是难分胜负打到了六十分钟之后,关键时刻spirit主动出击,圣剑美杜莎强拆基地成功一波结束比赛,最终spirit让一追二击败PARI。以下是本场…

计算机的错误计算(一百四十九)

摘要 探讨 MATLAB 中 的计算精度问题。当 为含有小数的大数或整数附近数时&#xff0c;输出会有错误数字。 例1. 已知 计算 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 0.6374239897486897e0、-0.6613118653236519e0、0.3769911184298822e-5 与…

力扣 多数元素

用了排序跟抵消。 题目 由题可知&#xff0c;多数元素是指在数组中出现次数大于一半的元素&#xff0c;且总是存在多数元素。不难想到&#xff0c;把数组排序后&#xff0c;这个数组的中间数一定是这个要找的元素。 用了sort排序&#xff0c;时间复杂度O&#xff08;nlogn&am…

Oracle OCP认证考试考点详解082系列11

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 51. 第51题&#xff1a; 题目 51.View the Exhibit and examine the description of the tables You execute this SQL statement Whi…