2020-12-07

UCOSII操作系统(五)--时间管理 1、UCOSII的定时中断 (1)绝大多数的内核要求提供定时中断,以实现延时与超时控制等功能。这个定时中断叫做时钟节拍。 (2)时钟的中断子程序ISR和时钟节拍函数OSTimeTick()该函数用于通知UCOSII,发生了时钟的节拍中断。 2、UCOSII的5个关键的时钟函数 (1)OSTimeDly(); 后面的4个函数可以根据需要进行配置使用 (2)OSTimeHMSM(); (3)OSTimeDlyResume(); (4)OSTimeGet(); (5)OSTimeSet(); 3、关键的时钟延 阅读详情

ucos Ⅱ 多道系统分析——任务管理

1 进程存储和识别

  uCOS的进程被命名为task,由OSTCB作为封装其的数据结构;而其在系统中的唯一标识是task的优先级(TCB中的OSTCBPrio属性),即一个优先级代表着一个任务,没有相同的优先级存在。而优先级高低的判断准则是值越小优先级越高,0是最高优先级。因此系统中的进程的最大数量由优先级最低决定。在1992-1999的版本中,最低优先级默认是12;不过具体值可以根据需求自行修改,只要不要高于63。而不能高于63的原因是受就绪队列存储的方式和数据类型长度限制,就绪和阻塞队列中最多记录63个;后续版本中,通过条件编译定义宏OS_PRIO来选择数据长度进而动态支持64-255数量的优先级。任务的优先级导出一些TCB中其他的成员X(省略了OSTCB前缀),Y,X和Y的值为优先级第三位和高三位,该设计的目的后面陈述;而X,Y也导出了两个成员BitX和BitY,它两分别是以X,Y为索引,在OSMapTbl的映射。
  uCOS通过OSTCB链表(线性数组)存储task(实质是通过其中的任务栈存储);通过优先级表(OSTCB线性数组指针结构)识别、管理task。之所以用优先级表识别task,是因为task的唯一标识是优先级,而不是OSTCB数组中的下标。
在系统初始化时,链表完成链接;而优先级表初始化为全空,意味暂且系统中没有运行的进程。每一次任务创建或销毁都是,在链表的头进行删除或插入操作表示存储或销毁;将任务在优先级表中对应的指针指向TCB或空(NULL)。
  链表的长度由用户定义,即OS_MAX_TASKS的值,但不能小于2(目前不知道为什么),且不能大于最低优先级值减去系统进程数量OS_N_SYS_TASKS(闲置任务和可不存在的统计进程),不过最好不要等于,因为互斥锁的存在会降低利用效率。
优先级表的长度等于最低优先级值+1(0是最高优先级设计的好处),以此做到对每一个优先级的控制。值得一提的是,该表项除了空闲(空,NULL)和已占用(指向一个具体的TCB)状态,还有就绪状态——指针值为1;该状态标识即将或未来可能会使用这个优先级,用于互斥锁和task建立等方面。

2 进程调度

  uCOS的就绪和阻塞队列存储和寻找最高优先级的方式让进程调度的代价降到极致,即Ɵ(1)。
  进程由等待、休眠类型的阻塞状态转到就绪状态是通过时钟节拍函数OSTimeTick实现。而该函数必须在规定的每一段时间启动一次,因此其调用者是定时器中断服务子程序。而OSTimeTick的功能是将等待时间(等待节拍数)大于0的进程等待时间减一,并若减一后为0,且不是悬挂状态,则将该进程插入就绪队列中;但若为悬挂状态,则置OSTCBDly为1,即等待时间置1,直到取消悬挂。

2.1 状态队列的记录

  进程状态队列只需要维护阻塞和就绪队列,在单核体系,执行就只有一个,只需要用一个指针记录即可。
  先说明一下记录的前置条件——OSMapTbl,这个数组中元素的值是精心设计的,每个元素的值在二进制层次没有一个位是重叠的,这给用BitX/Y记录任务提供了无二义性的前置条件。
  就绪队列主要由OSRdyTbl(长度为最低优先级值除以8+1的八位二进制数组)、OSRdyGrp(八位二进制数)一起记录。OSRdyGrp负责记录任务组(以bitY分组),而OSRdyTbl记录每组任务的BitX! OSRdyGrp通过其二进制位记录就绪队列中优先级的BitY来记录任务组,由于BitY是OSMapTbl上的映射,且其值的范围是0-7,所以每一位代表的优先级组是无二义性的;而OSRdyTbl相应每个元素的值以二进制位的形式记录相同OSTCBY(由于BitY相同,所以OSTCBY必相同)任务的BitX,同样由于BitX也是OSMapTbl的映射,记录方式无二义性。

  由于OSRdyTbl种元素和OSRdyGrp的数据类型都是八字节;且OSRdyTbl数组长度最长为8,这种就绪队列能够明确地记录至多64个优先级(不大于63,且无不重复),即至多记录64个就绪进程。
  对于阻塞队列,uCOS并没有把所有等待(阻塞)的task记录在一个地方,而是在每一个事件中维护一个等待队列以此记录等待的任务,记录方式与就绪队列一致。事件结构体(除FLAG_GRP以外)中有OSEvenTbl、OSEvenGrp发挥OSRdyTbl、OSRdyGrp一样的作用,即以相同的方式记录任务。除了事件以外,因休眠或悬挂进入阻塞状态的任务没有设立队列,前者仅通过时钟唤醒才能转变成就绪,而后者仅通过其他任务取消悬挂状态才能转变成就绪。

