FreeRTOS–疑难杂症

发布时间:2018-10-05  栏目:法律  评论:0 Comments

前程叔年内对团起黑的机要影响IT趋势。这里的IT趋势的摘要:
图片 1

花了3独晚上,把这个节看了,受益匪浅。

1. 乘除在任何地方

  1. 最好实惠之应是和中断相关的错,优先排查中断优先级设置。
  2. 库溢出检查,可能为此到,一般先拿库房设置的够用深,只要没溢起便是善,溢起了,掌握了栈溢出钩子函数排错很便利。
  3. printf()连带的题目该尽可能不会见起,毕竟如果用打印调试信息的状态下才用,而且嵌入式系统一般都是用串口重定向的。
    讲真,嵌入式中printf()真挺烦的,严重影响性,我的付出案例被发现,串口打印会潜移默化板子的
    power save性能,这是实测及之。

智能手机,平板,电视盒,可越过戴设备,可连的屏幕,对于适应移动用户所求要的完好环境之求于时时刻刻增高。这会继续增强IT组织管理的挑战,因为她们去了用户终端设备的控制权。这种要求的提高为亟需越来越重视用户体验设计。

此章节关系新手最经常遇的3栽问题:

2.物联网

  1. 荒唐的暂停优先级设置
  2. 栈溢出
  3. 勿得当的采用printf()

物联网是初一代表信息技术的机要片段,也是“信息化”时代的重点发展阶段。其英文名称是:“Internet
of
things(IoT)”。顾名思义,物联网就是物物相连的互联网。这生个别层意思:其一,物联网的骨干和基础仍是互联网,是当互联网基础及的拉开与壮大的大网;其二,其用户端延伸与扩展及了其余物品及物品之间,进行信息置换同通信,也就算是物物相息。物联网通过智能感知、识别术与普适计算等通信感知技术,广泛应用于网络的齐心协力着,也就此于称为继计算机、互联网之后世界信息产业发展的老三不良浪潮。物联网是互联网的运进行,与其说物联网是网,不如说物联网是业务与利用。因此,应用创新是物联网发展之基本,以用户体验也基本的更新2.0凡物联网发展之灵魂。
物联网将延续扩大,推动通过无处不在的面向用户的盘算。假定这将于复制,在工业以及以事情及产卵文中,它以改为数字业务产品跟流程的要害。更深切地置于技术以创设用户无处不在的触摸点。这将形成数字业务的功底。

使用configASSERT()能明白地提高生产效率,它亦可捕获、识别多种类型的荒唐。强烈建议在支付还是调试中开启宏configASSERT()

3. 3D 打印

暂停优先级

注意:这是五星级需要技术支持的题目,在大多数底移植版本被通过定义configASSERT()纵使能够及时捕获这个荒唐。

设FreeRTOS移植版本支持中断嵌套,并且中断服务程序使用了FreeRTOS
API,那么要将暂停优先级设置为configMAX_SYSCALL_INTERRUPT_PRIORITY还是低一些。没有这么设置以会晤造成临界区失效,反过来就会导致间歇性的错误。

当FreeRTOS运行于偏下处理器上待特别注意:

  • 停顿优先级应用可能的嵩优先级,这虽是ARM Cortex
    处理器上的状态,还有有别样的。在这些电脑上,调用FreeRTOS API
    的间歇的先期级无能够留未初始化。
  • 优先级数值越强意味着逻辑上先级更低,这或许与直觉相反,因此可能造成混淆。同样这或以少数ARM
    Cortex处理器上,可能还来任何的。
  • 比如说,在有处理器上一个抛锚的预级也5,正在运转,但是能够让一个先级吧4之刹车打断。因此,如果configMAX_SYSCALL_INTERRUPT_PRIORITY设置为5,那么其它其它的采取FreeRTOS
    API的中止的预先级必须安装也5居然又胜似。在这种情况下先级为5要么6底是行得通之,但是优先级吧3的中断是行不通的。
  • 差的库房实现巴中断优先级用不同之章程指定。此外尤其是对准ARM
    Cortex处理器相关的库,它们的间歇优先级以写入硬件寄存器之前是由此各移的。某些库或者好进行移动操作,然而其他的库期待中断优先级在传于库函数之前已展开了运动操作。
  • 一样架构上之差的贯彻,实现的凡搁浅优先级的较特位不同。例如同样的Cortex-M处理器某一个厂商可能实现了3个优先级比特位,但是别一个厂商实现了4单优先级比特位。
  • 概念一个抛锚优先级的比特位被分成两单部分,一部分概念抢占的级别,另外的可比特位定义子优先级。确保有的比特位都是指定抢占的优先级,而子优先级无利用。

