自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 资源 (5)
  • 收藏
  • 关注

原创 回顾软件编程的四种命名方法

有的设计师不注重平时编码习惯,比如命名不讲规则,天马行空,一会大写、一会小写,一会中文拼音,一会下划线等,时间一长,自己写的代码自己都看不懂了。驼峰命名法近年来越来越流行,驼峰命名法,正如它的名称所表示的那样,指的是混合使用大小写字母来构成标识符的名字。事实上,很多程序设计者在实际命名时会将驼峰命名法和帕斯卡结合使用,例如变量名采用驼峰命名法,而函数采用帕斯卡命名法。

2024-04-24 17:38:10 775

原创 MIL-STD-1553B和FC-AE-1553的主要区别

1.传输速率:MIL-STD-1553B的传输速率是1 Mbps,而FC-AE-1553提供了更高的传输速率,可以达到1.0625Gb/s、2.125Gb/s或4.25Gb/s,这使得FC-AE-1553在数据传输速度上远超MIL-STD-1553B。2.地址空间:MIL-STD-1553B的地址字段为5位,限制了终端的数量和地址范围。10.系统兼容性:FC-AE-1553设计时考虑了与MIL-STD-1553B的兼容性,允许重用为MIL-STD-1553B编写的软件,这有助于减少新系统的开发和集成成本。

2024-04-24 17:36:23 287

原创 嵌入式软件的看门狗“喂狗”设计策略

设计时需要综合考虑系统的实时性、可靠性和复杂性,以实现最佳的喂狗策略。:通常不推荐在中断服务例程(ISR)中喂狗,因为中断的执行时间是不可预测的,可能会导致喂狗操作的延迟,从而增加看门狗定时器超时的风险。:在系统中的每个任务循环中,确保包含对看门狗定时器的“喂狗”操作,即重置定时器的计数,以避免其超时引发系统复位。:在系统启动和加载操作系统的过程中,也需要适当地插入喂狗操作,以防止在系统初始化阶段看门狗定时器超时。:在系统开发过程中,对喂狗机制进行充分的测试和验证,以确保其在各种条件下都能可靠地工作。

2024-04-22 09:35:36 349

原创 volatile关键字

它的主要作用是用来声明一个变量是易变的,即它的值在程序的执行过程中可能会在不被当前线程控制的情况下改变。例如,对于一个复合操作,如++counter,即使 counter 是volatile 类型的,也不能保证这个操作在所有线程中是原子的。在 C++11 及以后的版本中,引入了原子操作库 <atomic>,提供了一种更为强大和灵活的方式来处理并发问题,这通常被认为是volatile 的替代品。1.可见性:在多线程环境中,volatile 保证了对一个变量的读写操作对所有线程都是可见的。

2024-04-22 09:10:07 260

原创 学习了解大模型的四大缺陷

缺陷四,是大模型不知道自己错了,也不知道为啥错,更做不到知错就改。以GPT4求解算术运算题的实例为例,对于在1381和1453之间选两个随机数相乘的结果给出了错误答案,被指出错误后,无法定位是语料,还是训练等原因,更无从修正。缺陷二,是灾难性遗忘。对于第四条,个人特地选择了几种流行的人工智能平台进行了测试,包括gpt4,kimi,文心一言3.5,讯飞星火。会上,中国工程院院士、同济大学校长郑庆华认为,大模型已经成为当前人工智能的巅峰,大模型之所以强,是依托了大数据、大算力和强算法,但是也面临着若干缺陷。

2024-04-17 19:59:48 333

原创 AI编程的应用场景以及如何进行学习、探索的路线建议

学习这一领域,可以从了解AI编程助手的使用开始,比如尝试使用一些流行的AI编程工具,学习它们的基本操作和最佳实践。学习NLP,应该掌握相关的机器学习模型,如Transformer和BERT,并熟悉自然语言处理的库和工具,如NLTK和spaCy。学习这些应用,需要了解物联网(IoT)的基础知识,并掌握相关的AI技术,如图像识别和数据分析。:加入AI和机器学习相关的社区,与同行交流,相互鼓励监督,参与讨论和合作,这有助于提高技能并保持对行业动态的敏感性。:AI领域更新迅速,需要不断学习最新的技术和工具。