2.2 最高优先级任务的检索

  最高优先级任务的检索是通过对最高优先级任务查找表——OSUnMapTbl,的二级查表实现的。
  OSUnMapTbl中每个元素的值被设计成能保证每次以OSRdyGrp为索引在OSUnMapTbl中找值,都能找到就绪队列中BitY最小的一组任务的Y值(任务优先级高三位);进而用求得到的Y获得OSRdyTbl[Y]中相应的映射值,将其作为OSUnMapTbl的索引取得映射值中最小的索引,即X。
  OSUnMapTbl这个设计特点,使得按照上述的过程可以得到最小的高三位Y和低三位优先级X,这也相应的求出了值最小的优先级,即最高优先级;而该操作系统任务的id(在任务队列中的索引)就是优先级,所以这样就实现了最高优先级任务的检索。
  而这个过程没有迭代就绪队列,代价是Ɵ(1),且后面的保存CPU信息之类操作也是Ɵ(1)的复杂度,因此任务调度的总体代价为Ɵ(1)!

2.3 调度的时机

  调度的时机有两个,一个是计时中断服务,即节拍计时中断服务,其进行完一次OSTimeTick后,若就绪列表中优先级最高的进程比当前执行进程的高,则发生一次任务调度;另一个是由当前执行的任务创造的,以根据当前进程在调度后的状态分为两种情况——转变成就绪状态和阻塞状态。
  ① 转变成就绪状态
    a) 当前进程成功创立了一个新进程或改变一个任务的优先级时,发生调度。若操作任务的优先级高于自己,则当前任务被抢占,进入就绪队列;否则继续执行。
    b) 当前进程释放了一个事件,即释放了一个资源,发生调度。若等待这个事件进程中最高优先级的进程的优先级比自己高,则当前任务被抢占,进入就绪队列;否则继续执行。
    c) 取消一个不等待事件的悬挂任务。
  ② 转变成阻塞状态
    a) 当前任务悬挂自身。
    b) 当前任务等待一个事件。
    c) 当前任务自我休眠。
  如果一个任务不想被打断,就会涉及到加锁的行为,为防止在运行的时候任务被打断下次回来无法执行的情况。

在线考试系统源码+数据库+word+ppt(高分毕业设计) 本系统通过Spring Cloud实现微服务拆分,将授权、考试、监控等功能解耦,既保证了系统的扩展性,也便于后期维护。基于OAuth2.0的单点登录,解决多服务统一认证问题;考试与练习模式分离,满足不同场景需求;集成Druid与Hystrix,保障系统监控与稳定性。 阅读详情

相关推荐

SDIO_WiFi驱动学习之安卓WLAN架构介绍及调用流程分析

一、引言 上一篇博客大概介绍了MMC子系统和SDIO相关知识及架构,这一篇博客则大致分析安卓的WLAN架构及上层如何调用WLAN驱动的流程。 虽然我工作的开发环境是安卓系统,但由于我不是专业的安卓应用/框架开发工程师,所以对安卓层的一些代码并不是特别熟悉,只能大致梳理流程,不专业的地方请谅解。 本文部分内容摘抄自网络,若有侵权,请联系删除。 二、安卓WLAN架构 1、应用框架(Application framework) 在应用程序框架级别是应用程序代码,它使用各种android.net..

陈子陌的博客 5088

OSTimeTick()函数解析

