ucos内存的动态分配
- 格式:ppt
- 大小:1.03 MB
- 文档页数:15
01、删除任务,是说任务将返回并处于(),任务的代码不再被µC/OS-II调用。
【A】休眠状态【B】等待状态【C】就绪态【D】中断状态02、任务一旦建立,这个任务就进入了()【A】睡眠状态【B】等待状态【C】就绪态【D】运行态03、µC/OS-II中,下列哪个系统函数不能够引起任务调度()【A】OSStart()【B】OS_TASK_SW()【C】OSTaskSuspend()【D】OSTaskResume()04、任务是一个无返回的无穷循环,µC/OS-II总是进入就绪态的()的任务【A】最高优先级【B】最低优先级【C】第二高优先级【D】任意优先级05、ANSI C中,可以用malloc()和free()两个函数动态地分配和释放内存,下面关于这两个函数,说法正确的是()【A】嵌入式实时操作系统中,调用这两个函数却是安全的【B】多次调用这两个函数,不会产生大量内存碎片【C】malloc()和free()函数的执行时间是确定的【D】可能使得内存无法再分配使用06、以下哪个部分不属于µC/OS-II的任务的组成部分()【A】函数【B】任务堆栈【C】任务控制块【D】线程07、当___时由运行状态转为就绪状态?()【A】任务的CPU使用权被剥夺【B】等待某一事件的运行【C】任务获得了CPU的使用权【D】任务响应中断申请08、μCOS-II操作系统不属于()。
【A】RTOS【B】抢占式实时操作系统【C】分时操作系统【D】嵌入式实时操作系统09、对于μCOS-II操作系统,以下说法不正确的是()【A】任务可以有类型说明【B】任务可以返回一个数值【C】任务可以有形参变量【D】任务是一个无限循环10、在μC/OS-II系统中,OSTimeTick()函数只被以下()函数或过程所调用。
【A】OSTickISR【B】OSShed【C】OSCtxSw【D】OSIntCtxSw11、下面临界区概念论述正确的是()【A】临界区是指进程中用于实现进程互斥的那段程序代码【B】临界区是指进程中用于实现进程同步的那段程序代码【C】临界区是指进程中用于实现进程通信的那段程序代码【D】临界区是指进程中用于访问临界资源的那段程序代码12、多道程序设计是指()。
操作系统的内存分配算法操作系统的内存管理是计算机系统中一个重要的组成部分。
内存分配算法决定了如何合理地利用系统的内存资源,以达到高效、安全、稳定的运行。
本文将介绍几种常见的内存分配算法,包括首次适应算法、循环首次适应算法、最佳适应算法以及快速适应算法。
首次适应算法(First Fit Algorithm)首次适应算法是一种简单而常见的内存分配算法。
它从内存空闲列表的头部开始寻找第一个适合分配的内存块。
当找到满足要求的内存块后,将该块划分为两部分,一部分用于分配给请求的程序,另一部分保留为剩余空闲块。
这种算法的优点是分配速度较快,缺点是可能会导致内存碎片的产生。
循环首次适应算法(Next Fit Algorithm)循环首次适应算法是首次适应算法的一种改进版本。
与首次适应算法不同的是,循环首次适应算法从上一次分配的位置开始搜索空闲块,直到找到一个满足要求的内存块为止。
这样可以避免每次都从头开始搜索,提高了查找的效率。
同样,这种算法也可能导致内存碎片的产生。
最佳适应算法(Best Fit Algorithm)最佳适应算法是为了解决内存碎片问题而提出的一种分配算法。
该算法会在内存空闲列表中查找最小且能满足要求的空闲块,并将该块分配给请求的程序。
这样可以尽量充分利用内存资源,减少内存碎片的产生。
但是,最佳适应算法的缺点是分配速度相对较慢,因为需要遍历整个内存空闲列表。
快速适应算法(Quick Fit Algorithm)快速适应算法是一种综合了首次适应算法和最佳适应算法的策略。
它将内存空闲列表分成了多个不同大小的链表,每个链表分别存储相应大小的空闲块。
当有程序请求内存时,快速适应算法会直接从对应大小的链表中查找可用的空闲块进行分配,以提高分配的速度。
这个算法在时间效率和空间效率上都较为出色,但是需要付出额外的存储开销。
总结不同的内存分配算法各有优缺点,选择合适的算法取决于具体的应用场景和系统需求。
首次适应算法和循环首次适应算法适用于内存分配需求频繁变化的场景。
ucos多任务调度的基本原理题目:ucos多任务调度的基本原理引言:在嵌入式系统中,任务调度是一个重要而复杂的问题。
为了实现多任务的并发执行,实时操作系统(RTOS)ucos提供了一种成熟而高效的多任务调度方案。
本文将介绍ucos多任务调度的基本原理,包括任务管理、任务优先级、时间片轮转和中断处理等方面,以帮助读者更好地理解和应用ucos。
一、任务管理在ucos中,任务是系统中最基本的执行单位。
ucos的任务管理分为任务创建、任务删除和任务切换几个步骤。
1. 任务创建:ucos通过函数OSTaskCreate来创建任务。
该函数包括了任务的入口函数、任务的堆栈大小和任务的优先级等参数。
在任务创建过程中,ucos为任务分配堆栈空间,并把任务插入到任务就绪表中。
2. 任务删除:当任务完成了它的工作或者不再需要执行时,可以通过函数OSTaskDel来删除任务。
任务删除时,ucos会释放任务占用的资源,并将任务从任务就绪表中移除。
二、任务优先级ucos支持任务的优先级调度,即不同优先级的任务有不同的执行顺序。
优先级越高的任务会先于优先级较低的任务执行。
1. 任务优先级范围:ucos的任务优先级范围是0到ucos最大任务数减1(通常为256)。
优先级为0的任务为最高优先级任务,优先级为ucos 最大任务数减1的任务为最低优先级任务。
2. 任务的优先级设置:任务的优先级可以在任务创建的时候通过函数OSTaskCreate来设置,也可以在运行时通过函数OSTaskChangePrio来修改。
3. 任务的优先级比较和切换:ucos将优先级比较和任务切换过程放在了任务调度中,当有多个任务就绪时,ucos会选择优先级最高的任务执行。
任务调度过程是由ucos内核中的调度器负责的。
三、时间片轮转在ucos中,为了保证不同优先级任务的公平性和实时性,采用了时间片轮转的调度算法。
1. 时间片:时间片是指任务在一次调度中执行的时间。
分配内存函数
分配内存函数是指在程序中动态地分配内存空间的函数。
在C语
言中,常用的分配内存函数有malloc、calloc、realloc等。
1. malloc函数:malloc函数的原型为void *malloc(size_t size),功能是分配size字节的内存空间,并返回该空间的起始地址。
这个函数不会对申请到的空间进行初始化。
2. calloc函数:calloc函数的原型为void *calloc(size_t nmemb, size_t size),功能是分配nmemb个元素,每个元素大小为
size字节的内存空间,并返回该空间的起始地址。
这个函数会将申请
到的空间全部初始化为0。
3. realloc函数:realloc函数的原型为void *realloc(void
*ptr, size_t size),功能是重新分配ptr指向的内存空间的大小为size字节,并返回新的空间起始地址。
如果ptr指向的空间大小不够,会开辟新的空间并将数据复制到新的空间中,如果大小足够则直接返
回原空间的地址,如果size为0则释放空间并返回NULL。
这些函数在申请内存空间时都可能导致内存分配失败,因此需要
用if判断申请空间是否成功。
例如:
```
int *p = (int*)malloc(sizeof(int)*n);
if(p == NULL){
printf("分配内存失败");
exit(1);
}
```。
c语言动态分配内存函数C语言是一门很古老但依然强大的编程语言,作为一门底层语言,C语言与内存密不可分。
在C语言中,内存分配是一个非常重要的概念。
C语言提供了很多函数来进行内存管理,其中最为常用的便是动态分配内存函数。
本文将围绕动态分配内存函数来进行分步介绍。
1. malloc函数malloc函数是C语言中最为基本的动态分配内存函数,该函数会在堆内存中分配一块指定大小的内存块,并返回该内存块的首地址。
下面是malloc函数的基本语法:void* malloc(unsigned int size);其中,size参数表示要分配的内存块的大小,函数返回一个void型指针,该指针指向已分配的内存块的首地址。
使用malloc函数的方法如下所示:int* arr = (int*)malloc(sizeof(int) * 10);该语句将在堆内存中分配一块大小为40字节(即10个int型变量所占用的内存)的内存块,并将arr指针指向该内存块的首地址。
2. calloc函数calloc函数与malloc函数类似,也是用于动态分配内存的函数。
但与malloc函数不同的是,calloc函数还会对分配的内存块进行初始化。
同时,calloc函数的语法也略有不同:void* calloc(unsigned int num, unsigned int size);其中,num参数表示要分配的内存块的数量,size参数则表示每个内存块的大小。
使用calloc函数的方式如下所示:int* arr = (int*)calloc(10, sizeof(int));该语句将在堆内存中分配一块大小为40字节(即10个int型变量所占用的内存)的内存块,并将该内存块中每个字节都初始化为0,并将arr指针指向该内存块的首地址。
3. realloc函数realloc函数是用于重新分配已经分配的内存块的函数。
该函数接受两个参数,第一个参数是原内存块的地址,第二个参数是新的内存块大小。
动态分区分配算法动态分区分配算法是在计算机内存管理中使用的一种内存分配策略。
在动态分区分配算法下,内存被划分为多个大小不一的分区,每个分区可以用来存储不同大小的进程。
当一个进程需要内存时,系统会选择一个合适的分区来满足其需求。
动态分区分配算法有多种实现方式,常用的包括最先适应算法、最佳适应算法和最坏适应算法。
最先适应算法(First Fit)是最简单和最常用的动态分区分配算法之一、该算法从内存起始位置开始查找合适的分区,一旦找到一个大小大于等于所需内存大小的空闲分区,就将该进程分配给这个分区并将分区大小减去所需内存大小。
这种算法的优点是实现简单、分区利用率高,但它可能会导致较小的分区被浪费掉,从而导致外部碎片的产生。
最佳适应算法(Best Fit)是另一种常用的动态分区分配算法。
该算法从所有空闲分区中选择一个大小最适合所需内存大小的分区来分配。
相比于最先适应算法,最佳适应算法能够更好地利用内存分区,减少外部碎片的产生。
然而,该算法的实现相对复杂,并且容易产生许多较小的空闲分区,导致分区利用率降低。
最坏适应算法(Worst Fit)是另一种动态分区分配算法。
该算法选择一个大小最大的空闲分区来分配给进程,这样可以留下更多较小的空闲分区,以备将来的进程使用。
然而,最坏适应算法可能会导致较大的分区被浪费掉,从而导致外部碎片的产生。
同样,该算法的实现也相对复杂,并且分区利用率相对较低。
动态分区分配算法的选择取决于特定的应用和场景。
最先适应算法在分配速度和分区利用率方面可能更优,但可能会产生较多的外部碎片。
最佳适应算法能够更好地利用内存分区,但实现复杂,容易产生较小的空闲分区。
最坏适应算法留下较小的空闲分区,但分区利用率较低。
因此,在选择动态分区分配算法时,需要权衡这些因素,并根据特定需求进行选择。
动态分区分配算法在现代操作系统中起着重要的作用,可以有效管理内存资源,提高系统的性能和效率。
同时,动态分区分配算法也是操作系统中的一个重要研究领域,不断有新的技术和算法被提出来优化内存管理,满足日益复杂的应用需求。
动态分区分配算法动态分区分配算法是计算机在处理大型计算问题时分配内存的一种算法。
它由英国计算机科学家考克·拉伦斯(C. Alan Rees)和美国计算机科学家杰弗里·布朗(Geoffrey Brown)于1959年提出,发展到今天,仍然是当前计算机内存管理中应用最为广泛的算法之一。
据统计,它在数据处理和科学计算中应用最为广泛,比例达到90%以上。
动态分区分配算法建立在虚拟存储器系统于单一空间中的理论上,它会将虚拟存储器空间分割成多个区块,即所谓的“分区”,在这些“分区”中每一个“分区”被认为是一个独立的内存块,它可以被视作内存的一个物理分割实体。
确定分区个数以及每个分区的大小,称为分区的方法的决定步骤。
分区的决定步骤有固定分区、可变分区和动态分区等。
固定分区分配法要求在系统安装前确定程序分区的规模,在整个运行期间该规模是不变的,因此片面此法解决不了内存非连续性的问题。
可变分区分配法将内存空间分割成几个大小不等的可变尺寸的分区,这种算法的原理还是以空间的划分为两个分区,它有效解决了内存空间划分的非连续性问题,但受到固定分区的分配量的限制,因此它的可扩大性也有所限制。
动态分区分配算法可以根据运行时不断地选择最终分区的大小,以获得最优的内存分配方案,它扩展了计算机系统中内存空间的使用,同时能够满足多台机器大型程序精确分配内存大小的要求,它可以更好地充分利用计算机系统中的内存。
动态分区分配算法是一种比较强大的算法,它能够根据实际情况提供充分利用空间的储存形式,处理实时物理系统的大型问题,并在很大的程度上提高了工作效率,节约价值,以及满足多台机器大型软件应用程序的需要。
ucosiii操作系统工作原理ucosiii是一个实时嵌入式操作系统,它的工作原理是基于任务管理和时间管理。
本文将从任务管理、时间管理等方面详细介绍ucosiii的工作原理。
一、任务管理ucosiii通过任务管理来实现多任务的并行执行。
在ucosiii中,每个任务都是一个独立的执行单元,具有自己的任务控制块(TCB)。
任务控制块中保存了任务的状态、堆栈指针和优先级等信息。
ucosiii通过任务调度器来决定哪个任务获得执行权。
在ucosiii中,任务的优先级决定了任务的执行顺序。
优先级高的任务具有更高的执行优先级,优先级低的任务具有较低的执行优先级。
ucosiii采用优先级抢占式调度算法,当一个优先级更高的任务就绪时,ucosiii会暂停当前任务的执行,切换到优先级更高的任务执行。
二、时间管理ucosiii通过时间管理来实现任务的调度和时间的划分。
在ucosiii 中,时间被划分为时间片和时间延迟。
时间片是指每个任务获得的最大执行时间。
当一个任务的时间片用完后,ucosiii会暂停该任务的执行,切换到下一个任务执行。
时间片的大小可以根据任务的需求和系统性能进行调整。
时间延迟是指任务在执行过程中需要暂停一段时间。
ucosiii提供了延迟函数来实现时间延迟。
任务可以使用延迟函数来暂停自己的执行,等待一段时间后再继续执行。
ucosiii通过定时器来实现延迟函数的功能。
三、任务间通信ucosiii提供了一系列的同步和通信机制来实现任务间的数据传递和协作。
其中最常用的机制是信号量和消息队列。
信号量是一种计数器,用来控制对共享资源的访问。
任务可以使用信号量来同步对共享资源的访问,避免资源竞争和冲突。
消息队列是一种用来存储和传递消息的缓冲区。
任务可以使用消息队列来发送和接收消息,实现任务间的数据传递和通信。
ucosiii还提供了其他的同步和通信机制,如互斥锁、事件标志组和邮箱等,可以根据具体的需求选择合适的机制。
c语言中内存分配的几种方式
在C语言中,内存的管理是非常重要的。
C语言提供了多种内存分配的方式,可以根据不同情况选择不同的方式进行内存分配。
以下是C语言中内存分配的几种方式。
1. 静态内存分配
静态内存分配是在程序编译时就确定了内存的大小和分配位置,这种方式不需要在程序运行时进行内存分配。
在C语言中,静态内存分配可以通过定义全局变量或静态变量来实现。
2. 栈内存分配
栈内存分配是指在函数内部定义的变量所分配的内存。
当函数被调用时,栈被分配一段内存用来存储函数的局部变量,当函数返回时,这段内存会被释放。
栈内存分配的好处是速度快,但是分配的内存大小受限于栈的大小。
3. 堆内存分配
堆内存分配是指程序在运行时通过malloc()函数或calloc()函数动态分配内存。
堆内存的好处是大小灵活,但是需要手动释放,否则容易出现内存泄漏的问题。
4. 内存映射文件
内存映射文件是指将一个文件映射到内存中,使得程序可以直接访问文件中的数据。
在C语言中,可以使用mmap()函数将文件映射到内存中。
总结
在C语言中,内存的管理是非常重要的。
根据不同的情况可以选择不同的内存分配方式,如静态内存分配、栈内存分配、堆内存分配和内存映射文件等。
合理的内存管理可以提高程序的性能和稳定性。
0 引言μC/OS是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。
μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean brosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的BBS上。
μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。
CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。
用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。
μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至 2KB 。
μC/OS-II 已经移植到了几乎所有知名的CPU 上。
严格地说μC/OS-Ⅱ只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。
没有提供输入输出管理,文件系统,网络等额外的服务。
但由于μC/OS-Ⅱ良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
μC/OS-Ⅱ目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。
1.任务管理μC/OS-Ⅱ中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级,63为最低级。
系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。
μC/OS-Ⅱ提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。
系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu 的利用率。
UCOSII实验1-任务调度 ·UCOSII 是⼀个可以基于 ROM 运⾏的、可裁减的、抢占式、实时多任务内核,具有⾼度可移植性,特别适合于微处理器和控制器。
·为了提供最好的移植性能, UCOSII 最⼤程度上使⽤ ANSI C 语⾔进⾏开发,并且已经移植到近 40 多种处理器体系上,涵盖了从 8 位到 64 位各种 CPU(包括 DSP)。
·UCOSII 具有执⾏效率⾼、占⽤空间⼩、实时性能优良和可扩展性强等特点,最⼩内核可编译⾄ 2KB 。
UCOSII 已经移植到了⼏乎所有知名的 CPU 上。
UCOSII体系结构图:UCOSII 的移植,我们只需要修改: os_cpu.h、 os_cpu_a.asm 和 os_cpu.c等三个⽂件即可: ① os_cpu.h,进⾏数据类型的定义,以及处理器相关代码和⼏个函数原型; ② os_cpu_a.asm,是移植过程中需要汇编完成的⼀些函数,主要就是任务切换函数; ③ os_cpu.c,定义⼀些⽤户 HOOK 函数。
图中定时器的作⽤是为 UCOSII 提供系统时钟节拍,实现任务切换和任务延时等功能。
这个时钟节拍由 OS_TICKS_PER_SEC(在os_cfg.h 中定义)设置,⼀般我们设置 UCOSII 的系统时钟节拍为 1ms~100ms,具体根据你所⽤处理器和使⽤需要来设置。
对于STM32的单⽚机⼀般⽤其 SYSTICK 定时器来为 UCOSII 提供时钟节拍。
UCOSII的任务优先级 · UCOSII 保留了最⾼ 4 个优先级和最低 4 个优先级的总共 8 个任务,⽤于拓展使⽤; · UCOSII ⼀般只占⽤了最低 2 个优先级,分别⽤于空闲任务(倒数第⼀)和统计任务(倒数第⼆),所以剩下给我们使⽤的任务最多可达 255-2=253 个(V2.91)。
任务 · 所谓的任务,其实就是⼀个死循环函数,该函数实现⼀定的功能,⼀个⼯程可以有很多这样的任务(最多 255 个), UCOSII 对这些任务进⾏调度管理,让这些任务可以并发⼯作(注意不是同时⼯作!!,并发只是各任务轮流占⽤ CPU,⽽不是同时占⽤,任何时候还是只有 1 个任务能够占⽤ CPU),这就是 UCOSII 最基本的功能。
ucos(⼀)ucos系统简介⼀、概述 µC/OS-II由Micrium公司提供,是⼀个可移植、可固化的、可裁剪的、占先式多任务实时内核,它适⽤于多种微处理器,微控制器和数字处理芯⽚(已经移植到超过100种以上的微处理器应⽤中)。
同时,该系统源代码开放、整洁、⼀致,注释详尽,适合系统开发。
µC/OS-II已经通过联邦航空局(FAA)商⽤航⾏器认证,符合航空⽆线电技术委员会(RTCA)DO-178B标准。
现在最新版的是µC/OS-III。
⼆、性质µC/OS-II被⼴泛应⽤于微处理器、微控制器和数字信号处理器。
µC/OS-II 的前⾝是µC/OS,最早出⾃于1992 年美国嵌⼊式系统专家Jean brosse 在《嵌⼊式系统编程》杂志的5 ⽉和6 ⽉刊上刊登的⽂章连载,并把µC/OS 的源码发布在该杂志的B B S 上。
µC/OS 和µC/OS-II 是专门为计算机的嵌⼊式应⽤设计的,绝⼤部分代码是⽤C语⾔编写的。
CPU 硬件相关部分是⽤汇编语⾔编写的、总量约200⾏的汇编语⾔部分被压缩到最低限度,为的是便于移植到任何⼀种其它的CPU 上。
⽤户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件⼯具,就可以将µC/OS-II嵌⼊到开发的产品中。
µC/OS-II 具有执⾏效率⾼、占⽤空间⼩、实时性能优良和可扩展性强等特点,最⼩内核可编译⾄ 2KB 。
µC/OS-II 已经移植到了⼏乎所有知名的CPU 上。
严格地说uC/OS-II只是⼀个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。
没有提供输⼊输出管理,⽂件系统,⽹络等额外的服务。
但由于uC/OS-II良好的可扩展性和源码开放,这些⾮必须的功能完全可以由⽤户⾃⼰根据需要分别实现。
1,模拟堆栈2,可重入函数“可重入函数可以被一个以上的任务调用,而不必担心数据被破坏。
可重入函数任何时候都可以被中断,一段时间以后又可以运行,而相应的数据不会丢失。
”(摘自嵌入式实时操作系统uC/OSII)KeilC51下,默认时函数时不支持重入,但uC/OSII操作系统中的函数是可重入的,那么如何让函数成为可重入函数呢?C51编译器采用了一个扩展关键字reentrant作为定义函数时的选项,需要将一个函数定义为可重入函数时,只要在函数后面加上关键字reentrant即可。
例: void task1(void) reentrant3,局部变量的分配。
局部变量分配在RAM中:一种是固定分配:由编译器给定固定地址;一种是动态分配的:由编译器预分配大小,给合动态堆指针计算出实际动态地址。
KeilC51下默认情况下变量都是固定分配,由编译器编译时自动分配变量的空间,确保不会被覆盖,这种变量是不可重入的。
如下:KeilC51 中函数后面加上关键字reentrant这种情况下,函数内部的局部变量会动态计算地址。
如下:预分配地址+?C_IBP内容,得到实际地址。
rx_buffer2 地址是:编译器预分配rx_buffer2,向下分配RAM大小50,则指向0xCE,(0-0x32=0xCE)结合C_IBP内容,动态算出了结果(C_IBP开始时为0),然后C_IBP为0xCE,用于下个变量申请。
函数返时,在释放rx_buffer2空间,如下,C_IBP+0x32=0;4,KeilC51 移植 UCOS时的系统堆栈SP与模拟堆栈 ?C_IBP、?C_PBP、?C_XBP C51 的SP指针为8位寻址,即最大256个字节,向上压栈,而UCOS占用的RAM比较多,51中一般都选XDATA,即16位的寻址, 模拟的栈,变量放在64K区域,此时系统POP PUSH的指令无法访问。
在51中UCOS由系统栈,模拟堆栈共同运作实现任务的切换。
UCGUI的动态内存分配的原理了解UCGUI的朋友,一定知道UCGUI中的窗口体系,窗口一般都是由程序动态创建的,那么这当中当然要用到动态的内存申请,现在我们就来就这个话题进行深入分析,了解UCGUI中的动态内存分配,是了解其窗口体系统的基础,这一点非常的重要。
先说明一下本文中用到的一些关键下词:[内存分配信息节点]------------记录一块已分配内存块信息的tBlock结构体,可简称分配节点。
[内存分配信息节点数组]--------内存分配信息节点的数组。
[内存句柄]-------------------是指分配内存块数组中的元素位置索引值。
[最小粒度对齐]---------------是指内存分配大小应该为最小粒度的整数倍。
一、打开动态分配的预定义选项在GUIConf.h配制文件当中,有这样一个定义。
#define GUI_ALLOC_SIZE 12500 /* Size of dynamic memory ... For WM and memorydevices*/GUI_ALLOC_SIZE定义的即是整个UCGUI中可用于动态分配的内存大小,这个大小且不能为0,也只有当这个预定义打开后,才能使用UCGUI提供的动态内存分配的功能在GUIAlloc.c文件中提供。
二、动态内存分配的基本功能在GUI.h中一段提供了如下一段定义,即:/*********************************************************************** Dynamic memory management************************************************************************/#if !defined(GUI_ALLOC_ALLOC)void GUI_ALLOC_Init(void);void* GUI_ALLOC_h2p (GUI_HMEM hMem);void GUI_ALLOC_Free (GUI_HMEM hMem);void GUI_ALLOC_FreePtr (GUI_HMEM *phMem);GUI_HMEM GUI_ALLOC_Alloc(int size);/* diagnostics */int GUI_ALLOC_GetUsed(void);int GUI_ALLOC_GetNumFreeBytes(void);int GUI_ALLOC_GetMaxSize(void);/* macros */#define GUI_ALLOC_ALLOC(size) GUI_ALLOC_Alloc(size)#define GUI_ALLOC_H2P(h) GUI_ALLOC_h2p(h)#define GUI_ALLOC_FREE(handle) GUI_ALLOC_Free(handle)#define GUI_ALLOC_LOCK(handle) GUI_ALLOC_h2p(handle)#define GUI_ALLOC_UNLOCK(handle)#endif总的来说,动态内存分配提供了如下几组功能:1,动态内存初始化。