自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 复盘!!指针 ,地址 ,数组之间的联系

工作摸鱼 闲来无事所以,这个题目答案是5.我来盘给你:int a[5] = {1,2,3,4,5};1·数组名本身就是表示数组首元素地址2·对数组名取地址:表示的是整个数组的地址,并且为int (*p)[5] 类型。但是哈!!不管是数组名的含义还是对数组名取地址的含义,他们都是表示一个地址,而且这个地址两者一致。不同的是:偏移量的不同。怎么解释?a+1表示的是a[1]的地址,偏移量只有一个数组元素。但是&a+1表示下一个数组的地址(也就是a[4]这个最后一个元素后面的那个地址),因为偏移量是一个数组。

2023-01-13 16:03:35 632 1

原创 智能电风扇(stm32f103c8t6)(直流电机,热敏传感器)(TIM,ADC)

1· 32单片机跑裸机的时候,注意,只能有主函数里面的while(1)循环,其他地方不能出现死循环。我试过,跑不出来,崩溃了。2· 模块化编程,一次最好循环一个模块。这个模块里面可以有一点点延时函数。其实延时函数对于整个系统来说是不友好的,我就在想有没有一种方法可以计时,但是不吃主控的性能,我的初步想法就是用定时器,定时到了不是申请中断,而是申请事件。后面看能不能试一下。

2023-01-13 15:59:41 2997 2

原创 ymodem协议!!

在实习公司遇到一个需求,需要用到ymodem协议来传输文件(仪表传输到控制器)。在网上找了很多资料,但是符合的不太多于是写下这个博客来记录一下。

2022-12-20 19:38:17 1474 2

原创 C语言---熟悉内存这个东西(推荐)

文章目录前言一、内存的编址与寻址1·1 内存单元大小1·2 内存的编址方法1·3 内存与数据类型的关系1·4 内存对齐总结前言这是一篇关于C语言内存的博客,哈哈哈我觉得我最近由于收到offer后有点懈怠了。希望自己还是一个勤勉的自己~~还是好好学习好好写博客吧。不积跬步无以至千里。一、内存的编址与寻址1·1 内存单元大小内存大小有4个:位,字节,半字,字。位和字节是用的最多的。1·2 内存的编址方法内存在逻辑上可以想成一个一个挨着的格子,这些格子就是存放数据,每个格子都有一个专属编号

2022-05-26 08:41:56 245

原创 数组元素求和,字符串逆序输出,字符串转数字

#include <stdio.h>int sum(int a[],int n){ int i = 0; int arr_sum = 0; for(i=0;i<n;i++) { arr_sum += a[i]; } return arr_sum;}int main(void){ int i; int arr[]={1,2,3,4,5,6}; for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++ ) { pri

2022-05-22 17:55:30 155

原创 斐波那契数列

#include<stdio.h>#define Method 0// 1:迭代法 0:递归法#if Method// 第一种:迭代法long fibonacci(int i){ if(i<=2) { return 1; } long pre_pre_res,pre_res,result; pre_pre_res = pre_res = 1; while(i>2) { result = pre_res + pre_pre_res; pre_

2022-05-22 17:28:50 101

原创 C语言--- 什么是位域?

文章目录前言一、什么是位域1、定义二、如何使用位域前言再一次机缘巧合的情况下,我第一次偶然的听说“位域”这个名词,当我查询了一下,发现它是一个关于C语言的知识点。并且在嵌入式的开发当中经常用到。于是这篇博客诞生。对于位域的知识点,指花了两个小时看了一篇博客,所以我不敢保证这篇博客没有错误,如有问题,请多多指教啦~~~一、什么是位域1、定义允许在一个结构体中以位为单位来指定其成员长度,这种以单位的成员称为“位段”或者“位域”。定义中涉及了结构体,所以,位域和结构体的关系紧密。再说一点,位域之

2022-05-22 15:15:54 2091 3

原创 STM32学习日记6---串口通信