当某些移植版本中configMAX_SYSCALL_INTERRUPT_PRIORITY生一个号configMAX_API_CALL_INTERRUPT_PRIORITY

3D打印通常是应用数字技术资料打印机来实现的。常于模具制造、工业设计等领域被用于制造型,后逐步用于一些出品的直白打,已经起下这种技能打印使改为的零部件。该技术于珠宝、鞋类、工业规划、建筑、工程与施工(AEC)、汽车,航空航天、牙科和诊治产业、教育、地理信息体系、土木工程、枪支及其他领域还存有用。

栈溢出

栈溢出是亚个经常寻求技术支持的题材。FreeRTOS提供了几乎单性状来扶持捕获和调节以及栈相关的问题。

每当未来底老三年遭受3D 打印技术之成本会降低,市场之快速增长促使小工业化成本。
尤其是挺突出的生物医学和顾客之应用程序,这种动向是实事求是的认证 3D
打印技术可行性, 具有成本效应,通过改进设计、 流线型的原型,
短期内而制造业回落资金。

API函数uxTaskGetStackHighWaterMark()

每个任务还在保护和谐之库,栈的总大小在创建任务的时刻就指定了。函数uxTaskGetStackHighWaterMark()纵然用来查询分配为这个任务之栈接近栈溢出之水准。返回值称为栈的愈水位线

UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );

职责使用栈的多少,随着任务之运行与间断的拍卖时而长时而减少。uxTaskGetStackHighWaterMark()回来从任务开始运行以来剩余可用之栈空间的最为小价。它回到的是栈未使用的空中占据尽酷价值的比率。高水位越接近于0,那么这个职责的库房就越快要溢起。

4.尖端预测,无形的分析

运行时栈检查

FreeRTOS提供了个别种植于运转时检查栈的机制。都是由文件FreeRTOSConfig.h中的configCHECK_FOR_STACK_OVERFLOW来以编译时进行支配的。两种植方式都见面增加上下文切换的流年。

栈溢出钩子函数(又叫做栈溢出回调函数)是一个是因为基础检查到栈溢出时调用的函数。要利用栈溢出钩子函数要满足以下条件:

  1. 在文件FreeRTOSConfig.h中把configCHECK_FOR_STACK_OVERFLOW设置为1或者2
  2. 实现以下钩子函数,使用完全等同的函数名字与原型:

    void vApplicationStackOverflowHook( TaskHandle_t pxTask, signed char pcTaskName);

栈溢出钩子函数会被捕获和调试栈错误越来越的简练,但是有栈溢出荒唐时凡未曾艺术恢复的。此函数把发生栈溢出的职责的句柄和名传递进入。

栈溢出钩子函数会以一个搁浅的上下文中开展调用。

少数微控制器在检测及一个错的内存访问时会发一个左非常,这个错误非常的触发会使得本根本不怕从未有过机会调用栈溢出钩子函数。

累推由物联网和嵌入式的设施演化,这种势头将继续加强。内部和外部组织拿继续生成大量底结构化和免结构化数据。每个应用程序将扭转于有着分析能力的应用程序。能依据难题分析出结论和答案,
比大数目我进一步要。

运行时栈检查–方法1

当进行如下设置是会见选择方式1.

#define configCHECK_FOR_STACK_OVERFLOW 1

当一个任务为切换出时她的凡事的施行上下文都见面为封存至它们好之栈中。很有或及时即是仓库使用率达到最好老价值的下。当用办法1是,当任务之上下文被保存之后根本回去检查栈指针是否当栈可用空间内。如果发现栈指针已经超越了可用的限定那么就是见面调用栈溢出钩子函数。

艺术1实践进度快,但是当有前后文切换时有或会见擦了栈溢出。

5.富全文系统

运转时栈检查–方法2

进行如下设置后才会择方式2.

#define configCHECK_FOR_STACK_OVERFLOW 2

除外艺术1遇之一言一行,方法2尚会执行另外的反省。

开创任务时其的栈会被一个曾经掌握之范本填充。任务2检查库空间的最终20独字节,验证这个都领略之样书是否已经被掩盖。如果立即20独字节的值和预期值未等同那么尽管会见调用栈溢出钩子函数。

法2非苟方法1赶紧,当时相对来讲要赶紧,毕竟只是测试20只字节。很有或方法2会捕获到具备的栈溢出,但是发生或(几乎未容许)某些栈溢出或脱了。

无处不在与正规相结合的嵌入式智能分析,
将推动系统感知外界条件能作出反应与告诫。安全及下文感知的凡来势。