2024-04-15 19:17:43 306

原创 AI编程工具助手

1.GitHub Copilot:基于OpenAI Codex模型,与GitHub平台紧密集成,支持多种编程语言和IDE,能够根据上下文提供代码建议和自动补全功能。4. TalkX:集成了GPT-4模型,提供代码性能检查、安全检查、优化改进、注释生成和测试用例生成等功能,适用于JetBrains和VSCode等IDE。9. SpellBox:支持主要编程语言,提供代码生成、保存代码片段、代码解释和代码书签功能,适合软件工程师和编程学生。

2024-04-15 10:37:53 428

原创 声明结构体变量时,是否一定要加struct关键字?

然而,如果你使用typedef为结构体类型定义了一个别名,那么在声明变量时就不需要再使用struct关键字了。在这个例子中,Point是struct Point的别名,所以在声明变量p1时,我们可以直接使用Point,而不需要struct关键字。如果你没有使用typedef为结构体定义别名,那么在声明结构体变量时,你确实需要使用struct关键字来指明变量所属的类型。在这个例子中,Point是一个结构体类型,但在声明变量p1时,我们使用了struct Point来指明其类型。// 定义别名Point。

2024-04-09 15:27:40 218

原创 几种常用代码比较工具分析

同时,在选择合适的代码比较工具时,应考虑团队的技术栈、操作系统兼容性、预算限制以及具体的比较需求。优点:Diffuse在命令行中运行速度快,支持多种编程语言的语法高亮显示,提供两相比较和三相比较的功能。代码比较工具是软件开发中不可或缺的辅助工具,它们帮助开发者识别代码之间的差异,合并代码变更,提高代码审查的效率。适用性:适合Windows用户进行文件和文件夹的比较,特别是对于文档和源代码的比较。适用性:适合需要进行基本文件比较和合并的用户,尤其是那些需要生成比较报告的场景。

2024-04-09 12:56:33 277

原创 状态机编程的常用框架和方法

QP/C是一个基于C语言的事件驱动的框架,用于实现有限状态机(FSM)和层次状态机(HSM)。总之,在选择状态机编程框架时,需要考虑项目的特定需求、开发团队的熟悉度以及目标平台的特性。不同的框架和方法有各自的优势和局限性,选择合适的工具可以提高开发效率并确保代码质量。QFramework是一个基于QP/C的现代C++状态机框架,它提供了更简洁的API和更好的C++实践支持。C++状态机框架,如CppState,提供了一套模板化的C++类库,用于构建和操作状态机。

2024-04-08 18:31:00 415

原创 如何实现嵌入式软件的动态更新

这个引导程序负责在系统启动时检测是否有新固件需要更新,如果有,则将新固件加载到内存中,并在校验成功后跳转到新固件的执行入口。5.验证和切换:在写入新固件后,进行必要的验证,确保新固件的正确性和完整性。验证无误后,引导程序将控制权转移到新固件的入口点,完成新旧固件的切换。7.日志记录:在整个更新过程中,应该记录详细的日志信息,包括更新过程中的关键事件和可能出现的错误,以便于后续的问题诊断和分析。10.测试和验证:在实际部署新固件之前,应该进行充分的测试和验证,确保新固件的稳定性和兼容性。

2024-04-08 11:52:47 141

原创 微信备注添加图片成功后,为何又消失?

微信备注功能,以前仅限于昵称、电话和文字描述备注;后来增加了添加图片功能。使用一段时间发现,原来备注添加成功的图片,好好的,后来却没有了,就像不曾备注添加过图片一样?复盘后,目前初步判断,是备注添加的图片成功后,又删除了源图片、清理过微信缓存,就消失了…

2024-04-05 16:31:03 81

原创 为何keil编译信息显示data使用量不是整数

例如,某些硬件平台要求数据按照4字节对齐,如果一个变量大小为3字节,编译器可能会在该变量后添加1字节的填充,以满足对齐要求。这样,实际占用的内存量就会比变量本身的大小要大,从而可能导致数据使用量显示为小数。为了更准确地了解实际的数据使用量,开发者可以查看或分析编译器的内存布局报告,这通常会提供详细的内存分配信息。2.结构体填充:在C语言中定义结构体时,编译器为了满足内存对齐的要求,可能会在结构体的成员之间插入填充字节。在某些情况下,这些额外的调试信息可能会导致数据使用量显示为小数。

