您的位置 首页 电路

uc-OS III 使命优先级不妥引发的困扰

前言为了使STM32的生态系统里OS多元化,stm32系列不仅支持FreeRTOS,也支持uc-OSIII,提供给客户更多选择,满足客户日益增长的需求。这里使…

前语

为了使STM32的生态体系里OS多元化,stm32系列不只支撑FreeRTOS,也支撑uc-OSIII,供给给客户更多挑选,满意客户日益增长的需求。
这儿运用stm32f429-eval渠道,根据stm32cubef4中的Demostration例程,替换其间的FreeRTOS。例程中uc-OSIII体系里触及的使命及其优先级装备如下表:

Demostration 是一个归纳示例,包含了尽可能多的中间件,比如GUI framework, STemwin,USB stack, FatFS, OS(FreeRTOS)等等。鉴于芯片内存大小约束,在stm32f429-eval 渠道上,tcp/ipstack lwIP 并未集成进去。

Case 1 优先级设置不妥引发ANR(application not response)

1.1 问题描绘
在运用中,有一个videoplayer 和audioplayer 模块,其间有一个功用,从文件体系中向播放器增加文件、文件夹,这在emWinframework 中,经过控件CHOOSEFILE_Create完成,它是一个根据窗口的形式对话框。
但是,只需点击“+”按钮或许文件夹按钮后,弹出一个挑选文件的对话框,再点击屏幕任何地方,体系都没有任何反响,界面也一向停留在这个对话框。

1.2 问题剖析与定位
在uc-OSIII 中,接触屏事情是经过软定时器完成的,软件定时器是经过一个使命完成的,而当定时器使命的优先级比GUI使命低时,当GUI使命处于组织妥当状况时,定时器使命得不到任何调度,那么任何接触事情的更新音讯无法发生,也无法发送给GUI使命,而GUI使命在等候接触事情(GUI使命与接触模块是经过信号量来同步的)。这样就呈现了deadlock,一方(顾客)死等某个事情的发生,而别的一方(生产者)无法发生这个事情,体系就呈现了无呼应的现象。

1.3 问题处理方案
已然uc-OSIII 是抢占式调度形式(也支撑round-robbin调度),那么将定时器使命优先级调整比GUI使命优先级高一级即可,问题予以处理。

Case 2 优先级设置不妥引发调试形式下,程序溃散

2.1 问题描绘:
运用Keil5.20 版别编译、调试、下载程序时,假如程序处于运转形式,全部正常;但是假如置于调试形式,则程序100%crash。这种景象非常稀有,一般情况下是,运转形式往往程序会crash,调试形式下,程序能够正常运转。运用调试形式来troubleshootbug 的。

2.2 问题剖析&处理
走运的是,该问题100%复现。所以尽心竭力去找寻上一次对程序的修正导致了此问题,一步一步吊销修正,康复成代码的初始状况。经过几番尽力,力求追根溯源,想查明是哪一次的修正导致了问题。成果,仍然一无所得。

所以,开端考虑从反常处理程序中着手,找到触发反常的那条指令,那个函数,那个使命。这儿首要参阅了ARM供给的运用笔记《apnt209.pdf》。调试时,经过FaultReport 知悉,此反常为busfault,并且BFARVALID和PRECISERR都置位了。依照ARM的攻略,BFARVALID 对应的地址寄存器存储的是触发busfault 的指令地址,不过这次失效了,里边的地址不在ROM地址范围内。

本想咨询一下ARM的技术支撑,怎么处理这一问题。由于个人觉得,这个问题跟调试器有关,怀疑是自己关于IDE的某些参数装备不妥才引起的。苦于没有任何直接的、直接的来自ARM官方的关于KeilMDK 技术支撑。未遂。

心痛还得心药治,解铃还须系铃人。考虑体系存在许多使命,所以考虑经过WBS方法,逐个注释掉这些使命,看看究竟是哪个使命引起的。这样做的话,工作量比较大。退而求其次,已然调试时程序每次都crash,并且每次crash时,内核的寄存器参数的值都是相同的(走运的是,该反常不是随机发生的),联想到Linux内核里有一个当前使命指针currenttask pointer,而uc-OSIII 中也有相似的数据结构(其他OS如FreeRTOS也有相似数据结构),即OSTCBCurPtr,将其置于watch窗口,发现其指向OSStatTaskTCB,所以在stat 使命相应
的使命处理函数设置断点,单步履行,这样竟然程序能够正常运转!

进一步发现,在体系启动过程中,stat使命会计算每个使命占用CPU时刻,比较消耗CPU,导致GUI 使命不能及时履行,然后诱发总线反常(busfault)。所以测验将stat使命优先级调低,从头编译、下载、调试,全部OK!运转形式也OK.

OMG,原来是stat 使命优先级设置过高导致了bus fault !仍是使命优先级组织不妥导致的问题。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/dianlu/272255.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部