当前位置: 首页 > news >正文

电子销售网站模板仿美团网站开发

电子销售网站模板,仿美团网站开发,线上平面设计哪家培训好,免费设计签名连笔字目录 1. 了解FreeRTOS内存管理 2. 了解内存碎片 3.了解各个heap.c的内存分配方法 1.heap1.c 2.heap2.c 3.heap3.c 4.heap4.c 5.heap5.c 总结#xff1a; 内存管理是一个系统基本组成部分#xff0c;FreeRTOS 中大量使用到了内存管理#xff0c;比如创建任务、信号量…        目录 1. 了解FreeRTOS内存管理 2. 了解内存碎片 3.了解各个heap.c的内存分配方法 1.heap1.c 2.heap2.c 3.heap3.c 4.heap4.c 5.heap5.c 总结 内存管理是一个系统基本组成部分FreeRTOS 中大量使用到了内存管理比如创建任务、信号量、队列等会自动从堆中申请内存用户应用层代码也可以 FreeRTOS 提供的内存管理函数来申请和释放内存他们是heap1~5.c下面就粗略的讲解一下他们的特性。 1. 了解FreeRTOS内存管理 FreeRTOS创建任务、队列、信号量等的时候有两种方法一种是动态的申请所需的RAM。 一种是由用户自行定义所需的 RAM这种方法也叫静态方法使用静态方法的函数一般以 “Static”结尾比如任务创建函数 xTaskCreateStatic()使用此函数创建任务的时候需要由用户定义任务堆栈本章我们不讨论这种静态方法。 使用动态内存管理的时候 FreeRTOS  内核在创建任务、队列、信号量的时候会动态的申请RAM。标准 C 库中的 malloc()和 free()也可以实现动态内存管理但是如下原因限制了其使用 ● 在小型的嵌入式系统中效率不高。 ● 会占用很多的代码空间。 ● 它们不是线程安全的。 ● 具有不确定性每次执行的时间不同。 ● 会导致内存碎片。 ● 使链接器的配置变得复杂。 不同的嵌入式系统对于内存分配和时间要求不同因此一个内存分配算法可以作为系统的可选选项。FreeRTOS 将内存分配作为移植层的一部分这样 FreeRTOS 使用者就可以使用自己的合适的内存分配方法。 当内核需要 RAM 的时候可以使用 pvPortMalloc()来替代 malloc()申请内存不使用内存的时候可以使用 vPortFree()函数来替代 free()函数释放内存。函数 pvPortMalloc()、vPortFree()与函 数 malloc() 、free()的函数原型类似。 FreeRTOS 提供了 5 种内存分配方法FreeRTOS 使用者可以其中的某一个方法或者自己的内存分配方法。这 5 种方法是 5 个文件分别为:heap_ 1.c 、heap_2.c 、heap_3.c 、heap_4.c 和 heap_5.c。这 5 个文件再 FreeRTOS 源码中路径FreeRTOS-Source-portable-MemMang  后面会详细讲解这 5 种方法有何区别。 2. 了解内存碎片 在看 FreeRTOS  的内存分配方法之前我们先来看一下什么叫做内存碎片看名字就知道是 小块的、碎片化的内存。那么内存碎片是怎么来的呢内存碎片是伴随着内存申请和释放而来 的如图所示。 (1)、此时内存堆还没有经过任何操作为全新的。 (2)、此时经过第一次内存分配一共分出去了 4 块内存块大小分别为 80B、80B 、10B 和 100B。 (3)、有些应用使用完内存进行了释放从左往右第一个 80B 和后面的 10B 这两个内存块 就是释放的内存。如果此时有个应用需要 50B 的内存那么它可以从两个地方来获取到一个 是最前面的还没被分配过的剩余内存块另一个就是刚刚释放出来的 80B 的内存块。但是很明 显刚刚释放出来的这个 10B 的内存块就没法用了除非此时有另外一个应用所需要的内存小 于 10B。 (4)、经过很多次的申请和释放以后内存块被不断的分割、最终导致大量很小的内存块 也就是图中 80B 和 50B 这两个内存块之间的小内存块这些内存块由于太小导致大多数应用无 法使用这些没法使用的内存块就沦为了内存碎片 内存碎片是内存管理算法重点解决的一个问题否则的话会导致实际可用的内存越来越少 最终应用程序因为分配不到合适的内存而奔溃FreeRTOS  的 heap_4.c 就给我们提供了一个解 决内存碎片的方法那就是将内存碎片进行合并组成一个新的可用的大内存块。 3.了解各个heap.c的内存分配方法 1.heap1.c heap_ 1 实现起来就是当需要 RAM  的时候就从一个大数组(内存堆)中分一小块出来大数组(内存堆)的容量为 configTOTAL_HEAP_SIZE上面已经说了。使用函数xPortGetFreeHeapSize() 可以获取内存堆中剩余内存大小。 注意heap1.c没有内存释放函数 heap_1 的特性如下 1、适用于那些一旦创建好任务、信号量和队列就再也不会删除的应用实际上大多数的 FreeRTOS 应用都是这样的。 2、具有可确定性(执行所花费的时间大多数都是一样的)而且不会导致内存碎片。 3、代码实现和内存分配过程都非常简单内存是从一个静态数组中分配到的也就是适合 于那些不需要动态内存分配的应用。 2.heap2.c heap_2 提供了一个更好的分配算法不像heap_ 1 那样heap_2提供了内存释放函数heap_2 不会把释放的内存块合并成一个大块这样有一个缺点随着你不断的申请内存内存堆就会被分为很多个大小不一的内存(块)也就是会导致内存碎片heap_4  提供了空闲内存块合并的功能。 heap_2 的特性如下 1、可以使用在那些可能会重复的删除任务、队列、信号量等的应用中要注意有内存碎片产生 2、如果分配和释放的内存 n 大小是随机的那么就要慎重使用了比如下面的示例       ●  如果一个应用动态的创建和删除任务而且任务需要分配的堆栈大小都是一样的那么heap_2 就非常合适。如果任务所需的堆栈大小每次都是不同那么 heap_2 就 不适合了因为这样会导致内存碎片产生最终导致任务分配不到合适的堆栈不过 heap_4 就很适合这种场景了。       ●  如果一个应用中所使用的队列存储区域每次都不同那么 heap_2 就不适合了和上面一样此时可以使用 heap_4。      ●  应用需要调用 pvPortMalloc()和 vPortFree()来申请和释放内存而不是通过其他FreeRTOS的其他 API 函数来间接的调用这种情况下 heap_2 不适合。 3、如果应用中的任务、队列、信号量和互斥信号量具有不可预料性(如所需的内存大小不能确定每次所需的内存都不相同或者说大多数情况下所需的内存都是不同的)的话可能会导致内存碎片。虽然这是小概率事件但是还是要引起我们的注意 4、具有不可确定性但是也远比标准 C 中的 malloc()和 free()效率高       heap_2 基本上可以适用于大多数的需要动态分配内存的工程中而 heap_4 更是具有将内存 碎片合并成一个大的空闲内存块(就是内存碎片回收)的功能。 3.heap3.c 这个分配方法是对标准 C 中的函数 malloc()和 free()的简单封装FreeRTOS 对这两个函数做了线程保护。 heap_3 的特性如下 1、需要编译器提供一个内存堆编译器库要提供 malloc()和 free()函数。比如使用 STM32 的话可以通过修改启动文件中的 Heap_Size 来修改内存堆的大小如图所示 2、具有不确定性 3 、可能会增加代码量。 注意在 heap_3 中 configTOTAL_HEAP_SIZE 是没用的 4.heap4.c heap_4提供了一个最优的匹配算法不像heap_2heap_4会将内存碎片合并成一个大的可用内存块它提供了内存块合并算法。内存堆为ucHeap[]大小同样为 configTOTAL_HEAP_SIZE。 可以通过函数 xPortGetFreeHeapSize()来获取剩余的内存大小。 heap_4 特性如下 1 、可以用在那些需要重复创建和删除任务、队列、信号量和互斥信号量等的应用中。 2、不会像 heap_2 那样产生严重的内存碎片即使分配的内存大小是随机的。 3、具有不确定性但是远比 C 标准库中的 malloc()和 free()效率高。 heap_4 非常适合于那些需要直接调用函数 pvPortMalloc()和 vPortFree()来申请和释放内存的应用注意我们移植 FreeRTOS 的时候就选择的 heap_4 heap_4 也使用链表结构来管理空闲内存块链表结构体与 heap_2 一样。heap_4 也定义了两个局部静态变量 xStart 和 pxEnd 来表示链表头和尾其中 pxEnd 是指向 BlockLink_t 的指针。 5.heap5.c        heap_5 使用了和 heap_4 相同的合并算法内存管理实现起来基本相同但是heap_5允许内存堆跨越多个不连续的内存段。比如STM32 的内部 RAM 可以作为内存堆但是STM32内部RAM比较小遇到那些需要大容量 RAM 的应用就不行了如音视频处理。不过 STM32 可 以外接 SRAM  甚至大容量的 SDRAM如果使用 heap_4  的话你就只能在内部 RAM  和外部 SRAM 或 SDRAM 之间二选一了使用 heap_5 的话就不存在这个问题两个都可以一起作为内存堆来用。        如果使用 heap_5 的话在调用 API 函数之前需要先调用函数vPortDefineHeapRegions()来对内存堆做初始化处理在vPortDefineHeapRegions()未执行完之前禁止调用任何可能会调用pvPortMalloc()的 API 函数比如创建任务、信号量、队列等函数。函数vPortDefineHeapRegions() 只有一个参数参数是一个 HeapRegion_t 类型的数组HeapRegion 为一个结构体此结构体在 portable.h 中有定义这里就不例出例子了。           注意数组中成员顺序按照地址从低到高的顺序排列而且最后一个成员必须使用NULL。heap_5 允许内存堆不连续说白了就是允许有多个内存堆。在 heap_2 和 heap_4 中只有一个内 存堆初始化的时候只也只需要处理一个内存堆。 heap_5 有多个内存堆这些内存堆会被连接 在一起和空闲内存块链表类似这个处理过程由函数 vPortDefineHeapRegions()完成。       使用heap_5  的时候在一开始就应该先调用函数 vPortDefineHeapRegions()完成内存堆的初始化然后才能创建任务、信号量这些东西。 //使用heap_5 的时候在开启任务调度器、创建任务、创建信号量之前一定要先 //调用函数 vPortDefineHeapRegions()初始化内存堆 vPortDefineHeapRegions((const HeapRegion_t *)xHeapRegions);       heap_5 的内存申请和释放函数和 heap_4 基本一样这里就不详细讲解了大家可以对照着前面 heap_4 的相关内容来自行分析。      至此FreeRTOS 官方提供的 5 种内存分配方法已经讲完了heap_1 最简单但是只能申请 内存不能释放。heap_2 提供了内存释放函数用户代码也可以直接调用函数 pvPortMalloc()和 vPortFree()来申请和释放内存但是 heap_2 会导致内存碎片的产生heap_3 是对标准 C 库中的 函数 malloc()和 free()的简单封装并且提供了线程保护。heap_4 相对与 heap_2 提供了内存合 并功能可以降低内存碎片的产生我们移植 FreeRTOS 的时候就选择了 heap_4 。heap_5 基本 上和 heap_4 一样只是 heap_5 支持内存堆使用不连续的内存块。 总结        heap.c虽然在使用的时候可以傻瓜式的直接无脑使用heap.4,但从heap1到heap5我们可以看到FreeRTOS对于更加有秀的内存分配方法所作出的努力从heap1只能固定格式分配、没提供内存删除函数、到heap4提供内存合并算法就像牙牙学语的婴儿逐步成长成为了巨人越来越强大。      到这里FreeRTOS的学习也告一段落FreeRTOS中的队列、信号量、列表、软件定时器、配置API函数、事件组、任务通知、延迟函数、空闲函数、优先级希望大家有学会并有所收获下面就是做实际的项目边学边练希望大家能够将FreeRTOS学到手
http://www.dnsts.com.cn/news/68818.html