ucos V2.52 OSTimeTick()函数解析 调用处:os_cpu_a.asm里_OSTickISR 函数所有源文件:os_core.c 代码: void OSTimeTick (void) { #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU stat

ARM+嵌入式 7228

Simpack实战:5分钟搞定轨道车辆车轮不圆的3种定义方法(附详细参数设置)

本文详细介绍了在Simpack中定义轨道车辆车轮不圆的3种高效方法:Radius deviations、Fourier coefficients和Harmonic function,并提供了详细的参数设置指南。通过实战案例和参数优化技巧,帮助工程师快速掌握车轮不圆度的定义与仿真,提升轨道车辆动力学分析的准确性和效率。

weixin_29292535的博客 201

UCOSII-中断和时钟

中断和时钟在UCOSII操作系统中的应用至关重要,本文详细介绍了UCOSII的中断执行过程,并介绍了UCOSII时钟的产生以及时钟节拍中断,对于理解UCOSII系统的运行很有帮助,供大家参考,谢谢!

tutu_hu的博客 3300

U盘 未知USB设备 设定地址失败 由于该设备有问题Windows 已将其停止(代码 43) 终极解决方案(做过系统装机盘而无法解决的必看)

U盘由于该设备有问题Windows 已将其停止(代码 43) 终极解决方案 我们在使用U盘的时候偶尔会碰到下列情况 一般是因为传输数据的过程中,死机或未响应直接断点或拔掉设备导致的,U盘再次插上之后出现设定地址失败。无法再次读取设备的数据。 解决方案: 首先请确认出现该情况不是因为你摔了U盘或接口处产生断裂这种物理损伤导致的!!! 首先请确认出现该情况不是因为你摔了U盘或接口处产生断裂这种物理损...

qq_39123987的博客 13万+

告别SquareLine!用免费的NXP GUI-Guider为海思3516AV300开发LVGL界面(附完整移植流程)

本文详细介绍了如何利用免费的NXP GUI-Guider工具为海思Hi3516AV300开发LVGL界面,包括环境配置、代码移植和性能优化等全流程实战指南。特别针对二维码组件缺失等常见问题提供解决方案,帮助开发者零成本构建高效嵌入式GUI系统。

weixin_28292761的博客 415

OSTimeTick()

void OSTimeTick (void)   //这个节拍服务函数是在OSTickISR函数中调用的,目的是在时钟节拍到来时,检查每个任务的任务控制块中的.OSTCBDly-1后是否为0,如果是,那么表明这个任务刚才是挂起的状态,此时应改变为就绪态 {     OS_TCB *ptcb;     OSTimeTickHook();

南国有儿女 1891

面向边缘计算的YOLOv12模型剪枝-蒸馏联合优化实战教程**

这套剪枝-蒸馏联合方案的优势在于其系统性和可靠性。它不是单一的技巧,而是一套完整的工程流程,确保了从研发到部署的无缝衔接。

FJN110的博客 158

对ucosii内核代码的理解

ucosii中的任务都是无返回值且不能有返回点的,换句话说任务就是一个无限循环。 每个任务都有自己的唯一性的优先级,和自己的堆栈空间,用来供内核进行上下文切换(见前面的汇编理解)。 内核根据优先级调度算法来执行任务的调度切换(见前面的数据结构理解): 任务在创建之后进入就绪态,任务等待的事件触发后也是进入就绪态,任务从被中断和调度锁状态恢复之后也是进入就绪态;内核从就绪任务列表中,永远提取最高优先级任务开始执行。 但是,ucosii也存在“优先级反转”的缺陷 :两个任务等待同一个事件时,会出现低优先

weixin_38743772的博客 516

假期搞定!2026国社科申报AI全攻略指南:从选题到创新,7大核心要点手把手教你!

最后给大家推荐的400多所高校教师都在用的AI平台——高级学术版专业应用平台,集成了国际主流学术应用,以及ChatGPT、Claude、Gemini、Grok等Al大模型的高级版本平台,还有,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。你的任务是:用高度凝练的方式说明在(某一明确国家战略 / 政策方向,如:中国式现代化、共同富裕、基层治理现代化、数字中国、文化强国、国家安全等)背景下,我究竟要研究一个什么“具体而可操作的问题”。

智能AI让学术科研更容易 623

BDD测试用例:Playwright的MCP Server实战

Playwright MCP Server建立了大模型和真实的浏览环境之间的桥梁,可以让大模型操作多款浏览器完成测试任务。

Criss@陈磊 438

2020-07-12

{“feed”:{“title”:“Top Free iPhone Apps”,“id”:“https://rss.itunes.apple.com/api/v1/cn/ios-apps/top-free/all/100/explicit.json”,“author”:{“name”:“iTunes Store”,“uri”:“http://wwww.apple.com/cn/itunes/”},“links”:[{“self”:“https://rss.itunes.apple.com/api/v1/cn

weixin_45981643的博客 24万+

Cesium教程(十七):淹没分析

淹没分析是根据某片区域的地形及洪水流量速度,动态模拟该地形区域水位逐渐上涨的淹没过程。该功能可适用于山区、丘陵等地形起伏较大区域,模拟洪水涨到安全限定高度的淹没过程,为防洪水救灾提供一定的参考。此外,还可以为河谷地带修建水利工程设计与选址提供参考依据。

WwLK123的博客 3006
上一篇: 2020-12-07
下一篇: 2020-12-07
InsectOfJava
博客等级 码龄7年 0粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值