首页 > 编程知识 正文

centos7忘记root密码的解决办法(centos重置root密码命令)

时间:2023-05-04 13:24:17 阅读:74564 作者:3945

内容引导:

第一篇文章介绍了任务的三个元素:任务控制块、任务栈和任务门户函数,并讨论了创建RTOS任务门户函数时的三个重要注意事项。

RTOS内功修炼记(一) ——任务到底该怎么写? 第二篇文章从任务如何切换开始,引出RTOS内核中的准备列表、优先级表,不断揭开RTOS内核优先级优先级调度方法的神秘面纱。

RTOS内功修炼记(二) ——优先权优先权优先权优先权优先权优先权时间表到底是怎么回事? 第三篇文章介绍了RTOS内核如何管理中断。 用户应该如何创建中断处理函数? 用户如何设置临界段?

RTOS内功修炼记(三) ——内核到底是如何管理中断的? 第四篇文章介绍了RTOS内核中的所有时间相关内容,包括时钟管理、时间管理、任务延迟机制、空闲任务、软件计时器和时间片调度。

RTOS内功修炼记(四) ——的小时钟节奏,支撑了半边天! 第五篇文章论述了RTOS内核中各种任务同步量的实现。 种类繁多,但万不离其宗的,一是pend-post机制,而不是全局变量。

RTOS内功修炼记(五) ——任务同步机制的实现,万无一失其宗! 第六篇文章介绍了用于任务间通信的核心对象的实现。 主要有消息队列和优先级消息队列、邮箱队列和优先级邮箱队列四种。

RTOS内功修炼记(六) ——任务间通信为什么不使用全局变量?建议先阅读上文,对RTOS内核的抢占式调度机制和时间片调度机制、RTOS内核对中断的处理机制与裸机的不同之处、RTOS中任务延时的机制、pend-post机制理解之后,再阅读本文也不迟。

1 .知识点回顾1.1 .静态内存uint8_t buffer[128]; 当你自觉地写这一行代码时,你使用了128字节的静态内存,buffer的空间意味着编译器静态地分配给堆栈,而且在程序运行过程中,buffer的大小不会改变,这叫做静态内存

1.2 .动态内存void *buffer_ptr=NULL; buffer_ptr=malloc(128*sizeof ) uint8_t ); 自觉时写下这一行代码,就意味着你使用了128字节的动态内存。 buffer可以在程序运行时从堆中分配指定大小的空间,不使用时使用free释放并返回堆空间。

2. RTOS中的动态内存管理2.1 .为什么动态内存管理静态内存需要编译器分配,这没什么好说的~

通常,使用malloc申请动态内存分配有以下两个缺点:

由于分配算法的复杂性,分配的时间不确定

在反复申请、释放的过程中,由于内存的对齐,容易产生碎片化的内存

实时不允许这两个缺陷,因此操作系统必须提供有效、合理、时间可确定的动态内存管理机制。

2.2 .如何进行动态内存管理既然传统的malloc有两个缺陷,为了解决这两个缺陷,建立更适合嵌入式系统的动态内存管理系统。

目前有两种不同的解决方案。 动态内存堆管理算法(mmheap )和静态内存池管理算法(mmblk )。 两种方法各有优缺点,TencentOS-tiny提供了两种管理算法。 现在根据具体算法进行说明。

3 .动态内存堆管理算法3.1. TLSF算法TLSF全称two-levelsegregatedfitmemoryallocator,两级隔离fit内存分配器是通用动态内存分配器,满足实时要求

https://github.com/mattconte/tlsf

此TLSF动态内存定位器具有以下特征:

malloc、free、realloc、memalign算法复杂度为o(1); 一次分配的开销非常低(4字节); 碎片化支持添加和删除动态内存池空间。 TLSF主要使用Two-Level Bitmap和Segregated Free List数据结构来管理动态内存池和其中的空闲块,并使用good-freepool

本文不对该算法进行深入说明(博主太菜) ),有兴趣的话可以自己找TLSF算法的论文阅读。 在此只从应用的观点出发表示应该注意的地方。

http://www.Sina.com/

TLSF又称多内存堆管理算法,位于TLSF算法分配速度不一定快,只是说能保证分配的时间是个常数

3.2 .在TencentOS-tiny中实现TencentOS-tiny中实现该算法的动态存储器分配器位于tos_mmheap.h和tos_mmheap.c中。 其中,默认指定的最土豪小馒头管理的不连续内存栈有3个,可以自己修改。

