diff --git "a/docs/zh/docs/Embedded/UniProton/UniProton\345\212\237\350\203\275\350\256\276\350\256\241.md" "b/docs/zh/docs/Embedded/UniProton/UniProton\345\212\237\350\203\275\350\256\276\350\256\241.md" index f1f9eb88a762dfab96986edca0c74390705f075f..e77e5ad23879d60b1182da1ce32a2819075c3dd4 100644 --- "a/docs/zh/docs/Embedded/UniProton/UniProton\345\212\237\350\203\275\350\256\276\350\256\241.md" +++ "b/docs/zh/docs/Embedded/UniProton/UniProton\345\212\237\350\203\275\350\256\276\350\256\241.md" @@ -4,37 +4,37 @@ - [UniProton功能设计](#uniproton功能设计) - - [支持任务管理](#支持任务管理) + - [支持任务管理](#支持任务管理) - - [支持事件管理](#支持事件管理) + - [支持事件管理](#支持事件管理) - - [支持队列管理](#支持队列管理) + - [支持队列管理](#支持队列管理) - - [支持硬中断管理](#支持硬中断管理) + - [支持硬中断管理](#支持硬中断管理) - - [支持内存管理](#支持内存管理) + - [支持内存管理](#支持内存管理) - ​ [FSC内存算法](#fsc内存算法) + ​ [FSC内存算法](#fsc内存算法) - ​ [核心思想](#核心思想) + ​ [核心思想](#核心思想) - ​ [内存申请](#内存申请) + ​ [内存申请](#内存申请) - ​ [内存释放](#内存释放) + ​ [内存释放](#内存释放) - - [支持定时器管理](#支持定时器管理) + - [支持定时器管理](#支持定时器管理) - - [支持信号量管理](#支持信号量管理) + - [支持信号量管理](#支持信号量管理) - - [支持异常管理](#支持异常管理) + - [支持异常管理](#支持异常管理) - - [支持CPU占用率统计](#支持cpu占用率统计) + - [支持CPU占用率统计](#支持cpu占用率统计) - - [支持STM32F407ZGT6开发板](#支持stm32f407zgt6开发板) + - [支持STM32F407ZGT6开发板](#支持stm32f407zgt6开发板) - - [支持OpenAMP混合部署](#支持openamp混合部署) + - [支持OpenAMP混合部署](#支持openamp混合部署) - - [支持POSIX标准接口](#支持posix标准接口) + - [支持POSIX标准接口](#支持posix标准接口) @@ -48,9 +48,9 @@ UniProton任务管理模块提供任务创建、任务删除、任务挂起、 ## 支持事件管理 -事件机制可以实现线程之间的通讯。事件通讯只能是事件类型的通讯,无数据传输。 +事件机制可以实现线程之间的通讯。事件通讯只能是事件类型的通讯,无数据传输。 -UniProton事件作为任务的扩展,实现任务之间的通讯。每个任务支持32种类型事件(32个 bit位,每bit代表一种事件类型)。 +UniProton事件作为任务的扩展,实现任务之间的通讯。每个任务支持32种类型事件(32个 bit位,每bit代表一种事件类型)。 UniProton提供读取本任务事件和写指定任务事件的功能。读事件时可以同时读取多种事件,也可以只读取一种事件,写事件时也可以同时写一种或多种类型事件。 @@ -80,7 +80,7 @@ UniProton创建队列时,根据用户传入队列长度和消息单元大小 如下简要描述一下FSC内存算法: -### FSC内存算法 +### FSC内存算法 #### 核心思想 @@ -90,17 +90,17 @@ UniProton创建队列时,根据用户传入队列长度和消息单元大小 如:索引为2的链表可挂接的空闲块大小为4、5、6、7;索引为N的链表可挂接的空闲块大小为2^N到2^(N+1)-1。 -![](./figures/FCS.png) +![](./figures/FCS.png) #### 内存申请 -当申请uwSize大小的内存时,首先利用汇编指令得到最左边的1的下标,假定为n。为确保空闲链表中的第一个空闲内存块满足uwSize,从索引为n+1开始搜索。若n+1所属空闲链表不为空,则取该链表中的第一个空闲块。若n+1链表为空,则判断n+2链表,依次类推,直到找到非空链表或索引达到31。 +当申请uwSize大小的内存时,首先利用汇编指令得到最左边的1的下标,假定为n。为确保空闲链表中的第一个空闲内存块满足uwSize,从索引为n+1开始搜索。若n+1所属空闲链表不为空,则取该链表中的第一个空闲块;若n+1链表为空,则判断n+2链表,依次类推,直到找到非空链表或索引达到31。 -为避免for循环逐级判断空闲链表是否为空,定义一个32位的BitMap全局变量。若索引n的空闲链表非空,则BitMap的下标为n的位置1,否则清0。BitMap的下标为31的位在初始化时直接置1。于是查找从n+1开始的第一个非空闲链表,可以首先将BitMap复本的0到n位清零,然后获取复本的最左边的1的下标,若不等于31,即为第一个空闲链表非空的数组索引。 +为避免for循环逐级判断空闲链表是否为空,定义一个32位的BitMap全局变量:若索引n的空闲链表非空,则BitMap的下标为n的位置1;否则清0。BitMap的下标为31的位在初始化时直接置1。于是查找从n+1开始的第一个非空闲链表,可以首先将BitMap复本的0到n位清零,然后获取复本的最左边的1的下标,若不等于31,即为第一个空闲链表非空的数组索引。 所有的空闲块都以双向链表的形式,串接在空闲链表中。若从链表中获取的第一个空闲块比较大,即分割出一个uwSize的内存块后,剩下的空间至少可做一次最小分配,则将剩余的空闲块调整到对应的空闲链表中。 - ![](./figures/MemoryApplication.png) + ![](./figures/MemoryApplication.png) 内存控制头中记录空闲内存块的大小(包括控制头本身)。内存控制头中有一个复用成员,位于最首部。当内存块空闲时,作为指向后一个空闲内存块的指针;当内存块占用时,存放魔术字,表示该内存块非空闲。为避免魔术字与指针冲突(与地址值相同),高低4位均为0xf。因为已分配的内存块起始地址需按4字节对齐,所以不存在冲突。 @@ -116,7 +116,7 @@ UniProton创建队列时,根据用户传入队列长度和消息单元大小 定时器管理是为满足产品定时业务需要,UniProton提供了软件定时器功能。 -对于软件定时器,是基于Tick实现,所以定时周期必须为Tick的整数倍,在Tick处理函数中进行软件定时器的超时扫描。 +由于软件定时器是基于Tick实现,所以定时周期必须为Tick的整数倍,在Tick处理函数中进行软件定时器的超时扫描。 目前提供的软件定时器接口,可以完成定时器创建,启动,停止,重启,删除操作。 @@ -124,21 +124,17 @@ UniProton创建队列时,根据用户传入队列长度和消息单元大小 信号量(Semaphore)常用于协助一组互相竞争的任务来访问临界资源,在需要互斥的场合作为临界资源计数使用,根据临界资源使用场景分为核内信号量和核间信号量。 -信号量对象有一个内部计数器,它支持如下两种操作: +信号量对象有一个内部计数器,它支持如下两种操作: -- 申请(Pend):Pend 操作等待指定的信号量,若其计数器值大于0,则直接减1返回成功。否则任务阻塞,等待其他线程发布该信号量,等待的容忍时间可设定。 +- 申请(Pend):Pend 操作等待指定的信号量,若其计数器值大于0,则直接减1返回成功。否则任务阻塞,等待其他线程发布该信号量,等待的容忍时间可设定。 +- 释放(Post):Post操作发布指定的信号量,若无任务等待该信号量,则直接将计数器加1返回。否则唤醒为此信号量挂起的任务列表中的第一个任务(最早阻塞的)。 -- 释放(Post):Post操作发布指定的信号量,若无任务等待该信号量,则直接将计数器加1返回。否则唤醒为此信号量挂起的任务列表中的第一个任务(最早阻塞的)。 +通常一个信号量的计数值用于对应有效的资源数,表示剩余可被占用的互斥资源数。其值的含义如下有两种情况: +- 为0值:表示没有积累下来的Post操作,且有可能有在此信号量上阻塞的任务。 -通常一个信号量的计数值用于对应有效的资源数,表示剩余可被占用的互斥资源数。其值的含义如下有两种情况: - -- 为0值:表示没有积累下来的Post操作,且有可能有在此信号量上阻塞的任务。 - - -- 为正值:表示有一个或多个Post下来的发布操作。 - +- 为正值:表示有一个或多个Post下来的发布操作。 ## 支持异常管理