文章目录前言一、先说UART 与USART1、通信数据同步方式:同步 与 异步2、数据传送方式:串行 与 并行二、介绍一下串口通信的几个参数三、串口实验(我这里就用串口1)3·1 串口就传输数据并且打印3·2 串口中断3·3 串口的DMA总结前言题外话:说真的,我的32 的专栏确实停了好久,其实草稿箱里面又几篇32的文章,只是由于内容不完整就迟迟没有发布。具体看到有一个小伙伴需要一篇32关于串口的文章,所以,我也来学习一下吧~~~正篇:通信在嵌入式系统很常见,嵌入式微处理器的通信接口类型有很多,

2022-05-21 13:39:42 897 1

原创 14.STM32freeRTOS---freeRTOS事件标志组

文章目录前言一、事件标志组简介1· 事件位(事件标志)2· 事件组3· 创建事件标志组4· 设置 事件位5· 获取事件标志组 值6· 等待指定的事件位前言前面学习了使用信号量来完成同步,但是使用信号量只能同步单个事件或任务。有时候某个任务可能会需要多个事件或任务进行同步,此时信号量就显得力气单薄了。所以freeRTOS提供了一个办法-----事件标志组。一、事件标志组简介1· 事件位(事件标志)2· 事件组事件标志组 和 事件位 的数据类型:3· 创建事件标志组4· 设置 事

2022-05-15 18:02:51 253

原创 13.STM32freeRTOS---软件定时器

文章目录前言一、软件定时器介绍**关于回调函数的注意事项:**软件定时器的回调函数在定时器服务中执行,所以一定不能在回调函数中调用任何会阻塞任务的API!!!比如,定时器回调函数中绝对不要用 vTaskDelay(),vTaskDelayUntil(),以及一些访问队列或者信号量的非零阻塞时间的API!!二、定时器服务/Daemon 任务1. 定时器服务任务 与 队列2. 定时器相关配置3. 单次定时器 与 周期定时器4. 复位软件定时器5. 创建软件定时器6. 开启软件定时器7. 停止软件定时器8.

2022-05-15 11:53:32 2235

原创 12.STM32freeRTOS---递归互斥信号量

文章目录前言一、创建递归互斥信号量二、释放递归互斥信号量三、获取递归互斥信号量四、官方例程总结前言递归互斥信号量可以看成是一个特殊的互斥信号量。对于互斥信号量,获取了互斥信号量的任务就不能再次获取这个互斥信号量,但是递归互斥信号量不一样,就算已经获取了递归互斥信号量的任务可以再次获取这个递归互斥信号量,并且不限次数。一个任务使用xSemaphoreTakeRecursive()成功的获取了多少次递归信号量,那么这个任务也必须释放多少次递归信号量。注意:递归互斥信号量也有优先级继承的机制,所以不能用于

2022-05-15 09:02:21 404

原创 11.STM32freeRTOS---互斥信号量 【补充】

文章目录前言一、创建互斥信号量二、获取 与 获取 互斥信号量三、实验总结前言互斥信号量就是为了解决二值信号量的优先级反转的问题。所以,我先简单的说一说互斥信号量的情况。假设有两个任务,任务1和任务2,任务1的优先级是1,任务2 的优先级是2。者两个任务都会操作同一个互斥信号量Mutex,低优先级任务先获取了互斥信号量,此时高优先级任务也要获取互斥信号量,但是发现低优先级任务正在占用互斥信号量,**于是高优先级任务会将低优先级任务的优先级拉高到和自己一样高,**然后等待拉高后的低优先级任务释放互斥信

2022-05-14 21:58:43 453

原创 10.STM32freeRTOS---二值信号量的优先级反转 与 互斥信号量

文章目录一、啥是优先级反转二、优先级翻转实验**hight task running!!** (4)最后:解决优先级反转的办法:互斥信号量一、啥是优先级反转先说明:任务H的优先级最高,其次是M,最后是L。(1)任务H和任务M处于阻塞态,等待某一事件的发生,任务L正在执行。(2)某一时刻L想要访问共享资源,在此之前它必须先获得对应资源的信号量。(3)L获得信号量并开始使用共享资源。(4)由于H的优先级最高,它等待的事件发生后级抢占了L的CPU使用权。(5)H开始运行。(6)H运行过程中