非恰当地使用printf()sprintf()

匪恰当地只用printf()凡是相同栽普遍的错误源,并且没有发觉及这种不当,通常采取开发者会大增又多的printf()来协助调试,结果虽是强化了问题。

众陆续编译器厂商会提供相同种植适合当小型嵌入式系统被使的printf()的贯彻。即便于这种气象下,printf()的贯彻可能并无是线程安全的,几乎可一定不称在刹车服务程序中采取,并且在输出为重定向到哪,会占据相当丰富的如出一辙段落实施时。。

假若小型嵌入式系统的printf()的贯彻无可用,并且使了通用的printf()的兑现,那么即使需要特别注意了:

  • 只是增加了一个针对printf()或者sprintf()的调用就会见重的加应用执行文书之体积;
  • 若使用了heap_3外面的贮存空间方案,printf()sprintf()调用了malloc(),这个是废的。
  • printf()sprintf()或会见申请一个几乎加倍于平常情况的栈空间。

6.智能机器

Printf-stdarg.c

广大的FreeRTOS示例工程了以了一个printf-stdarg.c的文件,它提供了一个极小的、栈使用率挺快速的会替代标准库函数版本的sprintf()落实。在多数情况下,使得任务每次调用sprintf()或连带的函数却分配更少之栈空间。

printf-stdarg.c供了一样种体制把printf()输出重定向,一个字节一个字节的输出,虽然放缓,但是可极大地缩减了栈空间的占据。

注意:并无是具有的FreeRTOS下充斥副本中文件printf-stdarg.c犹落实了snprintf()函数。没有落实snprintf()的副本直接忽略缓冲区大小参数,它们是直照射到sprintf()函数。

printf-stdarg.c举凡开源的,但是是第三正值有的,因此她的授权和FreeRTOS是分开的。它的授权条款在文书的首部。

所谓的智能机器也就是是智能机器人,它深受丁的极度深切的印象是一个奇特之拓自身控制的“活物”。其实,这个自控“活物”的要害器官并没如真的的丁那么微妙而复杂。智能机器人拥有形形色色的里边信息传感器以及标信息传感器,如视觉、听觉、触觉、嗅觉。除有感受器外,它还使得应器,作为作用被周围环境的手段。这就是肌肉,或称于整步电动机,它们一旦手、脚、长鼻子、触角相当动起来。由此也会,智能机器人至少要拥有三单元素:感觉要素,运动元素和思想要素。
语境理解和分析结合将迎来智能机器。先进的算法会导致系统,根据这些经验教训来询问自己。佣工将持续从现有原型为独立车、
先进的机器人、
虚拟个人助理和智能顾问机器。推测智能机时代将以它们的历史中极度有破坏性。

另的科普错误

7.云/客户端架构

症状:添加一个简单任务到例程中也造成了例程挂掉

创办任务要由堆积如山中分红内存。许多演示工程的栈空间仅仅能容纳例程任务,因此在开立了例程任务后,没有足够的积聚空间留给其他更多之职责,队列,事件组,信号量。

闲暇任务,又恐是FreeRTOS的医护进程,在调用vTaskStartScheduler()不时是活动创建的。只有当堆空间不足以创建这些职责时vTaskStartScheduler()才会回。在调用vTaskStartScheduler()后来上加一个for(;;);会面叫这问题还易排错。

如若想上加更多的任务,要么扩大堆空间,要么减少已在的事例任务。

挪计量和说话计算继续前行,使中心点的应用程序可以发送到其它设施。云计算是弹性的,可伸缩的、
面向内及表面应用程序是自助式电子计算机的功底。有效地应用新闻跟储存的客户端设备的应用程序将受益于降低带富成本,基于云端协作与治本。随着时空的延迟,应用程序将需要支持多只装备以采用。在未来,游戏跟企业应用程序还拿用多个屏幕跟用衣物及另的装备来提供增强用户体验。

症状:中断中使用API导致应用挂掉

当刹车服务程序中毫无用API,除非API名字是坐FromISR()说到底。特别地,在暂停中不用创建一个临界区,除非动用中断安全的宏大。

当支撑中断嵌套的FreeRTOS移植版本被,如果中断优先级高于configMAX_SYSCALL_INTERRUPT_PRIORITY即绝不当里使用
API 函数。

8.软件定义基础架构与应用程序

症状:有时应用程序在暂停服务函数中挂掉

率先使反省中断是否来了栈溢出。有的移植版本被就检查任务之栈溢出,并不曾检查中断是否栈溢出。

暂停的概念和运办法就移植版本与编译器的不比而各异。因此,其次如果检查语法,宏定义,调用规则以暂停服务程序中之动是否和移植文档中的完全一致,是否与例程中之完全一致。

