<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[xwt321的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/xwt321</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; xwt321]]></copyright><item><title><![CDATA[数据结构之循环队列]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/116002458</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/116002458</guid><author>xwt321</author><pubDate>Thu, 22 Apr 2021 11:06:30 +0800</pubDate><description><![CDATA[队列是一个能够实现“先进先出”的存储结构。队列分为链式队列和静态队列；静态队列一般用数据来实现；链式队列是用链表来实现队列。

在对循环队列操作之前，先要建立队列结构元素：


#define BUF_SIZE  10  //循环队列的空间大小

typedef struct Queue
{
    int *BUF;
    int front;
    int rear;
}QUEUE;

1.初始化是为新建的队列分配内存空间，然后在将头尾指针置零：


void initQueue(QUEUE *qu]]></description><category></category></item><item><title><![CDATA[STM32的IAP]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/115477393</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/115477393</guid><author>xwt321</author><pubDate>Wed, 07 Apr 2021 10:11:45 +0800</pubDate><description><![CDATA[IAP（In Application Programming）即在应用编程，IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写，目的是为了在产品发布后可以方便地通过预留的通信口对产品的固件程序进行更新升级。通常实现IAP功能时，即用户程序运行自身的更新操作，需要在设计固件程序时编写两个项目代码，第一个项目程序不执行正常的功能操作，而只是通过某种通信方式（如USB USART）接收程序或者数据，执行对第二个部分代码的更新；第二个项目代码才是真正的功能代码。这两部分代码项目...]]></description><category></category></item><item><title><![CDATA[UCOS-III任务管理]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/113876759</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/113876759</guid><author>xwt321</author><pubDate>Sat, 20 Feb 2021 10:16:21 +0800</pubDate><description><![CDATA[多任务操作系统最主要的就是对任务的管理，包括任务的创建、挂起、删除和调度等，因此对于UCOS-III操作系统中任务管理的理解就显得尤为重要。

1.UCOS-III启动和初始化：

  a:最先肯定是要调用CPU_Init()初始化UCOS-III；

  b:创建任务，一般我们在main()函数中只创建一个start_task任务，其他任务都在start_task任务中创建，在调用OSTaskCreak()函数创建任务的时候一定要调用OS_CRITICAL_ENTER()函数进入临界区，任...]]></description><category></category></item><item><title><![CDATA[UCOS-III的工作流程图]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/113876200</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/113876200</guid><author>xwt321</author><pubDate>Sat, 20 Feb 2021 09:32:48 +0800</pubDate><description><![CDATA[UCOS-III的工作流程分为如下几步：

1.初始化变量（OSIint）:初始化所有变量、数据结构、创建最低优先级空闲任务OSTaskIde，（如果使用了统计任务，也在此创建），创建6个空数据链表：1空任务控制块链表；2空事件控制块链表；3空队列控制块链表；4空标志组链表；5空内存控制块链表；6空闲定时器控制块链表。

2.创建任务（OSTaskCreate）：至少创建一个任务。一般创建一个最高优先级别TaskStart任务，任务调度后，在这个任务中再创建其他任务，初始化硬件，并开中断。

3.进入多任务]]></description><category></category></item><item><title><![CDATA[STM32读保护]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/86237243</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/86237243</guid><author>xwt321</author><pubDate>Thu, 10 Jan 2019 16:29:17 +0800</pubDate><description><![CDATA[1.功能及设置

功能：读保护设置后将不能读出flash的内容；当解除读保护的时候stm32会自动擦出整篇FLASH。

设置：在程序的开头加入“读保护”代码，即实现了读保护功能。（每次程序运行前先开保护）

（1）设置读保护：


if(FLASH_GetReadOutProtectionStatus() != SET)
{
    FLASH_Unlock();  //不解锁FLASH也可设置...]]></description><category></category></item><item><title><![CDATA[keil c51不编译未调用函数]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79663136</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79663136</guid><author>xwt321</author><pubDate>Fri, 23 Mar 2018 10:04:56 +0800</pubDate><description><![CDATA[      在用KEIL C51，经常会遇到定义了的函数未调用，编译时会发出“UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS”的警告，我们不想手动去删除，也不想这部分代码被编译和链接进最终的程序，以免浪费有限的储存空间。方法如下：       未设置的情况下：设置如下1.把target options中的device页中选上“use Extended Li...]]></description><category></category></item><item><title><![CDATA[冒泡排序]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79473262</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79473262</guid><author>xwt321</author><pubDate>Thu, 08 Mar 2018 08:52:03 +0800</pubDate><description><![CDATA[      冒泡排序（Bubble Sort）一种交换排序，它的基本思想是：两两比较相邻记录的关键字，如果反序则交换，直到没有反序的记录为止。      先声明一个用于排序用的顺序表结构#define MAXSIZE 10          /* 用于要排序数组个数最大值 */

typedf struct
{
    int r[MAXSIZE];         /* 用于存储要排序数组 */...]]></description><category></category></item><item><title><![CDATA[C语言之指针函数和函数指针]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79453482</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79453482</guid><author>xwt321</author><pubDate>Tue, 06 Mar 2018 15:02:21 +0800</pubDate><description><![CDATA[1.指针函数：本质是一个函数。函数返回类型是某一类型的指针       格式：类型标识符  * 函数名(参数表)       int *f(int x, int y);int *fun();
int *p;
p = fun();      当一个函数声明其返回值为一个指针时，实际上就是返回一个地址给调用函数，用于需要该指针或地址的表达式中。2.函数指针是指向函数的指针变量，即本质是一个指针变量。 ...]]></description><category></category></item><item><title><![CDATA[C语言之自动类型转换]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79455003</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79455003</guid><author>xwt321</author><pubDate>Tue, 06 Mar 2018 14:32:17 +0800</pubDate><description><![CDATA[自动转换遵循以下规则：      1）若参与运算的类型不同，则先转换成统一类型，然后进行运算。      2）转换按数据长度增加的方向进行，以保证精度不降低。如int型和long型运算时，先把int型转换成long型后再进行运算。            a.若两种类型的字节数不同，转换字节数高的类型            b.若两种类型的字节数相同，且一种有符号，一种无符号，则转换成无符号类型  ...]]></description><category></category></item><item><title><![CDATA[C语言之结构体]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79398437</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79398437</guid><author>xwt321</author><pubDate>Wed, 28 Feb 2018 17:23:54 +0800</pubDate><description><![CDATA[      结构体（struct）是由一系列相同类型或者不同类型的数据构成的数据集合，也叫结构。结构也是一种数据类型，可以使用结构变量，因此，与其他类型的变量一样，在使用结构变量时要先对其定义。定义结构变量的一般格式为：struct 结构名
{
    数据类型 变量名；
    数据类型 变量名；
    ...
}结构体变量；
结构名是结构的标识符不是变量名。构成结构的每一个类型变量称为结构成...]]></description><category></category></item><item><title><![CDATA[KEIL C51中的data、idata、xdata、code详解]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79370066</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79370066</guid><author>xwt321</author><pubDate>Sun, 25 Feb 2018 18:15:11 +0800</pubDate><description><![CDATA[      51单片机采用哈佛结构。内存空间编址有重叠。可以在不同总线上定义不同的变量。在KEIL C51中定义了xdata、idata、xdata、code几种域修饰符。这些修饰符决定了变量访问方式。      data：固定指前面0x00-0x7F的128个RAM，可以用acc直接读写，速度最快，生成的代码也最小。      idata：固定指前面0x00-0xFF的256个RAM，其中前12...]]></description><category></category></item><item><title><![CDATA[UART串口协议]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79305596</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79305596</guid><author>xwt321</author><pubDate>Sat, 10 Feb 2018 16:50:47 +0800</pubDate><description><![CDATA[      通用异步收发传输器（Universal Asynchronous Receiver/Transmitter），通常称作UATR，是一种异步收发传输器。将数据由串行通信与并行通信间做传输转换，作为并行输入称为串行输出的芯片。UART是一种通用串行数据总线，用于异步通信。该总线双向通信，可以实现全双工传输和接收。1、UART通信协议      UART作为异步串口通信协议的一种，工作原理是...]]></description><category></category></item><item><title><![CDATA[智能卡系统设计之安全体系]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79263181</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79263181</guid><author>xwt321</author><pubDate>Tue, 06 Feb 2018 09:18:01 +0800</pubDate><description><![CDATA[IC卡的安全体系是IC卡最核心的模块，高强度的安全保护也是IC卡得以迅速推广的重要原因。
1、卡片安全结构
      在IC卡，COS的安全模块分散在COS的各层次中，包括最低层的加密算法实现、系统安全服务和应用安全控制等。其中最核心的是安全服务中系统所提供的安全策略。
      卡片的安全性也就是对卡片内数据对象访问的安全控制能力，卡片中的主要数据对象是命令和文件，所以也就是对文件访问]]></description><category></category></item><item><title><![CDATA[智能卡系统设计之文件系统]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79033689</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79033689</guid><author>xwt321</author><pubDate>Tue, 30 Jan 2018 17:30:24 +0800</pubDate><description><![CDATA[智能卡由硬件资源（智能卡芯片）与卡的操作系统COS组成，COS是智能卡的灵魂，智能卡正因为有了COS才具有了“智能”。COS由于不可避免地受到了智能卡内微处理器芯片的性能及内存容量的影响，因此，在很大程度上不同于我们通常所见的微机上的操作系统。COS是一个专用系统而不是通用系统。即：一种COS一般都只能应用于特定的某种智能卡，不同卡内的COS一般是不相同的，因为COS一般都是根据某种智能卡的特点及]]></description><category></category></item><item><title><![CDATA[队列的链式存储结构]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79168534</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79168534</guid><author>xwt321</author><pubDate>Fri, 26 Jan 2018 09:57:17 +0800</pubDate><description><![CDATA[队列的链式存储结构，其实就是线性表的单链表，只不过它只能尾进头出而已，我们把它简称为链队列。为了操作上的方便，我们将队头指针指向链队列的头结点，而队尾指针指向终端结点，如下图所示：


空队列时，front和rear都指向头结点。
链队列的结构为：

typedef int QElemType;

typedef struct QNode
{
    QElemType data;
 ]]></description><category></category></item><item><title><![CDATA[栈的链式存储结构]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79164429</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79164429</guid><author>xwt321</author><pubDate>Thu, 25 Jan 2018 18:03:31 +0800</pubDate><description><![CDATA[栈的链式存储结构，简称为链栈。
      栈是栈顶来做插入和删除操作，由于单链表有头指针，而栈顶指针也是必须得，所以比较好的办法是把栈顶放在单链表的头部。因为栈顶在头部，单链表中常用的头结点也就失去了意义，通常对于链栈来说。是不需要头结点的。如下图所示：


对于空栈来说，链表原定义是头指针指向空，那么链栈的空其实就是top=NULL。
链栈的结构代码如下：

typedef st]]></description><category></category></item><item><title><![CDATA[栈的顺序存储结构]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79163390</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79163390</guid><author>xwt321</author><pubDate>Thu, 25 Jan 2018 17:00:32 +0800</pubDate><description><![CDATA[栈是限定仅在表尾进行插入和删除操作的线性表。
      我们把允许插入和删除的一端称为栈顶（top），另一端称为栈底（bottom），不含任何数据元素的栈称为空栈。栈又称为后进先出（Last In First Out）的线性表，简称LIFO结构。
      既然栈是线性表的特征，那么栈的顺序存储其实也是线性表顺序存储的简化，我们称为顺序栈。线性表是用数组来实现的，我们定义一个top变量来指]]></description><category></category></item><item><title><![CDATA[单链表的相关操作]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79157606</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79157606</guid><author>xwt321</author><pubDate>Thu, 25 Jan 2018 10:56:26 +0800</pubDate><description><![CDATA[1.单链表的读取
      在线性表的顺序存储结构中，我们计算任意一个元素的存储位置很容易。单在单链表中，由于第i个元素到底在哪？没办法一开始就知道，必须得从头开始找。获得链表第i个数据的算法思路如下：
1）声明一个结点p指向链表第一个结点，初始化j从1开始；
2）当j
3）若到链表末尾p为空，则说明第i个元素不存在；
4）否则查找成功，返回结点p的数据。
代码算法实现如下：
/*]]></description><category></category></item><item><title><![CDATA[数据结构与算法之线性表的链式存储结构]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79150645</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79150645</guid><author>xwt321</author><pubDate>Wed, 24 Jan 2018 17:15:31 +0800</pubDate><description><![CDATA[在前章中的顺序结构中，每个数据元素只需存数据元素信息就可以了，而在链式结构中，除了要存数据元素信息外，还要存储它的后继元素的存储地址。
     因此，为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系，对数据元素ai来说，除了存储其本身的信息之外，还需存储一个指示其直接后继的信息（即直接后继的存储位置）。我们把存储数据信息的域称为数据域，把存储直接后继位置的域称为指针域。指针域]]></description><category></category></item><item><title><![CDATA[数据结构与算法之线性表的顺序存储结构]]></title><link>https://blog.youkuaiyun.com/xwt321/article/details/79147673</link><guid>https://blog.youkuaiyun.com/xwt321/article/details/79147673</guid><author>xwt321</author><pubDate>Wed, 24 Jan 2018 14:27:34 +0800</pubDate><description><![CDATA[线性表（List）:零个或多个数据元素的有限序列。
      线性表的数据对象集合为{a1,a2,......,an}，每个元素的类型均为DataType。其中，除第一个元素a1外，每个元素有且只有一个直接前驱元素，除了最后一个元素an外，每个元素有且只有一个后继元素。数据元素之间的关系是一对一的关系。
      线性表的顺序存储结构，指的是用一段地址连续的存储单元依次存储线性表的数据元素]]></description><category></category></item></channel></rss>