2024-03-29 20:06:00 309

原创 嵌入式系统开发中的同步和异步选择

对于需要高吞吐量和严格时序控制的应用,同步模式可能是更好的选择。在嵌入式系统开发过程中,CPU与FPGA以及Flash的交互操作是常见的功能需求,设计者往往会遇到选同步还是异步的抉择。同步模式即CPU与FPGA以及Flash之间的交互操作是在统一的时钟信号下进行的。在这种模式下,所有的操作都会在统一的时钟周期内进行,这有助于简化时序分析和设计验证。系统的设计可能更复杂,因为需要考虑时钟分配和时钟树的设计。4)设计的复杂性:如果设计团队对异步设计有丰富的经验,异步模式可以提供更大的设计灵活性。

2024-03-29 00:26:06 180

原创 AI在软件测试行业中的应用

例如,通过使用深度学习技术,可以实现更精确的图像识别和自然语言处理,从而提高自动化测试的准确性。AI可以通过学习软件的行为和模式,自动生成测试用例和测试脚本,减少手动设置和维护的工作量。6.实践和创新:跟踪最新的AI技术和软件测试趋势,在实际工作中尝试使用AI技术解决软件测试问题,积累经验,不断探索和创新。2.学习AI在软件测试中的应用:了解AI在软件测试中的应用案例,学习如何将AI技术应用到实际的测试工作中。3.测试用例生成:AI将进一步提高测试用例生成的自动化程度,减少人工干预,提高测试覆盖率和效率。

2024-03-25 14:04:43 389

原创 嵌入式软件堆栈分析 注意事项总结

嵌入式软件的堆栈使用分析过程也是一个程序的优化和调试的过程,有利于确保系统的稳定性和可靠性。同时,进行堆栈使用分析是一个持续的过程,它应该贯穿于嵌入式软件开发的整个生命周期。开发人员有时需要执行最坏情况堆栈分析,特别是在系统运行在RAM边缘、需要提交新的代码版本或最终确定用于生产的固件时。对于多线程或多任务的嵌入式系统,需要分析整个系统的堆栈使用情况,包括所有线程和中断处理函数。通过分析堆栈使用,开发人员可以识别并优化代码中的低效堆栈使用情况,例如减少局部变量的大小、优化递归调用或使用更高效的数据结构。

2024-03-24 15:33:04 233

原创 51单片机多机通信设置、通信流程

主机发送的地址帧中,第9位数据(D8)为1,表示该帧为地址帧。所有从机接收到地址帧后,会将接收到的地址与本机地址进行比较。同时,需要注意,在多机通信过程中,还需要考虑数据的同步、错误检测与纠正等问题,以确保通信的可靠性和稳定性。2.从机接收并比较地址:所有从机在接收到地址帧后,会将接收到的地址与本机地址进行比较。1.主机发送地址帧:主机首先发送一个地址帧,其中包含了要寻址的从机地址。4.从机响应:地址相符的从机在接收到数据后,可以进行相应的处理,并通过串口向主机发送响应或数据。

2024-03-22 11:31:21 303

原创 “可重入函数”(Reentrant Function)需满足的条件

它指的是一个函数或程序段在其执行过程中,即使被中断(例如,因为其他线程或中断服务程序的执行),然后在稍后的某个时刻再次被调用,也能够正确地执行并产生预期的结果。函数在执行过程中可以被打断,且在打断后能够再次被调用,并且在新的调用执行完成后,之前被打断的调用能够继续执行并正确完成。一个函数可以是可重入的,但不一定是线程安全的。5.避免内存分配和释放函数:函数内部不应直接调用如malloc()或free()之类的内存分配和释放函数,这些操作会改变系统的内存管理状态,从而影响可重入性。

2024-03-22 10:43:44 320

原创 利用自带文字提取工具,使工作提效

