自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

转载 webrtc学习文章

webrtc分析好文汇总

2022-07-13 10:50:40 269

转载 WebRtc建立P2P链接的总体流程

前言最近项目需要了解下webrtc,网上webrtc的资料层出不穷,大多都是过时的描述。个人在这方面也走了不少弯路,为了方便自己后续的工作,将自己阅读代码的所得进行了总结。鉴于个人水平有限,错误在所难免,敬请指正不甚感激! WebRtc简介 webrtc是Web Real-Time Communication的缩写,google收购Global IP Solutions公司而获得的一项技术,用来实现浏览器与浏览器或者浏览器与本地应用的视频通话标准,也可以用来实现文件共享等功能!后来谷歌推广成了一套W3

2022-04-27 16:20:52 1104

转载 同步I/O,异步I/O的理解

文章目录什么是I/O?一、阻塞I/O二、非阻塞I/O三.多路复用I/O四.异步I/O五.阻塞I/O与非阻塞I/O的区别六.同步与异步I/O的区别七.异步IO与非阻塞IO的区别总结什么是I/O?I/O:在计算机中指Input/Output,就是输入和输出。由于程序和运行时数据是在内存中驻留,由cpu来执行,涉及到数据交换的地方,通常是磁盘、网卡等,就需要IO接口。一、阻塞I/O当用户线程发起IO请求后,会进行系统调用(system call)来让内核(Kernel)进行IO操作(系统调用是用户空.

2020-12-22 17:05:11 1756

转载 C++为什么要引入typename

文章目录前言typename的常见用法typename的来源一些关键概念限定名和非限定名依赖名和非依赖名类作用域引入typename的真实原因一个例子问题浮现千呼万唤始出来不同编译器对错误情况的处理使用`typename`的规则其它例子再看常见用法前言最近在看STL源码,然后看到迭代器中有如下代码:tempalte<typename I>struct iterator_traits{ typedef typename I::iterator_category iterato

2020-11-29 15:47:57 436

原创 二叉树前序、中序、后续遍历递归和非递归C++实现(带详细注释)

实现代码如下,带有详细注释:#include <iostream>#include <stack>// 定义的树结构体struct TreeNode{ int val; TreeNode* leftTree; TreeNode* rightTree;};/* 二叉树的先序遍历,递归方法 */void preOrder(TreeNode* root){ if(root != nullptr) { cout &lt

2020-11-16 11:44:36 244

转载 bitCount函数详解

最近刷题的时候看到了这样一个奇怪的函数,一开始非常不理解,后来查阅了资料,现将它记录下来。int bitCount(int i) { // HD, Figure 5-2 i = i - ((i >>> 1) & 0x55555555); i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); i = (i + (i >>> 4)) &

2020-11-10 12:31:51 5310

原创 Linux命令速查汇总

1. 查看Linux系统信息arch #显示机器的处理器架构(1)uname -m #显示机器的处理器架构(2)uname -r #显示正在使用的内核版本dmidecode -q #显示硬件系统部件 - (SMBIOS / DMI)hdparm -i /dev/hda #罗列一个磁盘的架构特性hdparm -tT /dev/sda #在磁盘上执行测试性读取操作cat /proc/cpuinfo #显示CPU info的信息cat /proc/

2020-10-13 09:57:24 222 1

转载 epoll使用详解(精髓)

epoll - I/O event notification facility在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE 1024

2020-09-28 10:08:05 1056

原创 进程间通信——共享内存

什么是共享内存共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式,允许两个不相关的进程访问同一逻辑内存。共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到它们自己的地址空间中。所有的进程都以访问共享内存中的地址,就像它们是由malloc分配的一样。如果某个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。一般使用共享内存来提供对大块内存区域的有效访问,同时通过传递小消息来同步对该内存的访问

2020-09-25 15:13:59 290

原创 Linux进程通信——信号量semget()、semop()、semctl()

前言如果有多个程序试图在同一时间更新这个数据库,数据就可能会遭到破坏。两个不同的程序要求不同的用户向数据库输入数据,问题会出现在对数据库进行更新的代码上。临界区域:真正执行数据更新的代码需要独占式的执行。为了防止出现因多个程序同时访问一个共享资源而引发的问题,则需要使用一种方法,可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。之前说过可以使用互斥量和信号量来控制对临界区域的访问。在此会对信号量做更加普遍意义的介绍。定义信号量:是一个特殊变量,只允许对它进行等待(wa

2020-09-24 20:11:02 1201

原创 Linux下实现简易客户/服务器(C/S)应用程序——基于有名管道FIFO

有名管道简介

2020-09-18 10:50:59 515

转载 stm32端口复用和重映射简介

端口复用和重映射都是和单片机的I/O口有关系,端口复用是将一个I/O赋予多个功能,通过设置I/O的工作模式来切换不同的功能。重映射是将某些I/O口上面的功能映射到其他I/O口上面去。但是注意一点:重映射的I/O都是厂家设置好的,不能自己更改。端口复用外设在说端口复用之前先明白一个概念:什么是外设?什么是内置外设? 外部设备简称“外设”,是指连在计算机主机以外的硬件设备。对数据和信息起着传输、转送和存储的作用,是计算机系统中的重要组成部分。

2020-09-16 15:29:08 3131 1

原创 Linux下MySQL数据库简介及使用(基于C语言)

1. MySQL基本简介1.1 数据库数据库:database(DB),是一种存储数据的仓库。数据库是根据数据结构组织、存储和管理数据数据库能够长期、高效的管理和存储数据数据库的目的就是能够存储(写)和提供(读)数据1.2 关系型数据库关系型数据库是一种建立在关系模型上的数据库。常见的关系模型有:关系数据结构(存储)、关系操作集合(操作)和关系完整性约束(约束);关系型数据库存储在磁盘中(永久性存储);关系型数据库模型有四层结构:数据库管理系统、数据库、数据表、数据字段(依赖于数据

2020-09-13 16:18:44 507

原创 linux文件操作——基于unix标准库函数(open、read、write函数等)

1. 前言在linux系统中,“一切皆文件”这一观点非常重要,也就是说无论执行什么类型的操作,都可以用 “打开 open->读写 read/write->关闭 close”模式来操作。大多数情况下,我们只需要使用五个基本的库函数——open、close、read、write和ioctl。2. Linux文件结构2.1目录目录除了本身包含的内容外,还会有一个名字和一些属性,即“管理信息”,例如:利用ls -l在当前目录下执行,可以得到如下图所示[外链图片转存失败,源站可能有防盗链机制,

2020-09-05 21:28:58 1023

原创 Linux重定向详解(输入输出重定向)

前言首先需要明确的一点,Linux 中标准的输入设备默认指的是键盘\color{red}{键盘}键盘,标准的输出设备默认指的是显示器\color{red}{显示器}显示器。所以所说的输入、输出重定向,从字面理解,即:输入重定向:指的是重新指定设备来代替键盘\color{blue}{代替键盘}代替键盘作为新的输入设备;输出重定向:指的是重新指定设备来代替显示器\color{blue}{代替显示器}代替显示器作为新的输出设备。通常是用文件或命令的执行结果来代替键盘作为新的输入设备,而新的输出设备通

2020-08-30 11:20:39 1118

转载 led裸机程序Makefile制作,arm-linux-(gcc/ld/objcopy/objdump)详解

在linux中输入vi Makefile 来实现创建Makefile文件**命令行前必须加TAB键对于led裸机程序,主要是将两个文件led.c和start.S汇编文件,制作一个Makefile文件makefile文件如下(引自迅为iTOP给的例程):// 下面会详解led.bin: start.o led.o arm-none-linux-gnueabi-ld -Ttext 0x0 -o led.elf $^ arm-none-linux-gnueabi-objcopy -O binary

2020-08-26 21:49:55 417

原创 RT-Thread系统启动过程,非常详细,通俗易懂!!!

接触RT-Thread有一段时间了,之前一段时间学习了RT-Thread内核方面的知识,但总归有点走马观花的意思,没仔细琢磨,就略过了。今天开始打算将RT-Thread系统重新温习一遍,对操作系统有更深刻的理解。话不多说,接下来将讲述RT-Thread的系统启动流程。(RT-Thread官方已经给了比较详细的教程,所以在此主要添加一些自己的理解)在开始之前,需要准备必须的工具,准备工具:keil、RT-Thread 官方提供的软件仿真例程启动流程概述在讲解之前,先上rt-thread系统启动的主体步

2020-08-19 21:44:42 6391 1

原创 secureCRT安装、连接系统终端以及设置长时间连接不断开 详解!!!

安装在此分享secureCRT安装包(里面包含两个软件,secureCRT和secureFX,可以选择都安装)点击此处提取码:yav3安装步骤可以参考这篇博客,讲的很详细,在此就不赘述了。软件破解需要提醒的一点,对于软件破解,找到解压文件中的crack文件夹,如下图所示:点开crack文件夹,如下图所示:将keygen文件复制到secureCRT安装目录中打开kegen应用程序点击左下角的patch按钮,选择SecureCRT,点击打开然后会继续弹出对话框,选择Licens

2020-08-16 14:50:57 1883

转载 C语言保留字(关键字)汇总——转载

由于是温习笔记,写的内容比较杂,比较基础。主要是写给自己看的,方便以后查阅。今天来讲讲c中的保留字。保留字(reserved word)  保留字又称关键字。  指在高级语言中已经定义过的字,使用者不能再将这些字作为变量名或过程名使用。  每种程序设计语言都规定了自己的一套保留字。  例如:BASIC语言规定不能使用LIST作为变量名或...

2020-08-13 11:37:02 5201

原创 LWIP协议栈之TCP建立与断开(三次握手、四次挥手)

简介TCP叫传输控制协议,它为上层提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先简历一个TCP连接。在一个TCP连接中,仅有两方进行彼此通信,广播和多播不能用于TCP。TCP的服务TCP通过下列方式来提供可靠性:应用数据被分割成TCP认为最适合发送的数据块;当TCP发出一个段后,它起动一个定时器,等待目的端确认收到这个报文段。如果不能,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。

2020-08-11 16:58:00 1969 2

原创 LwIP协议栈之ICMP(Internet Message Protocal)协议

在之前主要讲到LWIP了IP层的相关概念(详见本人另外一篇文章:LwIP协议栈之IP协议),其中主要讲解了网络接口(链路层)与IP层(网络层)的数据交互,而数据包是如何从IP层向上级(传输层)传输的并没有介绍,本次就会详细讲解这个过程。这一过程的关键就是今天要介绍的ICMP(网络控制报文协议)协议。1 什么是ICMP协议ICMP( Internet Control Message Protocol)是 Internet控制报文协议,用于在 IP 主机、路由器之间传递控制消息。控制消息是指网络通不通、

2020-08-10 11:28:51 483

原创 F28335中断系统详解及其应用

最近导师的项目中要应用到DSP F28335,由于之前一直对f28335的中断不是很理解,所以花了一点时间仔细看了一下《手把手教你学DSP:基于TMS28335》这本书讲解中断的环节,感觉有一定的收获,在此记录下来。1 什么是中断CPU进行正常程序处理时,有时会被要求接收更高级别的指令或实时性要求更高的任务,不得不中断当前的程序处理,而去响应后者,即进入中断服务程序,这就是中断。当处理完这些任务之后,要继续刚才的处理,因此在执行中断服务程序的时候,必须保存执行现场以确保在完成更高级别任务或指令时能够再

2020-08-06 15:36:41 6887

原创 LwIP协议栈之IP协议

IP数据报头结构IP层主要为信息包的接收、分片数据包重装、信息包的发送和转发三个内容。IP数据报头结构如下所示,通常的IP数据报头长度为20个字节。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RW7SzZ6w-1596445349890)(images/14.jpg)]第一个字段是4bit的版本号,对于IPv4,该值为4;对于IPv6,该值为6;第二个4bit字段用于记录首部长度,以字为单位。对于不含任何选项字段的IP报头,则该长度值为5,其能描述的最大IP报头

2020-08-03 17:03:20 474

原创 LwIP协议栈之ARP(Address Resolution Protocal)协议详解

前言ARP,全称Address Resolution Protocol,译作地址解析协议,是位于 TCP/IP 协议栈底层的协议。任何网络的通信都是基于底层硬件链路的,底层的数据链路有着自己的一套寻址机制,在以太网中,往往是通过一个48位的MAC地址来标示不同的网络通信设备的。TCP/IP协议的上层是使用IP地址作为各个主机间通信寻址机制的。ARP作用:当源主机上层要向目标主机发送数据时,它只知道目标主机的IP地址,此时源主机需要将该IP地址转换为目的主机对应的MAC地址,这样才能在数据链路上选择正

2020-08-01 17:08:01 1405

转载 ARP欺骗攻击

为了方便自己日常学习,本文转载自https://blog.csdn.net/TC125/article/details/83021923,侵权立删! 一、ARP攻击概述ARP攻击主要是存在于局域网中,通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响应包就能

2020-08-01 10:43:45 774

原创 LwIP协议栈之网络接口结构(netif)

前言LWIP也是以分层的协议为参照来设计实现TCP/IP。LWIP从逻辑上看分为四层:链路层、网络层、传输层和应用层。虽然 LWIP 也采用了分层机制,但它没有在各层之间进行严格的划分,各层协议之间可以进行或多或少的交叉存取,即上层可以意识到下层协议所使用的缓存处理机制。各层可以更有效的重用缓冲区。应用进程和协议栈可以使用相同的内存,应用可以直接读写内部缓存,节省了执行拷贝的开销。链路层在LWIP 中,是通过一个叫做 netif 的网络结构体来描述一个硬件网络接口的。源代码结构如下:struct

2020-07-30 19:13:10 1948 1

原创 stm32f103为什么不能延迟2秒

今天室友在使用stm32的时候发现一个很有趣的现象,使用库函数中的delay_ms()函数,设置成延时1s是可以的,但是设置成2s的时候发现延迟根本不是2s。后来我仔细看了一下延时函数,找到了原因。首先我们知道系统时钟频率为72MHz,如下图所示:然后在delay.c中找到delay_init()函数,可以看到外部始终频率分频为系统时钟的1/8,即72/8 = 9MHz,如下图所示:然后找到delay_ms()函数,可以看到时钟加载值最大为2^24个tick,然后逐步减到0时重新计数。如下图所示

2020-07-30 16:30:28 1387 1

原创 LwIP协议栈之数据包pbuf

前言在动态内存管理那篇文章中讲到了内存分配策略:内存堆分配和内存池分配。两者互有优缺点,如何合理利用两种分配策略,就需要介绍LWIP的数据包缓冲的实现。数据包pbuf源码详解从网卡上来的原始数据包:有长达上千字节的TCP数据包,也有仅几个字节的ICMP数据包;从要发送的数据包:上层应用可能将各种数据包递交给LWIP协议栈发送,这些数据包有可能存在于应用程序管理的内存空间内,也可能存在于某个ROM上。这么复杂的工作致使LWIP必须有个高效的数据包管理核心,数据包管理机构出现了。数据包管理机构采用数

2020-07-29 19:18:55 1491

原创 LwIP协议栈学习之动态内存管理

前言LWIP 的动态内存管理机制可以有三种: C 运行时库自带的内存分配策略、动态内存堆(HEAP)分配策略和动态内存池(POOL)分配策略。由于前两种分配策略具有很大的相似性,使用时只能从中选择一种,通过头文件lwippools.h 中的宏定义 MEM_LIBC_MALLOC 来实现的,当它被定义为 1 时则使用标准 C运行时库自带的内存分配策略,而为 0 时则使用 LWIP 自身的动态内存堆分配策略。一般情况下,选择使用LWIP自身的动态内存堆分配策略。动态内存堆分配策略动态内存堆分配策略

2020-07-29 10:53:23 451

转载 嵌入式Linux学习基本框架

前言这篇文章简单我们来一起梳理嵌入式Linux的一些知识,方便于一些想跟我一样想要由单片机进阶到嵌入式Linux的朋友做一些参考学习。嵌入式Linux学哪些东西1、认识Linux学单片机的朋友有些有一些Linux基础了,但也不乏有些朋友没用过Linux,甚至有些初学的读者朋友没听说过Linux,为了照顾这些朋友,这里简单地认识一下Linux:2、认识嵌入式Linux学习嵌入式Linux我们需要关注以下几大块内容:嵌入式Linux软件部分最重要的三部分当属Bootloader、Linux内

2020-07-28 10:36:35 663

原创 RT-Thread学习之AT组件

AT命令简介AT命令最早是由发明拨号调制解调器(MODEM)的贺氏公司(Hayes)为了控制MODEM而发明的控制协议。而由于MODEM速度很低,慢慢退出一般使用市场,但是AT命令保留下来。AT 命令在此基础上演化并加入 GSM 07.05 标准以及后来的 GSM 07.07 标准,实现比较健全的标准化。在随后的GPRS控制、3G模块等方面,均采用的AT命令来控制,AT命令逐渐在产品开发中称为实际的标准。如今AT命令也广泛地应用于嵌入式开发领域,AT命令作为主芯片和通讯模块的协议接口,硬件接口一般为串

2020-07-21 17:32:53 1725

原创 RT-Thread学习之虚拟文件系统(DFS)

文件系统简介早期的嵌入式系统由于需要存储的数据比较少,所以一般是直接在存储设备中指定地址写入数据的方法来存储数据。随着嵌入式设备功能的发展,存储的数据越来越多,此时就需要一种新的数据管理方式——文件系统。文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型 (Abstract data type),是一种用于向用户提供底层数据访问的机制。文件系统通常存储的基本单位是文件,即数据是按照一个个文件的方式进行组织。当文件比较多时,将导致文件繁多,不易分类、重名的问题。而文件夹作为一

2020-07-19 16:35:35 3782

原创 嵌入式系统简介

定义嵌入式系统是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”。嵌入式系统一般指非PC系统,它包括硬件和软件两部分。硬件包括处理器/微处理器、存储器及外设器件和I/O端口、图形控制器等;软件部分包括操作系统软件(OS)(要求实时和多任务操作)和应用程序编程。特点系统内核小专用性强系统精简高实时性的系统软件(OS)标准化,多任务交叉编译嵌入式Linux系统框架1 Bootloader它是一个引导程序,也就是硬件复位以后第一个要执行的程序,主要工作是初始化操作系统运

2020-07-18 14:41:28 390

原创 GCC编译流程和Makefile简介

编译流程GCC编译器的编译流程:预处理、编译、汇编和链接预处理:展开所有的头文件、替换程序中的宏、解析条件编译并添加到文件中;编译:将经过预编译处理的代码编译成汇编代码,也就是我们常说的程序编译;汇编:将汇编语言文件编译成二进制目标文件;链接:将汇编出来的多个二进制目标文件链接在一起,形成最终的可执行文件,链接的时候还会涉及到静态库和动态库等问题。Makefile基础make:解决大工程编译的工具,make命令可完成整个工程的自动编译makefile: 描述哪些文件需要编译、哪些需要重新

2020-07-18 10:44:35 719 1

转载 SPI通信介绍

一、SPI的简介及基本特点1 SPI的简单介绍SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。SPI总线是Motorola公司推出的三线同步接口,同步串行3线方式进行通信:一条时钟线SCK,一条数据输入线MOSI,一条数据输出线MISO; SPI 接口主要应用在 EEPROM, FLASH,实时时钟, AD 转换器,还有数字信号处理器和数字信号解码器之间。 SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯

2020-07-15 17:38:56 1482

转载 LwIP使用经验(转载)

这篇文章转自[LWIP使用经验](https://blog.csdn.net/jiangjunjie_2005/article/details/26051399),转载的目的是供自己更好的温习,也给大家分享好文。 一 LWIP内存管理LWIP的内存管理使用了2种方式:内存池memp和内存堆mem,如图1所示。内存池的特点是预先开辟多组...

2020-07-14 09:47:23 1344

原创 STM32学习之以太网介绍

以太网简介以太网(Ethernet)是互联网技术的一种,由于它是在组网技术中占的比例最高,很多人直接把以太网理解为互联网。以太网是指遵守IEEE802.3标准组成的局域网,由IEEE 802.3标准规定的主要是位于参考模型的物理层(PHY)和数据链路层中的介质访问控制子层(MAC)。PHY层在物理层,由IEEE 802.3标准规定了以太网使用的传输介质、传输速度、数据编码方式和冲突检测机制,物理层一般是通过一个PHY芯片实现其功能的。1 传输介质传输介质包括同轴电缆、双绞线(水晶头网线是一种双绞

2020-07-13 17:08:59 4809

原创 LwIP协议栈简介

简介LwIP最先是由瑞典计算机科学院的Adam Dunkels等开发的用于嵌入式系统的开源TCP/IP(共分为四层,详见上一个博客)协议栈,LwIP的含义是Light Weight(轻型)IP协议。LwIP最大的优势在于可以移植到操作系统上,也可以在无操作系统的情况下独立运行,且代码量小。实现的协议ARP协议:以太网地址解析协议,用来实现主机以太网物理地址到IP地址的映射;IP协议:包括IPv4和IPv6,支持IP分片与重装,支持多网络接口下数据报转发,;ICMP协议:用于网络调试与维护;I

2020-07-13 15:08:53 1114

原创 OSI模型与TCP/IP模型介绍

OSI模型OSI模型即开放式通信系统互联参考模型(Open System Interconnection Reference Model),它是国际标准化组织(ISO)提出的一个世界范围内网络通信标准的参考框架。OSI参考模型并不是一个标准,而是在网络协议具体实现时可供参考的概念性框架,也没有提供一个可以实现的方法;OSI参考模型只是描述了一些概念,定义了网络通信协议的层次结构、层次之间的相互关系以及各层可能包括的任务。OSI模型一共分为7个层次,如下图所示,从上到下依次为:应用层(第7层)、表示

2020-07-10 09:53:41 618

原创 RT-Thread内核学习之中断管理

简介当CPU正在处理内部数据时,外界发生了紧急情况,要求CPU暂停当前的工作转去处理这个异步事件。处理完毕后回到原来被中断的地址,继续原来的工作,这样的过程称为中断。实现这一功能的系统称为中断系统,申请CPU中断的请求源称为中断源。中断是一种异常,异常导致处理器脱离正常运行专项执行特殊代码的任何事件,正确处理异常,提高软件鲁棒性非常重要。下图所示为中断示意图:RT-Thread中断工作机制中断向量表中断向量表是所有中断处理程序的入口;下图所示是Cortex-M系列的中断处理过程:把一

2020-07-05 16:38:29 829

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除