# definek _ mm heap _ pool _ max3Tencent OS-tiny提供了缺省缓冲区作为堆空间,并在tos_global.c中定义。

uint8_t k_mmheap_default

_pool[TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE] __ALIGNED__(4);

大小在tos_config.h中指定:

#define TOS_CFG_MMHEAP_EN 1u#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE 0x8000 3.3. mmheap使用示例 /** *@brief 打印当前mmeheap使用情况 *@param none *@retval none*/int list_mmheap_info(void){ k_err_t err; k_mmheap_info_t mmheap_info; err = tos_mmheap_check(&mmheap_info); if (err != K_ERR_NONE) { printf("current mmheap info check fail, err = %drn", err); return -1; } else { printf("current mmheap info:rntused: %d[0x%08x] free:%d[0x%08x]rnrn", mmheap_info.used, mmheap_info.used, mmheap_info.free, mmheap_info.free); return 0; }}void task1_entry(void *arg){ void *ptr = NULL; size_t size; /* 输出块大小的最大值 */ printf("K_MMHEAP_BLK_SIZE_MAX is %d(0x%08x) bytesrnrn", K_MMHEAP_BLK_SIZE_MAX, K_MMHEAP_BLK_SIZE_MAX); /* 打印当前内存使用情况 */ list_mmheap_info(); /* 申请一块内存使用 */ size = 128; ptr = tos_mmheap_alloc(size); if (ptr == NULL) { printf("%d bytes mem alloc failrn", size); } else { printf("%d bytes mem alloc success, ptr is 0x%08xrnrn", size, (uint32_t)ptr); } /* 打印当前内存使用情况 */ list_mmheap_info(); /* 释放申请的内存 */ tos_mmheap_free(ptr); printf("mem free successrnrn"); /* 打印当前内存使用情况 */ list_mmheap_info(); while (1) { tos_task_delay(1000); }}

运行结果为:

4. 静态内存池管理算法 4.1. 管理机制

静态内存池就是将一块内存划分为n个大小相等的块,用户可以动态的申请、释放一个块,假装在使用动态内存。

4.2. TencentOS-tiny中的实现

TencentOS-tiny中静态内存池管理算法的实现在tos_mmblk.h和tos_mmblk.c中。

提供如下四个API:

//创建一个内存池__API__ k_err_t tos_mmblk_pool_create(k_mmblk_pool_t *mbp, void *pool_start, size_t blk_num, size_t blk_size);//销毁一个内存池__API__ k_err_t tos_mmblk_pool_destroy(k_mmblk_pool_t *mbp);//申请内存池中的一个空闲块__API__ k_err_t tos_mmblk_alloc(k_mmblk_pool_t *mbp, void **blk);//释放回内存池一个内存块__API__ k_err_t tos_mmblk_free(k_mmblk_pool_t *mbp, void *blk); 4.3. 静态内存块使用示例 typedef struct blk_st { int id; char* payload;} blk_t;#define BLK_NUM 10k_mmblk_pool_t mmblk_pool;uint8_t mmblk_pool_buffer[BLK_NUM * sizeof(blk_t)];void task1_entry(void *arg){ blk_t *ptr = NULL; k_err_t err; /* 打印出一个块的大小 */ printf("block size is %d bytesrn", sizeof(blk_t)); /* 申请一个块 */ err = tos_mmblk_alloc(&mmblk_pool, (void*)&ptr); if (err != K_ERR_NONE) { printf("a mmblk alloc fail, err = %drn", err); return; } else { printf("a mmblk alloc successrn"); } /* 使用该块 */ ptr->id = 1; ptr->payload = "hello"; printf("mmblk id:%d payload:%srn", ptr->id, ptr->payload); /* 使用完毕之后释放 */ err = tos_mmblk_free(&mmblk_pool, ptr); if (err != K_ERR_NONE) { printf("a mmblk free fail, err = %drn", err); return; } else { printf("a mmblk free successrn"); } while (1) { tos_task_delay(1000); }}

运行结果如图:

5. 总结

本节主要讲述了使用malloc和free的缺点:申请时间未知,内存容易产生碎片。

所以在实时操作系统中诞生了动态堆管理机制和静态内存池管理机制,两种比较如下:

① 内存堆(mmheap)管理机制,每次可以申请和释放不定大小的内存,分配时间虽然不快,但是能保证已知;

② 静态内存池(mmblk)管理机制,每次只能申请和释放一个块(固定大小的内存),分配时间最快,没有碎片。

好啦~今天的文章就到这里,我是喜欢玩板子的Mculover666,下期文章再见!

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。