手机上,像华为、小米、OPPO这些大品牌的新款手机,大多都内置了OCR(光学字符识别)技术,能轻松把图片里的文字提取出来。以荣耀为例,手机上双指长按就能触发图片提取文字功能,还支持滚动识别,电脑端的荣耀管家更不用说了,识屛功能支持鼠标选择复制。当然,这些功能可能会因为设备型号、系统版本的不同而有所差异,最好还是亲自去试试看,或者查查设备的官方说明,确保你用的设备支持这个功能。平板的话,iPad是个很好的例子,iOS系统内置了强大的文字识别功能,不仅能提取图片中的文字,还支持多种语言识别,非常便捷。

2024-03-18 09:41:48 335 1

原创 关于I2C(Inter-Integrated Circuit)死锁及解决措施

8.使用I2C缓冲器:在主从设备之间串联一个I2C缓冲器,该缓冲器可以自动检测死锁状态,并在检测到死锁时主动断开与主设备的连接,发送Clock给从设备,待从设备释放SDA后再重新与主设备建立连接。6.主设备复位从设备:主设备在检测到SDA被拉低超过一段时间后,可以主动复位从设备,使其释放SDA,从而解除死锁状态。7.推送Clock到时钟总线:主设备在检测到SDA被拉低后,可以推送一定数量的Clock到时钟总线上,以取走从设备的ACK位,从而使其释放SDA。

2024-03-15 17:33:21 795

原创 程序跑飞的常见防范和处理措施

8.软件陷阱技术:当程序跑飞到非程序区时,例如E2PROM中未使用的空间和未使用的中断向量区等,指令冗余可能无法使程序回到正轨。7.冗余指令:在程序的关键部分插入冗余指令,如果程序跑飞,这些冗余指令可以帮助程序重新回到正常的执行路径上。以上措施是实践中较常用的,通过上述措施的综合应用,可以大大降低软件跑飞的风险,并确保软件能够在异常情况下恢复正常运行。6.错误处理:在程序中加入错误处理机制,如异常捕获和错误检测代码,一旦检测到异常,能够引导程序安全地恢复到正常流程。

2024-03-13 10:17:08 365

原创 DDR器件的操作流程软件设计

以上描述是一种通用的DDR器件操作流程,具体的实现可能会因DDR器件的型号、规格和使用的平台而有所不同。因此,在实际应用中,建议多多参考DDR器件的数据手册或相关文档,注意细节处理,以实现更详细和准确的操作流程和要求。数据训练过程中,主控制器会向DDR器件发送一系列的训练模式和命令,并根据DDR器件的响应调整相关参数。DDR器件通常会提供初始化序列,包括一系列特定的命令和时序,以确保DDR器件能够正确地配置和启动。1.兼容性:确保软件设计与DDR器件的规格和特性相兼容,如支持的数据传输速率、容量大小等。

2024-03-10 14:43:24 365

原创 人工智能(AI)领域最流行的八大算法概括

4. 生成对抗网络(GAN,Generative Adversarial Network)1. 卷积神经网络(CNN,Convolutional Neural Network)3. 循环神经网络(RNN,Recurrent Neural Network)2. 图神经网络(GNN,Graph Neural Network)6. 深度置信网络(DBN,Deep Belief Network)5. 强化学习网络(DQN,Deep Q-Network)人工智能(AI)领域最流行的八大算法概括!

2024-03-10 14:27:34 399

原创 常见串行总线的典型误码率参考

误码率:由于1553B设计用于军事和航空应用,其对误码率的要求非常严格。在标准中,没有具体的BER数值,但通常期望在极低水平,如低于10^-9或更低。误码率:RS-422标准本身不规定具体的误码率,但通常由于采用差分信号传输,误码率可以保持在一个很低的水平,通常在10^-6到10^-9之间。误码率:RS-485的误码率也依赖于具体应用和传输条件,但通常可以低至10^-7到10^-10,尤其是在使用双绞线平衡传输和适当的终端电阻时。在理想条件下,CAN的误码率可以非常低,通常在10^-7到10^-12之间。

2024-02-25 22:54:54 528

原创 多普勒变化率的应用 与 FPGA

