- 博客(221)
- 资源 (1)
- 收藏
- 关注
原创 NAND_flash和NOR_flash区别(最详细)
NAND flash和NOR flash详解 NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。但是经过了十多年之后,仍然有相当多的
2017-05-29 22:25:32
3429
转载 简单理解Socket及TCP/IP、Http、Socket的区别
目录(?)[+]题外话前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人;但主要是因为这段时间一直在看HTML5的东西,看到web socket时觉得很有意思,动手写几个demo,但web socket需要特定的服务器支持,由于标准制定工作还没完成,所以没有多少主流的服务器支持,自己在网上下载了几个实现,包括P
2017-05-22 17:01:55
379
转载 0520
时间复杂度和空间复杂度详解算法的时间复杂度和空间复杂度合称为算法的复杂度。1.时间复杂度(1)时间频度 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。
2017-05-20 23:14:57
356
原创 0519
OSTickISR()在9.03.05节中,我们已经提到过实时系统中时钟节拍发生频率的问题,应该在10到100Hz之间。但由于PC环境的特殊性,时钟节拍由硬件产生,间隔54.93ms (18.20648Hz)。我们将时钟节拍频率设为200Hz。PC时钟节拍的中断向量为0x08,µC/OS-II将此向量截取,指向了µC/OS的中断服务函数OSTickISR(),而原先的中断向量保
2017-05-19 12:09:35
245
原创 0518
OSIntCtxSw()在µC/OS-II中,由于中断的产生可能会引起任务切换,在中断服务程序的最后会调用OSIntExit()函数检查任务就绪状态,如果需要进行任务切换,将调用OSIntCtxSw()。所以OSIntCtxSw()又称为中断级的任务切换函数。由于在调用OSIntCtxSw()之前已经发生了中断,OSIntCtxSw()将默认CPU寄存器已经保存在被中断任务的堆
2017-05-18 11:51:42
220
原创 0517
OSCtxSw()OSCtxSw()是一个任务级的任务切换函数(在任务中调用,区别于在中断程序中调用的OSIntCtxSw())。在80x86系统上,它通过执行一条软中断的指令来实现任务切换。软中断向量指向OSCtxSw()。在µC/OS-II中,如果任务调用了某个函数,而该函数的执行结果可能造成系统任务重新调度(例如试图唤醒了一个优先级更高的任务),则在函数的末尾会调用OSSch
2017-05-17 21:53:13
307
原创 0516
OSStartHighRdy()µC/OS-II 的移植需要用户改写OS_CPU_A.ASM中的四个函数: OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR()该函数由SStart()函数调用,功能是运行优先级最高的就绪任务,在调用OSStart()之前,用户必须先调用OSInit(),并且已
2017-05-16 19:52:27
410
转载 0515
希尔排序算法定义: 希尔排序是插入排序的一种,也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。算法思想: 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰好被分为一组,算法终止。 时间复杂度:
2017-05-15 15:10:28
210
转载 0514
数据结构和算法什么是数据结构概念官方定义:数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的学科。我的理解:程序设计 = 数据结构 + 算法数据结构,顾名思义,就是数据之间的结构关系,或者理解成数据元素相互之间存在的一种或多种特定关系的集合。当然这些概念都是大学喜欢考的,我们没必要纠结于这个概念,
2017-05-14 17:18:40
509
原创 0513
OS_CPU.H数据类型 由于不同的处理器有不同的字长,µC/OS-II的移植需要重新定义一系列的数据结构。使用Borland C/C++编译器,整数(int)类型数据为16位,长整形(long)为32位。为了读者方便起见,尽管µC/OS-II中没有用到浮点类型的数,在源代码中笔者还是提供了浮点类型的定义。 由于在80x86实模式中堆栈都是按字进行操作的,没有字节操作,
2017-05-13 14:17:08
193
原创 0512
OS_CPU.H文件OS_CPU.H 文件中包含与处理器相关的常量,宏和结构体的定义。程序清单L9.2是为80x86编写的OS_CPU.H文件的内容。 程序清单L 9.2 OS_CPU.H. #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern
2017-05-12 14:13:39
218
原创 0511
开发工具,目录和文件,INCLUDES.H文件开发工具 笔者采用的是Borland C/C++ V3.1和Borland Turbo Assembler汇编器完成程序的移植和测试,它可以产生可重入的代码,同时支持在C程序中嵌入汇编语句。编译完成后,程序可在PC机上运行。本书代码的测试是在一台Pentium-II计算机上完成的,操作系统是Microsoft Windows 95
2017-05-11 20:16:43
393
原创 0510
µC/OS-II在80x86上的移植本章将介绍如何将µC/OS-II移植到Intel 80x86系列CPU上,本章所介绍的移植和代码都是针对80x86的实模式的,且编译器在大模式下编译和连接。本章的内容同样适用于下述CPU: 80186 80286 80386 80486 Pentium Pentium II 实际上,将要介绍的移植过程
2017-05-10 12:21:55
230
原创 0509
OSTimeTickHook()void OSTimeTickHook(void) File Called from Code enabled by OS_CPU_C.C OSTimeTick() OS_CPU_HOOKS_EN 只要发生时钟节拍,该函数就会被OSTimeTick()调用。一旦进入OSTimeTick()就会马
2017-05-09 12:03:21
209
原创 0508
OSTaskStatHook()void OSTaskStatHook(void) File Called from Code enabled by OS_CPU_C.C OSTaskStat() OS_CPU_HOOKS_EN 该函数每秒钟都会被µC/OS-Ⅱ的统计任务调用。OSTaskStatHook()允许用户加入自己的
2017-05-08 22:06:42
232
原创 0507
OSTaskSwHook()void OSTaskSwHook(void) File Called from Code enabled by OS_CPU_C.C OSCtxSw() and OSIntCtxSw() OS_CPU_HOOKS_EN 当执行任务切换时都会调用该函数。全局变量OSTCBHighRdy
2017-05-07 12:06:34
279
原创 0506
OSTaskDelHook()void OSTaskDelHook(OS_TCB *ptcb) File Called from Code enabled by OS_CPU_C.C OSTaskDel() OS_CPU_HOOKS_EN 当用户通过调用OSTaskDel()来删除任务时都会调用该函数。这样用户就可以处理OSTask
2017-05-06 14:12:42
251
原创 0505
OSTaskCreateHook()void OSTaskCreateHook(OS_TCB *ptcb) File Called from Code enabled by OS_CPU_C.C OSTaskCreate() and OSTaskCreateExt() OS_CPU_HOOKS_EN 无论何时建立任务,
2017-05-05 12:30:29
334
原创 0504
CS和BS1.什么是C/S结构C/S (Client/Server)结构,即客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。C/S结构可以看做是胖客户端架构。客户端实现绝大多数的业务逻辑处理和界面展示,作为客户端的部分需要承受很大的压力,从分利用客户端的资源,对客户机的要
2017-05-04 13:24:36
340
原创 0503
打地鼠TR0=1; while(1) { //开启定时器0 Temp1 = SONG[Addr++]; if (Temp1 == 0xFF) //休止符 { } else if (Temp1 == 0x00) //歌曲结束符 { TR0=0; return; //关闭定时器0 TR0 = 0; delayus(100); //关闭定时器0 } else { } } //正常播放歌曲 Tem
2017-05-03 15:58:20
228
原创 0502
OSTaskCreateHook(),OSTaskDelHook(),OSTaskSwHook(),OSTaskStatHook(),OSTimeTickHook()当用OSTaskCreate()或OSTaskCreateExt()建立任务的时候就会调用OSTaskCreateHook()。该函数允许用户或使用用户的移植实例的用户扩展µC/OS-Ⅱ的功能。当µC/OS-Ⅱ设置完了
2017-05-02 13:11:39
222
原创 0501
OS_CPU_C.CµC/OS-Ⅱ的移植实例要求用户编写六个简单的C函数: OSTaskStkInit() OSTaskCreateHook() OSTaskDelHook() OSTaskSwHook() OSTaskStatHook() OSTim
2017-05-01 18:25:19
206
原创 0430
OS_CPU_A.ASMµC/OS-Ⅱ的移植实例要求用户编写四个简单的汇编语言函数: OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR() 如果用户的编译器支持插入汇编语言代码的话,用户就可以将所有与处理器相关的代码放到OS_C
2017-04-30 15:40:09
349
原创 0429
OS_CPU.HOS_CPU.H包括了用#defines定义的与处理器相关的常量,宏和类型定义。OS_CPU.H的大体结构如程序清单 L8.1所示。 程序清单 L 8.1 OS_CPU.H. #ifdef OS_CPU_GLOBALS #define OS_CPU_EXT #else #define OS_CPU_EXT extern #e
2017-04-29 13:48:00
181
原创 0428
移植µC/OS-Ⅱ这一章介绍如何将µC/OS-Ⅱ移植到不同的处理器上。所谓移植,就是使一个实时内核能在某个微处理器或微控制器上运行。为了方便移植,大部分的µC/OS-Ⅱ代码是用C语言写的;但仍需要用C和汇编语言写一些与处理器相关的代码,这是因为µC/OS-Ⅱ在读写处理器寄存器时只能通过汇编语言来实现。由于µC/OS-Ⅱ在设计时就已经充分考虑了可移植性,所以µC/OS-Ⅱ的移植相
2017-04-28 12:25:03
325
原创 0427
等待一个内存块有时候,在内存分区暂时没有可用的空闲内存块的情况下,让一个申请内存块的任务等待也是有用的。但是,µC/OS-II本身在内存管理上并不支持这项功能。如果确实需要,则可以通过为特定内存分区增加信号量的方法,实现这种功能(见6.05节,信号量)。应用程序为了申请分配内存块,首先要得到一个相应的信号量,然后才能调用OSMemGet()函数。整个过程见程序清单 L7.9。
2017-04-27 15:34:52
186
原创 0426
Using Memory Partitions图 F7.5是一个演示如何使用µC/OS-II中的动态分配内存功能,以及利用它进行消息传递[见第6章]的例子。程序清单 L7.8是这个例子中两个任务的示意代码,其中一些重要代码的标号和图 F7.5中括号内用数字标识的动作是相对应的。 第一个任务读取并检查模拟输入量的值(如气压、温度、电压等),如果其超过了一定的阈值,就向第二个
2017-04-26 10:59:39
181
原创 0425
查询一个内存分区的状态,OSMemQuery()在µC/OS-II 中,可以使用OSMemQuery()函数来查询一个特定内存分区的有关消息。通过该函数可以知道特定内存分区中内存块的大小、可用内存块数和正在使用的内存块数等信息。所有这些信息都放在一个叫OS_MEM_DATA的数据结构中,如程序清单 L7.6。 程序清单 L7.6 OS_MEM_DATA数据结构
2017-04-25 17:10:07
307
原创 0424
释放一个内存块,OSMemPut()当用户应用程序不再使用一个内存块时,必须及时地把它释放并放回到相应的内存分区中。这个操作由OSMemPut()函数完成。必须注意的是,OSMemPut()并不知道一个内存块是属于哪个内存分区的。例如,用户任务从一个包含32字节内存块的分区中分配了一个内存块,用完后,把它返还给了一个包含120字节内存块的内存分区。当用户应用程序下一次申请120字节
2017-04-24 10:59:54
241
原创 0423
分配一个内存块,OSMemGet()图 F7.4是OSMemCreate()函数完成后,内存控制块及对应的内存分区和分区内的内存块之间的关系。在程序运行期间,经过多次的内存分配和释放后,同一分区内的各内存块之间的链接顺序会发生很大的变化。 应用程序可以调用OSMemGet()函数从已经建立的内存分区中申请一个内存块。该函数的唯一参数是指向特定内存分区的指针,该指针在建立内
2017-04-23 18:43:52
195
原创 0422
建立一个内存分区,OSMemCreate()在使用一个内存分区之前,必须先建立该内存分区。这个操作可以通过调用OSMemCreate()函数来完成。程序清单 L7.2说明了如何建立一个含有100个内存块、每个内存块32字节的内存分区。 程序清单 L7.2 建立一个内存分区 OS_MEM *CommTxBuf; INT8U CommTxPart[100
2017-04-22 13:49:18
187
原创 0421
内存管理我们知道,在ANSI C中可以用malloc()和free()两个函数动态地分配内存和释放内存。但是,在嵌入式实时操作系统中,多次这样做会把原来很大的一块连续内存区域,逐渐地分割成许多非常小而且彼此又不相邻的内存区域,也就是内存碎片。由于这些碎片的大量存在,使得程序到后来连非常小的内存也分配不到。在4.02节的任务堆栈中,我们讲到过用malloc()函数来分配堆栈时,曾
2017-04-21 16:47:59
228
原创 0420
使用一个消息队列作为计数信号量在消息队列初始化时,可以将消息队列中的多个指针设为非NULL值(如void* 1),来实现计数信号量的功能。这里,初始化为非NULL值的指针数就是可用的资源数。系统中的任务可以通过OSQPend()来请求“信号量”,然后通过调用OSQPost()来释放“信号量”,如程序清单 L6.28。如果系统中只使用了计数信号量和消息队列,使用这种方法可以有效地节省
2017-04-20 10:35:45
183
原创 0419
使用消息队列读取模拟量的值在控制系统中,经常要频繁地读取模拟量的值。这时,可以先建立一个定时任务OSTimeDly() [见5.00节,延时一个任务,OSTimeDly()],并且给出希望的抽样周期。然后,如图 F6.11所示,让A/D采样的任务从一个消息队列中等待消息。该程序最长的等待时间就是抽样周期。当没有其它任务向该消息队列中发送消息时,A/D采样任务因为等待超时而退出等
2017-04-19 15:58:40
176
原创 0418
查询一个消息队列的状态,OSQQuery()OSQQuery()函数使用户可以查询一个消息队列的当前状态。程序清单 L6.27是该函数的源代码。OSQQuery()需要两个参数:一个是指向消息队列的指针pevent。它是在建立一个消息队列时,由OSQCreate()函数返回的;另一个是指向OS_Q_DATA(见uCOS_II.H)数据结构的指针pdata。该结构包含了有关消息队列的
2017-04-18 14:26:40
209
原创 0417
清空一个消息队列, OSQFlush()OSQFlush()函数允许用户删除一个消息队列中的所有消息,重新开始使用。程序清单 L6.26是该函数的源代码。和前面的其它函数一样,该函数首先检查pevent指针是否是执行一个消息队列[L6.26(1)],然后将队列的插入指针和取出指针复位,使它们都指向队列起始单元,同时,将队列中的消息数设为0 [L6.26(2)]。这里,没有检查该消息
2017-04-17 14:35:04
157
原创 0416
无等待地从一个消息队列中取得消息, OSQAccept()如果试图从消息队列中取出一条消息,而此时消息队列又为空时,也可以不让调用任务等待而直接返回调用函数。这个操作可以调用OSQAccept()函数来完成。程序清单 L6.25是该函数的源代码。OSQAccept()函数首先查看pevent指向的事件控制块是否是由OSQCreate()函数建立的[L6.25(1)],然后它检查当前
2017-04-16 12:08:32
212
原创 0415
向消息队列发送一个消息(后进先出LIFO),OSQPostFront()OSQPostFront()函数和OSQPost()基本上是一样的,只是在插入新的消息到消息队列中时,使用.OSQOut作为指向下一个插入消息的单元的指针,而不是.OSQIn。程序清单 L6.24是它的源代码。值得注意的是,.OSQOut指针指向的是已经插入了消息指针的单元,所以再插入新的消息指针前,必须先将.
2017-04-15 22:12:21
181
原创 0414
向消息队列发送一个消息(FIFO),OSQPost()程序清单 L6.23是OSQPost()函数的源代码。在确认事件控制块是消息队列后 [L6.23(1)],OSQPost()函数检查是否有任务在等待该消息队列中的消息[L6.23(2)]。当事件控制块的.OSEventGrp域为非0值时,说明该消息队列的等待任务列表中有任务。这时,调用OSEventTaskRdy()函数 [见6
2017-04-14 15:57:12
234
原创 0413
等待一个消息队列中的消息,OSQPend()程序清单 L6.22是OSQPend()函数的源代码。OSQPend()函数首先检查事件控制块是否是由OSQCreate()函数建立的[L6.22(1)],接着,该函数检查消息队列中是否有消息可用(即.OSQEntries是否大于0)[L6.22(2)]。如果有,OSQPend()函数将指向消息的指针复制到msg变量中,并让.OSQOut
2017-04-13 13:52:01
205
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人