假若使用运行在数值越低之先期级表示逻辑上越来越强的先行级的微处理器上,那么得确保分配为中断的优先级要考虑到这种场面,因为她看起是违反直觉的。

若是采取运行于将暂停优先级默认设置为最深或的事先级的电脑上,需要确保每个中断的优先级没有留为默认值。

满由基础设备、基础研究到应用程序基于敏捷开发方法编程,使企业能提供必要的灵活性,参考数字业务工作,其打算要。软件定义网络、
存储、 数据基本及安康正日益成熟。应用程序编程接口 (API)
调用渲染云服务软件而配置的, 应用程序编程方式为所有丰富的 Api
来访问该效果及内容。为了回应瞬息万变的需要变化,需要走计量起静态到动态模型的数字业务。

症状:调度器尝试启动第一单任务时挂掉

保设置了FreeRTOS的间歇词柄。参考FreeRTOS移植文档,还有示例程序。

或多或少处理器必须以调度器启动之前处于特权模式。最简单易行的落实方式是在C语言main()之前的启航代码中虽把电脑内置特权模式。

9.Web伸缩 IT

症状: 中断被杀地禁止了,又要临界区从不对地嵌套

假定在调度器启动前即调用了FreeRTOS
API函数那么中断就会见为有心地取缔,直到第一单任务启动以后才见面重复使能。这样做是为保障网未挂掉,原因在初始化过程被暂停尝试调用FreeRTOS
API函数,然而调度器还不曾启动,它恐怕处于一个非雷同的状态。

除开调用taskENTER_CRITICAL()taskEXIT_CRITICAL()函数之外不要采用任何其他的计来再次改微处理器的中止而能位和优先级标志。这有限单宏会统计中断嵌套深度确保当刹车嵌套深度也0时顿而使能。需要知悉某些库函数可能以里头使能和取缔中断。

越是多之营业所考虑,如何为同样的技术构建应用程序和根基结构方式。商业硬件平台拥抱新的模式及云优化和软件定义之法将变成主流,将通往
web 规模化演化。促进提高以及合作的计 (简称 DevOps) 第一步是兑现 web
伸缩性。

症状:远在调度器启动之前使用就是挂掉了

产生或产生上下文切换的刹车是禁止在调度器启动前即开施行之。同样的平整适用于尝试发送或收受FreeRTOS对象(例如队列和信号量)的外中断服务程序。上下文切换必须于调度器启动之后才会产生。

成百上千API函数必须在调度器启动以后才能够调用。最好是在调用vTaskStartScheduler()从此以API的行使限制于创造诸如任务,队列和信号量上,而休是利用这些目标。

10.高风险安全和自身保障

症状: 在调度器挂于时同时或者是临界区其中调用API函数会造成应用程序挂掉

调用函数vTaskSuspendAll()会晤挂于调度器,调用函数xTaskResumeAll()会面东山再起调度器。

调用函数taskENTER_CRITICAL()见面进入临界区,调用函数taskEXIT_CRITICAL()会见离临界区。

以调度器挂于时要么临界区内永远不要调用API函数。

衍变走向数字化的前途,安全用仍然是一个根本之考虑要素。正使过江之鲫铺面认可
100%安然无恙解决方案是按部就班不可能,从一个过程,并拿实施工具的角度以及重新上进的手腕之风险评估过程用易得更主流。外围防御将大体上被视为不足,并将制定多方位的道。安全意识与积极性上下文感知和从适应访问控制相结合的应用程序设计, 
基于动态及静态应用安全测试和运转时应用程序自我保障。

声明

迎转载,请注明出处和作者,同时保留声明。
作者:LinTeX9527
出处:http://www.cnblogs.com/LinTeX9527/p/8031565.html
本博客的篇章要随便异常说明,均为原创,转载请注明出处。如未经作者同意要保留这个段子声明,且在篇章页面明显位置为有原文连接,否则保留追究法律责任的权。

 

期待对你发出辅助,你也许感兴趣之篇章:

企业应用之性质实时度量系统演化
开口计算参考架构几规章
智能运动导游解决方案简介

一经发思询问又多软件,系统 IT,企业信息化 资讯,请关注自我之微信订阅号:

图片 2

作者:Petter Liu
出处:http://www.cnblogs.com/wintersun/
正文版权归作者和博客园共有,欢迎转载,但未经作者同意要保留这个段子声明,且当文章页面明显位置于来原文连接,否则保留追究法律责任的权。
该文章为又公布以自身之独门博客中-Petter Liu
Blog。

留下评论