与DSP的结合:随着技术的发展,FPGA常与数字信号处理器(DSP)结合使用,采用协处理架构,以实现更加复杂的信号处理任务。这种结合充分利用了FPGA的并行处理能力和DSP的算法优势,为处理多普勒频率变化率提供了强大的技术支持。综上可知,多普勒变化率的概念在许多领域都有应用,比如雷达和超声检测技术中,通过分析反射波的多普勒变化率,可以探测物体的运动状态。这种并行性大大提高了处理速度和效率。综上,FPGA在多普勒频率变化率的应用中扮演着关键角色,其高速、灵活和可定制的特性使其成为实现高效信号处理的理想平台。

2024-02-22 18:03:56 557

原创 sourceinsight工程中文件被删除?

sourceinsight建立工程后,偶发程序文件被删除情况。当前初步排查,可能由于在当前工程中添加了其他宏文件,如查找多余函数,并在key assignment菜单下,执行了宏。宏的设计缺陷导致了执行该宏之后,原工程文件被删除…

2024-02-02 18:19:08 437

原创 关于大模型与软件测试

LLM与软件测试调研现状机遇和挑战知识学习

2024-01-29 22:58:14 394

原创 使用c语言库函数导致关中断

关闭中断可能会对系统的实时性和响应性产生影响,因此在使用clock()函数时需要权衡其准确性和系统性能的需求。clock()函数的实现可能在不同操作系统和硬件平台上有所不同,因此其行为可能会有所不同。在一些系统中,clock()函数可能会在执行期间关闭中断,以避免计时器中断对计时的干扰。然而,在其他系统中,clock()函数可能不会关闭中断,或者使用其他机制来确保计时的准确性。该函数接受一个参数,表示需要延迟的秒数。请注意,这个实现使用了clock()函数,它是C标准库中的一个函数,用于获取当前时间。

2024-01-26 09:43:58 364

原创 keil编译提示 code size limit in restrict version exceed

结果,原来是未完成注册😂。从安装包找到注册机(互联网共享的),keil开发环境--file--license management,找到CID复制到注册机,生成lic码并复制,回到license management页面,粘贴lic,add lic,即可。现象:keil编译提示 codesize limit in restrict version exceed,无法完成编译。解决:开始以为是target标签页配置的空间不够,调整后仍不行。所用版本keil v952。

2024-01-18 15:07:35 559

原创 如何进行ddr3训练配置?

进行DDR3均衡训练配置:根据你找到的内存配置选项,进行DDR3均衡训练的配置。因此,在进行DDR3均衡训练的配置之前,建议仔细阅读主板和内存规格文档,并参考相关的技术指南或支持资源。确定内存规格和容量:首先需要确定你的系统所使用的内存规格和容量,例如DDR3 4GB或DDR3 8GB等。测试系统稳定性:重新启动计算机,并进行系统稳定性测试,以确保DDR3均衡训练配置成功并提高了系统的性能和稳定性。保存并退出BIOS设置:完成DDR3均衡训练的配置后,保存所做的更改并退出BIOS设置界面。

2024-01-08 09:15:47 375

原创 【无标题】word2007删除页眉横线(亲测方法二)

word2007删除页眉横线 方法 一:步骤一:双击一下页眉区域,使页眉处于编辑状态,,然后点击到“开始”选项卡,选择“边框和底纹”工具,如图;步骤二:进入“边框和底纹”的界面,选择无“边框,如图;步骤三:再选择应用于“段落”,选择好之后点确定,就可以了,如图;步骤四:设置好之后,我们来看一下效果图;word2007删除页眉横线方法二:步骤一:先看看图片示例,每一页都有页眉横线步骤二:不要着急,在开始选项卡找到样式,快捷键是alt+ctrl+shift+s步骤三:打开样式,找

2023-01-16 00:16:41 538

原创 Word批量删除图片

查找替换快捷键Ctrl+H打开 查找和替换 对话框1、点击 更多 按钮2、点击 特殊格式,选择图形3、查找内容那会自动出现 ^g4、点击 全部替换即可

2022-09-01 14:18:37 594

转载 Ubuntu16.04多个版本GCC编译器的安装和切换[ZZ]