2022-05-14 17:18:18 874

原创 9.STM32freeRTOS---计数型信号量

文章目录前言一、创建计数型信号量二、释放和获取计数型信号量三、计数型信号量操作实验实验遇到的问题前言计数型信号量又叫数值信号量,二值信号量相当于长度为1的队列,那么计数型信号量就是长度大于1 的队列。同二值信号量一样,用户不需要关心队列中存储了什么数据,只需要关心队列是否为空即可。计数型信号量运用场合:事件计数,资源管理。事件计数:每次事件发生的时候就在事件处理函数中释放信号量(增加信号量的计数值),其他任务会获取信号量(信号量计数值减1,信号量值就是队列结构体成员变量uxMessageWai

2022-05-14 15:12:42 937

原创 8.STM32F103freeRTOS---信号量

文章目录前言一、创建二值信号量二、释放信号量三、获取信号量四、二值信号量操作实验总结前言信号量常用于控制对共享资源的访问和任务同步。信号量说的直白一点就是:计数器。比如我们去一个公共电话,我们知道电话的两种状态:使用和未使用状态。如果用电话的两个状态作为信号量的话,那么这个就是二值信号量。信号量用于控制共享资源访问的场景相当于一个上锁机制,代码只有获得了这个锁的钥匙才能够执行。信号量还有一个重要的运用场合就是任务同步,用于任务于任务或中断于任务之间的同步。一、创建二值信号量注意:二

2022-05-14 10:02:20 740

原创 7·STM32F103freeRTOS---队列与关于队列的实验

文章目录前言一、什么是队列1、数据存储2、多任务访问3、出队阻塞 与 入队阻塞3、队列操作过程图示二、创建队列1、函数原型(1)动态创建(2)静态创建(3)xQueueGenericCreateStatic三、向队列发送消息以 FromISR结尾的函数都是用于中断服务函数中的真正干活的发送函数:xQueueGenericSend(任务级通用入队函数)和xQueueGenericSendFromISR(中断级通用入队函数)四、队列上锁与解锁五、从队列读取消息前言在实际运用中,会遇到一个任务或者中断服务需

2022-05-12 20:52:00 940

原创 6.STM32freeRTOS---动态/静态创建任务与删除

文章目录前言一、动态创建任务与删除二、静态创建任务与删除1.遇到的问题前言本次实验用来熟悉任务创建和删除的API。一、动态创建任务与删除#include "sys.h"#include "usart.h"#include "led.h"#include "delay.h"#include "FreeRTOS.h"#include "task.h"#define start_task_size 52#define start_task_pro 1TaskHandle_t s

2022-05-11 15:33:24 836

原创 5·STM32freeRTOS---中断测试实验

//main.c#include "sys.h"#include "usart.h"#include "led.h"#include "timer.h"#include "delay.h"#include "FreeRTOS.h"#include "task.h"#include "queue.h"#define START_TASK_PRIO 1 //任务优先级#define START_STK_SIZE 100 //任务堆栈大小TaskHandl.

2022-05-10 20:02:44 568

原创 4.1 对于4.STM32freeRTOS---队列传递DMA搬运的ADC数据 遇到的错误解决笔记

第一个问题:串口打印出 Error:…\FreeRTOS\port\RVDS\ARM_CM3\port.c,204 错误首先,先去定位到port.c 的204行。static void prvTaskExitError( void ){/* A function that implements a task must not exit or attempt to return to* its caller as there is nothing to return to. If a ta

2022-05-09 14:10:21 1106

原创 4.STM32freeRTOS----队列传递DMA搬运的ADC数据

说明:这个实验是想熟悉一下freeRTOS,创建两个任务,一个任务来接收DMA搬运ADC转换过来的数据,并且把这个数据写入一个队列;另一个任务就是去队列中把这个数据读出来并且打印到串口。详细:这个实验的思路。我想熟悉一下任务之间的通信—队列的方式,于是想把ADC转换过来的数据放到一个队列中,然后通过读取这个队列就知道转换数据。主函数:首先在主函数中对串口进行初始化,led初始化,adc初始化。然后创建一个开始任务。最后开启任务调度。开始任务函数:开启与关闭临界区。创建一个队列,并且创建两个.

2022-05-09 14:10:01 2691 8

原创 1.freeRTOS---裸机程序的缺陷与RTOS的引入

一、裸机开发模式1·1 轮询方式缺点:函数之间互相影响,假如第一个功能函数运行的时间有点长,那么第二个函数就会被耽误。1·2 事件驱动方式1·2·1 常用事件驱动方式:定时器1·3 改进事件驱动方式二、裸机开发的缺陷的解决方法对于裸机程序开发的缺陷:函数之间互相影响。解决方法:状态机。2·1 什么是状态机?裸机程序在main函数里面就是轮询的方式去执行每一个功能函数,既然想减少函数之间由于函数的执行时间的相互影响,我们只要把每个功能函数执行的时间减少就行了,也就是说把每个功能

2022-05-08 13:22:18 1462

原创 3. STM32freeRTOS---vTaskDelay 和 vTaskDelayUntill,空闲与钩子函数,任务调度策略

一、vTaskDelay 和 vTaskDelayUntillvTaskDelay :至少等待指定个数的tick interrupt才能变为就绪态。(所以在等待的时候是阻塞态)vTaskDelayUntill :等待到指定的绝对时刻,才能变为就绪态(所以在等待的时候是阻塞态)。 BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,//开始时间 const Ti

2022-05-04 16:57:26 1842

原创 2.stm32freeRTOS---创建一个任务

文章目录前言一、创建一个任务需要注意哪些?1、任务创建函数xTaskCreate2、代码分析二、动态/静态分配1· 动态分配2· 静态分配:三、删除任务四、一个函数创建两个任务总结前言上一次是初步接触实时系统,这次开始认真学习一、创建一个任务需要注意哪些?1、任务创建函数xTaskCreate BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //任务名 const char * con

2022-05-04 11:13:11 804

原创 1.STM32F103freeRTOS---初步接触freeRTOS小实验

文章目录前言1. 先介绍以下freeRTOS2. 先点亮led灯练手2`1 这个点灯实验遇到的问题:只有一个任务执行3· 任务挂起 与 任务恢复 API的使用(小实验)4· 中断服务函数中恢复任务运行4`1 遇到的问题:中断进不了总结前言由于某些原因,让我接触到freeRTOS(实时系统),所以,就记录下,实时系统与stm32普遍在 while(1)里面轮询的 不同之处,以及在学习过程中遇到的bug。1. 先介绍以下freeRTOSfree :就是免费RTOS:real time

2022-04-19 22:28:23 1660 1

原创 Linux 系统下添加环境变量 并且不会覆盖之前添加环境变量的方法

第一步,vim .bashrc进入bashrc文件然后添加 新的环境变量然后 ESC :wq 退出文件。但是,这里这样添加会造成之前添加的环境变量被覆盖。所以我们需要再添加一句,让之前的环境变量也有用。以后只需要再最后一个PATH处添加 :$xxxxx 就可以了【查看路径指令:pwd】...

2022-04-14 09:47:48 1467

原创 STM32学习日记5--- DMA

文章目录1. 存储器flash 读到 存储器SRAM 传输 实验代码2. 存储器 读到 外设 传输DMA说简单点就是一个搬运工,把数据从源地址搬到目的地址。于是就有了两种方式:存储器到存储器 和 存储器到外设;再简单点,存储器到存储器其实也算是存储器到外设嘛。1. 存储器flash 读到 存储器SRAM 传输 实验代码在flash中定义好需要传输的数据,在SRAM中定义好接收flash数据的变量。然后比较传输前后数据是否一致,用一个led来指示。main.c#incl

2022-03-29 20:37:17 569

原创 STM32学习日记4---内核定时器(SysTick定时器来写毫秒级延时)

文章目录1. 根据标准库core_cm3.h的systick来编写精确的毫秒级延时函数1. 根据标准库core_cm3.h的systick来编写精确的毫秒级延时函数#include "stm32f10x.h"/** * @brief 微秒级延时 * @param xus 延时时长,范围:0~233015 * @retval 无 */void Delay_us(uint32_t xus){ SysTick->LOAD = 72 * xus; //设置定时器重

2022-03-28 11:37:32 642 3

原创 STM32学习日记3---定时器TIM3重映射PWM波呼吸灯实验

文章目录1. 代码关于PWM波的输出,我们需要用到定时器的4个通道(通用定时器和高级定时器有,基本定时器没有这4个通道)里面的PWM生成。然后查看数据手册,了解定时器的重映射引脚情况。所以配置时,需要:开GPIO时钟,引脚复用时钟,定时器时钟;定时器部分重映射;GPIO引脚初始化配置,定时器初始化配置,定时器的PWM模式配置;使能定时器CCRx重装载;最后使能时钟。在main函数里面,TIM_SetCompare2(TIM3,PWM_Val);//通过设置比较值来调占空比。这个后面一定是需要一点延时

2022-03-28 10:54:46 3269 3

原创 STM32学习日记2---中断

文章目录1. 有关中断的知识点1·1 NVIC 与 EXIT 的区别1·2 中断分为内部中断和外部中断。1·3 中断处理流程1·4 抢占优先级 与 响应优先级2. 用外部中断来写的小代码3· 内部中断小代码1. 有关中断的知识点1·1 NVIC 与 EXIT 的区别1·2 中断分为内部中断和外部中断。STM32 芯片外设(USART,TIM,ADC,CAN,DMA,IIC,SPI等)的中断直接由NVIC负责,STM32芯片以外的外设中断(IO端口)由EXIT和NVIC共同负.

2022-03-28 10:40:03 6366

原创 8·Linux应用编程和网络编程---Linux网络编程 笔记

文章目录1. 网络通信基础知识1. 网络通信基础知识

2022-03-25 07:24:12 164

原创 7·Linux应用编程与网络编程---线程全解 笔记

文章目录1. 先说进程2· 线程的引入3· 进程同步之信号量4· 互斥锁1. 先说进程进程的优势:CPU时分复用,单核心CPU可以实现宏观上的并行实现多任务系统需求(多任务需求是客观的)进程的劣势:进程间切换开销大进程间通信麻烦并且效率低下解决方案就是 线程2· 线程的引入2·1 Linux中的线程简介(1)一种轻量级进程(2)线程是参与内核调度的最小单元,内核调度调的是线程。(3)一个进程中可以有多个线程,线程依附于进程存在。2·2 线程的优势(1)可以如同.

2022-03-25 07:22:44 90

原创 6·Linux应用编程与系统编程---高级IO 笔记

文章目录1. 非阻塞IO2· 并发式IO的解决方案1. 非阻塞IO1·1 阻塞 与 非阻塞(1) 阻塞:函数要完成的事情条件不具备,当前不可以执行,需要等待条件达到后再执行。非阻塞:函数会立即返回,但是函数有没有执行成功却不一定。(2)阻塞 与 非阻塞 是两种设计思路,没有绝对的好坏之分。总的来说,阻塞式的结果有保障,但是时间没有保证;非阻塞式的时间有保障但是结果没有保证。1·2 为什么会有阻塞常见阻塞:wait,pause,sleep等函数;read或者write某些文件时阻塞

2022-03-25 07:21:47 82

原创 STM32学习日记1---光敏传感器模块

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、光敏传感器引脚二、光敏传感器小实验11·这里提一下GPIO的工作模式2·这里提一下GPIO的输出速度三、光敏传感器小实验2四、光敏传感器小实验3前言这是我学习32的心理路程我会尽量把内容写的仔细对于一些简单模块的使用,我不打算深究其原理,我只要会用它就欧克。所以看见我的32博客的同志们请注意这一点。如果同志您觉得内容有改进的地方,那就请多多指教啦~~~本人一定认真听取。一、光敏传感器引脚我这里使用的光敏传感.

2022-03-24 18:45:01 31052 23

原创 5·Linux应用编程和网络编程---Linux中的信号 笔记

文章目录1. 什么是信号1. 什么是信号

2022-03-19 08:46:48 257

原创 4·Linux应用编程和网络编程---Linux进程全解 笔记(进程与程序的区别)

文章目录1. 程序的开始与结束1·1 main函数由谁调用1·2 程序如何结束1·3 atexit注册进程终止处理函数1·4 return , exit ,_exit 的区别2· 进程环境2·1 环境变量2·2 getenv函数获取环境变量2·3 进程运行的虚拟地址空间1. 程序的开始与结束1·1 main函数由谁调用说main函数由系统调用是不准确的。操作系统下的应用程序在main执前需要执行一段引导代码(裸机中的汇编代码)才能去执行main,所以我们在写应用程序时不用考虑引

2022-03-18 10:59:12 986

原创 3·Linux应用编程与网络编程---获取系统信息 笔记

文章目录1. 关于时间的概念2· Linux系统中的时间3· 时间相关的API实战11. 关于时间的概念1·1 点时间 与 段时间点时间:一个时间点短时间:一段时间,有间隔。1·2 定时器 与 实时时钟定时器定的时间就是段时间;实时时钟RTC就是和点时间有关的一个器件。2· Linux系统中的时间2·1 jiffies 的引入jiffies是Linux内核中的一个全局变量,这个变量用来记录以jiffies为单位时间长度的一个数值。内核配置的时候定义了一个节拍时间,实际上.

2022-03-13 15:23:56 1240

原创 2·Linux应用编程与网络编程---文件属性 笔记

目录1. Linux中各种文件类型2. 常用文件属性获取3· 文件权限管理4· 读取目录文件1. Linux中各种文件类型1·1 普通文件(文件标识: - )(1)文本文件:文件中都是由文本构成的,文本指的是ASCII码字符。文件里面的内容本质上都是数字(不管什么文件内容本质上都是数字,因为计算机中本身就只识别 0 和 1),而文本文件中的数字本身应该被理解为这个数字对应的ASCII码。文本文件服务于人。常见的 .c 文件, .h文件 ,.txt文件都是文本文件,文本文件方便读懂和编写。

2022-03-11 09:49:39 122

原创 1· Linux应用编程和网络编程---Linux系统中的文件IO 笔记

目录导入:典型的嵌入式产品就是基于Linux系统在硬件上跑起来(系统移植工作),第二步基于Linux系统来开发应用程序实现产品功能。什么是应用编程?基于Linux去做系统编程,其实就是通过调用Linux的系统API来实现应用需要完成的任务。什么是文件IO ?文件IO就是文件的读写。1· 文件操作的主要接口API1·1 什么是操作系统的API?API是一些函数,这些函数是Linux系统提供,由应用层程序来使用。应用层程序通过调用API来调用操作系统中的各个功能 以此实现目的。学习一个

2022-03-08 22:00:18 541

原创 12·C语言---链表与状态机 笔记

文章目录一、链表的引入二、单链表的实现三、提示:这只是笔记一、链表的引入1·1 先说说数组的缺陷:数组元素必须一致;数组元素个数一旦指定就不可更改。1·2 结构体解决了数组的第一个缺陷,链表就是解决了数组的第二个缺陷。1·3 时刻记住链表是用来解决数组的大小不能扩展问题。二、单链表的实现2·1 单链表的节点构成 : 有效数据 + 指针2·2 定义的struct node 只是一个结构体,本身并没有变量生成,也不占内存。结构体的定义相当于为链表的节点定义了一个模板,但是还没有一

2022-03-06 17:02:42 801 1

原创 11·C语言---一些杂乱无章但是值得说说的问题

文章目录一、操作系统到底是个什么东西?二、 main函数的返回值究竟返回给谁?三、 argc 、argv 与main函数的传参四、 void类型的本质五、六、七、八、一、操作系统到底是个什么东西?1· 先说说裸机程序:代码量小,功能简单,所有代码都和直接目的有关,没有服务型代码(服务型代码就是 服务其他代码的 代码)。2· 操作系统类似于 管理阶级。操作系统的代码本身并不直接产生价值,它的主要任务就是管理所有资源,它主要为 直接产生价值,直接劳动的程序(各种应用程序)提供服务。所以

2022-03-02 20:12:27 409

空空如也

空空如也

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

TA关注的人

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