相关文章:

  • 手机网站制作要求好玩的网页传奇游戏
  • 关于网站备案前置审批的相关说明 吉林怎么查询公司网站备案
  • 生鲜网站建设的项目总结网站如何后台管理
  • 网上虚拟银行注册网站怎样做淘宝客网站
  • 建一个网站大概需要多少钱太原seo网站排名优化
  • 网络推广网站制作设计中的网络系统是什么
  • 杭州网站设计建设公司资料共享的网站开发
  • 珠海网站建设杰作网络营销推广主要做什么?有哪些方法和技巧
  • 做画册好的网站城市网站建设
  • asp网站伪静态规则强化网站建设
  • wordpress 文章 数据库seo站内优化包括
  • 国外怎么做直播网站济南网站维护公司
  • centos建设网站weex做网站
  • 越南做购物网站视频号商店怎么开通
  • 乌兰察布做网站公司郑州哪家做网站便宜
  • 绍兴网站制作价格张掖市住房和城乡建设局网站
  • 网站开发工程师工作职责旅游网站设计需求分析
  • 什么物流公司网站建设帮企业建设网站保密合同
  • ps免费模板素材网站新产品宣传推广策划方案
  • 做网站导航栏目怎么做湖南住房建设厅网站
  • 免费搭建手机网站源码教育培训门户网站模板下载
  • 网站属性设置引流获客app下载
  • 如何管理网站后台肉山谷英雄传说新手任务登录英文网站怎么做
  • 网站建设人才有哪些做电影网站挣钱
  • 合肥建设局网站领导成都软件网站开发
  • 做旅行网站的依据及意义在哪个网站上做蓝思测评
  • 网站ui设计报价单深圳网站建设公司市场
  • 物流网站公司做网站花都
  • 个人可以建设哪些网站广州建设培训网站
  • 网站建设培训哪个好网站排名优化怎么做