这几天在配置交叉编译ARM开发板的linux内核的过程中碰到了很多问题,其中包括了GCC版本太高等问题,由此我打算安装其他老的版本给我的Ubuntu16.04.实验过程如下:官网的教程是最牛逼的,先看看官网的安装教程吧:https://gcc.gnu.org/install/1、首先查看一下当前我的Ubuntu16.04版本的原装GCC版本:gcc -v #查看gcc的版本g++ -v #查看g++的版本如上图所示:GCC的版本是5.4.0(这对我编译某些很早的内核文件的确是太新..

2020-07-27 23:59:41 895 2

原创 ie浏览器主页被毒霸锁定,解决

1.卸载毒霸,驱动精灵等软件;2.还是不行,尝试注册表,无法更改注册表;3.“Win+R”打开运行窗口,输入“gpedit.msc”---打开用户配置—管理模板—windows组件—internet explorer,找到并打开禁用更改主页设置,---在禁用更改主页设置的界面中,点击已启用,输入要锁定的主页网址,成功...

2020-05-22 22:19:19 983

转载 Python学习之IDE(Eric4)------windows下搭建Python开发环境[python2.7+pyqt4(PyQt-Py2.7-x32-gpl-4.9.6-1)+Eric4(eric

开篇:都说Win下的Eric4的开发环境配置有点麻烦...个人觉得还好。...Eric4基本用来开发Gui程序的比较多。。。我是看中了它的自动补全,智能提示,测试等功能。。。哈哈!@【配置环境】第一步:安装python包据说2.7.X版本比较稳定...第二步:安装pyqt4最好下.exe的它能自动安装,自动配置好环境.能智能找到py目录进行安装。

2015-12-25 00:16:18 4501 1

转载 编译器验证ZZ

20 多年以来,ARM 编译器工具链为软件开发提供了可靠的平台。ARM 编译器用于开发航天、银行业、医疗保健、汽车、运输、制造、消费、军事以及电信领域的软件应用程序。目前,有超过 20 亿台设备正在运行使用 ARM 编译器工具链开发的软件。每个 ARM 编译器版本都需要接受彻底的验证过程,其中涉及数以千计面向代码生成正确性的测试用例。在模拟和硬件目标上使用不同的优化级别和架构特定的选项对编译器

2015-09-05 22:12:34 934 1

转载 C#创建datatable

Asp.net DataTable添加列和行的方法方法一:DataTable tblDatas = new DataTable("Datas");DataColumn dc = null;dc = tblDatas.Columns.Add("ID", Type.GetType("System.Int32"));dc.AutoIncrement = true;//自动增加dc.Auto

2014-11-18 23:55:42 370

原创 dataGrid不能直接写回数据库

在网上也看了一些东西,主要是Update()操作的版本比较多,但是都未能成功

2014-11-13 22:01:05 424

原创 一个下Jar源码的网站

http://jarfiles.pandaidea.com/org.eclipse.cdt.html

2014-11-13 21:38:28 498

转载 SqlServer 局域网内不能连接对方数据库?

一直都是连接的远程测试服务器的数据库,今天想把自己的数据库开放出来让公司同事连接,竟然连接失败!转了很大一个圈终于搞定了。接下来就把这次心历路程发出来,希望能帮助到有需要的博友。PS: 我和同事的数据库是 sqlserver2008,sql2000/2005请做参考。因为是把我的机器开放出来让同事连,所以以下把 本机 称作 服务器,同事机 称作 客户端一、telne

2014-10-16 00:39:52 1180

First_test_092507.zip

First_test_092507.zip

2023-05-15

朗科Netac量产修复工具

朗科Netac无法打开,无法格式化问题修复;我亲自用过,好着呢!

2012-09-18

windows 网络编程.CHM (英文版)

英文版,如果你想尝试和锻炼一下自己的专业英文水平

2011-07-20

java英文翻译(中英文)文献

中英文都有,翻译过来的 中文有6257个汉字,足够用两个人用了吧?

2009-06-17

MySql4从入门到精通(诚信pdf版)

MySql4从入门到精通(诚信pdf版)

2009-04-20

09考研数一真题及答案

清华版,含09考研真题题目和每道题目详尽解析,pdf完整版。

2009-04-16

空空如也

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

TA关注的人

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