最新要闻
- 天天微速讯:工信部发布5月打击治理“黑广播”“伪基站”情况及典型案例
- 6GB大显存亮机卡 英特尔A380显卡杀到759元了:I卡也能Yes
- 特立独行!德国电信挑战欧盟不合理规定:继续购买华为5G设备
- 环球速递!影驰PCIe 5.0 SSD升级提速近40%!最高可达12.4GB/s
- 总票房已超8亿元!动画电影《铃芽之旅》再次宣布密钥延期 世界最新
- 自驾游中出车祸 通用安吉星自动定位报警救车主
- 天天快资讯丨左转被直行撞责任图解(直行撞左拐谁的责任大)
- 环球简讯:高温天气来了,这份权益保护指南请收好
- AMD赞助游戏排斥NVIDIA技术?官方回应耐人寻味
- 北大教授姚洋反对中考分流:40%孩子锁定为低收入者 应10年义务教育 世界快报
- 在拳头中国工作有多爽?上班随时打游戏 老板不能打断
- 男子中近800万彩票后瞒着妻子:妻子要求分割_天天快消息
- 【聚看点】韩系车国内入冬!现代汽车集团CEO:缩减产品线 关停、出售工厂
- 篱落疏疏一径深树头新绿未成阴_篱落疏疏一径深
- 全球播报:恒大地产新增3条被执行记录 执行标的合计8.4亿元
- 全球今热点:危险!男子往保温杯加除垢剂和热水摇晃后爆炸
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
RTOS任务进行单元测试的4种策略
https://www.beningo.com/4-tactics-to-unit-test-rtos-tasks/
超过50%的嵌入式软件项目使用实时操作系统(RTOS)。不幸的是,使用RTOS会给使用现代开发技术(如测试驱动开发(TDD)、DevOps或自动测试)的开发者带来一些问题。例如,当开发者试图为他们的任务编写测试时,他们遇到的第一个问题是任务函数包含一个无限循环!任何直接调用任务函数的测试都会被认为是一个无限循环!因此,任何直接调用任务函数的测试将永远不会完成。这篇文章将探讨对RTOS任务进行单元测试的几种策略,其中包括:
【资料图】
- 循环的重新定义
- 完成信号
- 任务排除
- 通过OSAL使用主机线程(强烈建议)。
注意:在这篇文章中,我们将把任务和线程作为同义词。我们还将使用ThreadX作为RTOS的例子。
任务的剖析
在RTOS任务中,有几个部分用于管理任务行为。首先,初始化部分声明变量,实例化对象,初始化驱动程序,并负责将传递给任务的任何数据转换成正确的类型。接下来,有一个无限循环,执行所有任务的行为。例如,如果我们写了管理传感器的任务,我们希望任务的无限循环能定期检索和处理传感器的数据。最后,任务完成部分规定了任务完成后的情况。
典型的任务使用ThreadX可能看起来像下面的代码片段:
{ void Task_Sensors(ULONG ThreadInput) { // SECTION 1: Initialization (void) ThreadInput; SensorData_t SensorRawData; SensorData_t SensorData; SensorData_t pSensorDataTx = &SensorData; Sensor_Init(); // SECTION 2: Tasks main function / behavior / purpose while(true) { SensorRawData = Sensor_Sample(); SensorData = SensorProcess(SensorRawData); (void)tx_queue_send(SensorTxQ, (void *)&pSensorDataTx, TX_WAIT_FOREVER); tx_thread_sleep(TASK_SENSORS_PERIOD_MS); } // SECTION 3: TasK Completion Activities }
我发现,编写周期性任务的开发人员希望他们的任务能够无限期地运行,而没有考虑如果任务运行到完成会发生什么。
看看这个任务,你可以看到,如果一个开发者想在测试中对Task_Sensors进行调用,他们会遇到几个问题。因此,让我们来看看这些问题,并按照我经常看到的开发人员在达成最直接和最好的解决方案之前所尝试的各种策略。
参考资料
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
循环的重新定义
经常看到工程师部署的第一个战术是循环重定义。循环的重新定义是指根据代码是生产代码还是测试代码,对任务中的无限循环进行操作。例如,Task_Sensor的代码将被改写为如下内容:
void Task_Sensors(ULONG ThreadInput) { // SECTION 1: Initialization (void) ThreadInput; SensorData_t SensorRawData; SensorData_t SensorData; SensorData_t pSensorDataTx = &SensorData; Sensor_Init(); // SECTION 2: Tasks main function / behavior / purpose while(LOOP_STATE) { SensorRawData = Sensor_Sample(); SensorData = SensorProcess(SensorRawData); (void)tx_queue_send(SensorTxQ, (void *)&pSensorDataTx, TX_WAIT_FOREVER); tx_thread_sleep(TASK_SENSORS_PERIOD_MS); } // SECTION 3: TasK Completion Activities }
这个想法是,开发人员可以创建有条件编译的代码,以控制循环是永远运行还是一次。这段代码通常看起来像下面这样:
#ifdef PRODUCTION #define LOOP_STATE true #else #define LOOP_STATE false #endif
除了编译后的代码外,构建时还必须定义或不定义PRODUCTION宏。
一般来说,这不是使RTOS任务可测试的好方法,有几个原因。首先,我们正在测试的代码正在改变。我们的任务在测试过程中的行为会与运行时的行为不同。第二,我们正在添加有条件编译的代码,这通常不是很干净。第三,在定义宏的过程中,有可能出现人为错误。最后,虽然循环的重新定义对于Task_Sensor来说似乎很有吸引力,但测试任务的相互作用会变得过于复杂。事实上,如果我们需要循环运行三到四次会发生什么?我们现在需要为LOOP_STATE定义独特的定义。
完成信号
完成信号是对循环重定义思想的修改,允许任务无限期地运行,直到收到任务应该停止执行的信号。在这种情况下,任务代码被修改为删除宏定义,转而使用循环变量,如下图所示:
void Task_Sensors(ULONG ThreadInput) { // SECTION 1: Initialization (void) ThreadInput; bool isRunning = true; SensorData_t SensorRawData; SensorData_t SensorData; SensorData_t pSensorDataTx = &SensorData; Sensor_Init(); // SECTION 2: Tasks main function / behavior / purpose while(isRunning) { SensorRawData = Sensor_Sample(); SensorData = SensorProcess(SensorRawData); (void)tx_queue_send(SensorTxQ, (void *)&pSensorDataTx, TX_WAIT_FOREVER); tx_thread_sleep(TASK_SENSORS_PERIOD_MS); isRunning = Task_GetDesiredRunState(TASK_SENSOR); } // SECTION 3: TasK Completion Activities }
正如你所看到的,在任务结束时,我们检查该任务是否仍在运行。这就解决了运行多个循环的问题,并通过删除宏来清理代码。然而,我们现在已经为任务的运行引入了复杂性,并为内存损坏或单一事件干扰(SEU)打开了机会,以改变isRunning的状态并完成我们的任务。
任务在生产中运行到完成似乎不是什么大问题,但不是所有的实时操作系统都能优雅地处理这个问题。例如,如果你允许FreeRTOS的任务运行到完成,内核就会窒息并停止执行所有的代码!
任务排除法
当我们不测试我们的任务时,任务排除就发生了!我们不需要测试任务!而不是试图从测试线束中调用任务,我们创建测试来运行任务本身的代码。 任务排除要求我们重写我们的函数,使其看起来像下面这样:
void Task_Sensors(ULONG ThreadInput) { // SECTION 1: Initialization (void) ThreadInput; Task_SensorInit(); // SECTION 2: Tasks main function / behavior / purpose while(true) { Task_SensorRun(); tx_thread_sleep(TASK_SENSORS_PERIOD_MS); } // SECTION 3: TasK Completion Activities } /********************************** * Placed in a different module **********************************/ void Task_SensorInit(void) { SensorData_t SensorRawData; SensorData_t SensorData; SensorData_t pSensorDataTx = &SensorData; Sensor_Init(); } void Task_SensorRun(void) { SensorRawData = Sensor_Sample(); SensorData = SensorProcess(SensorRawData); (void)tx_queue_send(SensorTxQ, (void *)&pSensorDataTx, TX_WAIT_FOREVER); }
老实说,上面的代码就是任务应该有的样子。这段代码非常干净,也很容易理解。但问题是,我们是通过尝试使用一种不太理想的技术来达到这个目的的。
我们现在在Task_Sensors中看到的任务代码非常简单,任务排除会说我们不需要测试它。因此,相反,我们将在我们的测试线束中测试Task_SensorInit和Task_SensorRun函数。毕竟,这些函数被保存在一个单独的模块中,所以我们可以将任务代码从测试线束中排除,实现我们所期望的100%的代码覆盖,对吗?
任务排除的问题是,在我们在目标上运行应用程序之前,我们永远不会测试任务代码。不幸的是,我们也欺骗自己,认为我们的测试覆盖了所有的代码。
优点是我们可以根据需要从测试中调用任务中的函数。我们已经实现了这一点,并避免了需要处理无限的while循环的问题。代码更加简洁,我们也没有创建一堆条件性编译语句。
虽然这种技术可以使测试任务代码更容易,但从技术上讲,它不是在测试任务代码。相反,它是一种变通方法。为了测试你的任务代码,你应该尝试在你的主机上创建一个线程或任务,并在那里运行这些代码。
通过OSAL使用主机线程(强烈建议)。
测试RTOS任务的真正问题与大多数任务有while语句的事实无关。相反,这个问题来自于开发者对测试的思考和方法。到目前为止,我们所研究的所有策略都假定我们想直接从我们的测试线束中调用Task_Sensors。这就是问题所在。在我们的测试线束中,我们想创建一个运行的Task_Sensors任务或线程,而不是进行函数调用!这就是问题所在!
我们测试困境的根本原因是,开发人员没有利用操作系统抽象层(OSAL)。相反,他们直接进入RTOS的API并使用这些API。虽然调用RTOS APIs很快,而且似乎是一个很好的方法,但它是将RTOS与应用程序代码紧密地耦合在一起。这种耦合使得测试正确使用任务或线程的应用程序代码变得非常困难。
最佳的方法是将RTOS的细节隐藏在操作系统抽象层(OSAL)的后面。例如,如果你检查我们到目前为止所看到的各种版本的Task_Sensors,你会发现我们正在使用ThreadX tx_queue_send API来发送消息到队列。因此,我们应该把这些细节放在OSAL后面,这样我们的任务就会像下面这样:
void Task_Sensors(ULONG ThreadInput) { // SECTION 1: Initialization (void) ThreadInput; bool isRunning = true; SensorData_t SensorRawData; SensorData_t SensorData; SensorData_t pSensorDataTx = &SensorData; Sensor_Init(); // SECTION 2: Tasks main function / behavior / purpose while(true) { SensorRawData = Sensor_Sample(); SensorData = SensorProcess(SensorRawData); (void)OSAL_Q_Send(SensorTxQ, (void *)&pSensorDataTx, OS_WAIT_FOREVER); tx_thread_sleep(TASK_SENSORS_PERIOD_MS); } // SECTION 3: TasK Completion Activities }
OSAL_Q_Send是一个抽象,我们的应用程序代码使用它来发送队列中的数据。应用程序不应该关心我们是否在使用ThreadX、FreeRTOS、pthread或任何其他RTOS或任务调度器。根据我们想要编译代码的系统,会提供一个实现文件。这样做有很多好处,比如说:
- 应用程序不与实时操作系统相联系
- 测试可以使用主机的线程框架
- 应用程序是可移植和可重复使用的
- 避免了临时性的和黑客式的测试方法进行测试。
对于许多对使用DevOps和自动测试线束感兴趣的开发者来说,你可能至少有针对你所选择的RTOS和pthread的实现,pthread是Linux的POSIX线程库。不幸的是,我们如何使用pthread以及设计和构建OSAL已经超出了今天的范围,但我们将在未来探讨这些话题。
现在,如果你有兴趣看一些OSAL的例子,我推荐你看一下CMSIS-RTOS-V2和NASA的Aeronautics GSC-18730-1。有可能,对于你的需求来说,这些都是过剩的,但它们是完全实现OSAL的好例子。我建议探索它们,并慢慢设计和建立你的OSAL,你可以在你所有的应用程序中使用。
小结
有几种策略可以让开发者用来对任务或线程进行单元测试。正如我们在今天的文章中所看到的,大多数开发人员可以部署的战术都是针对未能将其任务架构为使用OSAL的变通方法。一旦有了OSAL,任务代码就可以通过提供抽象层背后的必要功能,使用任何RTOS或本地线程库进行测试。OSAL层有助于:
- 简化测试策略
- 保持代码的清洁
- 提高灵活性、可移植性和重用性
如果你想测试你所有的代码,那么通过OSAL来利用pthread是最好的方法。
关键词:
RTOS任务进行单元测试的4种策略
天天微速讯:工信部发布5月打击治理“黑广播”“伪基站”情况及典型案例
6GB大显存亮机卡 英特尔A380显卡杀到759元了:I卡也能Yes
特立独行!德国电信挑战欧盟不合理规定:继续购买华为5G设备
环球速递!影驰PCIe 5.0 SSD升级提速近40%!最高可达12.4GB/s
总票房已超8亿元!动画电影《铃芽之旅》再次宣布密钥延期 世界最新
自驾游中出车祸 通用安吉星自动定位报警救车主
Spring Boot 调用外部接口的 3 种方式,还有谁不会?!
世界讯息:如何做mysql调优?绝命7招,让慢SQL调优100倍
浅析GeoServer CVE-2023-25157 SQL注入_全球热消息
java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
天天快资讯丨左转被直行撞责任图解(直行撞左拐谁的责任大)
环球简讯:高温天气来了,这份权益保护指南请收好
AMD赞助游戏排斥NVIDIA技术?官方回应耐人寻味
北大教授姚洋反对中考分流:40%孩子锁定为低收入者 应10年义务教育 世界快报
在拳头中国工作有多爽?上班随时打游戏 老板不能打断
男子中近800万彩票后瞒着妻子:妻子要求分割_天天快消息
【聚看点】韩系车国内入冬!现代汽车集团CEO:缩减产品线 关停、出售工厂
篱落疏疏一径深树头新绿未成阴_篱落疏疏一径深
环球焦点!发力电子后视镜CMS,芯驿电子与映赛科技达成战略合作
债市日报:6月21日 天天速看
全球微动态丨【财经面对面】平安健康互联网医院院长杨昆:加快AI赋能 打造O2O医疗健康服务
【金融街发布】人民银行:深入推进金融系统审计整改工作
全球播报:恒大地产新增3条被执行记录 执行标的合计8.4亿元
全球今热点:危险!男子往保温杯加除垢剂和热水摇晃后爆炸
端午节后连上6天班 专家称调休多上一天班提高不了效率
环球新资讯:杭州一男子绿化带内迷路四天三夜:吃野花喝露水求生
你相信光吗?FF91交付推迟 贾跃亭激情发文回应:加速中国落地等_世界观察
AI化身“印钞机”!扎克伯格等4位富豪因其暴赚10000亿_环球快看
湖北省商务厅第七届中俄博览会出访行程公布
MyBatis-Plus 实现动态字段排序|播资讯
环球热点评!【技术积累】数据结构中的基本概念【一】
多卡训练_环球热闻
快看点丨记录--新的HTML标签 :
每日看点!安徽35岁女子在上海相亲,被62岁大爷相中,直言每月给30万零花钱
什么是核心素养?
每日热门:空气循环扇和传统风扇怎么选?别再被商家忽悠了
印度德里地铁将支持手机二维码乘车 网友:遥遥领先 焦点关注
当前热文:马斯克又出惊人语录:做生意是为了促进和保护人类文明
苹果受益!国产手机在德国等欧洲市场没法卖了:诺基亚用专利封杀 世界百事通
焦点热议:腾讯《三体》编剧:奈飞版《三体》一集的预算能拍我们一整部 技术太落后
312斤女网红在减肥营离世,专家:减肥不当会闭经,每周减重不要多于1Kg-时快讯
不请自来!哪些猫咪品种经常光顾邻居家?_今日精选
环球微头条丨AI教你实现敏捷游戏自由,再也不用担心陷入瓶颈啦!
Linux Powershell 安装教程 天天快播报
C#语言async, await 简单介绍与实例(入门级) 当前聚焦
北向资金全天小幅净卖出6.41亿元 时讯
读懂“中文大脑”,破解阅读障碍
信用卡逾期收到律师函怎么办?信用卡逾期律师函来了后果严重吗?
新动态:彩票为什么不能网上卖_彩票为什么不能网上买
首款骁龙8 Gen2平板要来了:内置散热风扇 游戏神器|环球今头条
每日报道:AI血洗时尚圈!就连这些线上店家都开始用AI生成爆款了
电池有缺陷被特斯拉踢出供应链?宁德时代辟谣:消息不实
宣告放弃LCD材料!三星、LG供应商默克集团全力研发MicroLED等新材料
天天速讯:高考查分遇上端午假期:31省成绩23日起陆续公布
台电P76t_台电p76v
红楼梦摘抄400字_红楼梦摘抄
【全球新视野】柔道著名运动员(郝义 柔道运动员)
五证一书指什么生肖(五证一书指什么)|世界最新
A股分红派息转增一览:43股今日股权登记
每日焦点!苹果或重新发明苹果汽车安全带:打造发光安全带扣
又瞎折腾!Windows 11将删除9个文件夹选项
帮人就是帮己!西南大学校长毕业寄语被狂赞:外卖别随意给差评 大胆扶摔倒老人_环球观焦点
keycloak~CountDownLatch在keycloak中的使用 资讯推荐
高精度离线免费 的C#文字识别PaddleOCR库|速递
环球快讯:星纪魅族官宣参展2023 MWC上海:Flyme Auto、魅族20系列重磅登场
每日热文:余承东大喜!工信部:支持L3级及更高级别自动驾驶功能商业化应用
鲜嫩入味 Q弹不柴:驰迈即时鸡胸肉50g*5袋9.9元_天天看点
全球时讯:《闪电侠》预示华纳影业面临巨大亏空
环球今热点:国服关停5个月后:成都猎人队宣布彻底退出《守望先锋》联赛
全球简讯:即视角|出海正当时:欧美、东南亚、中东、拉美市场观察
参展动态 | 璞华参展第九届中国(上海)国际技术进出口交易会-全球关注
国泰君安:5月挖机销量略超预期,静待下半年行业复苏
致命摇篮下载 1080p 下载 致命摇篮迅雷下载 全球微动态
【世界新视野】京雄大桥顺利合龙!京雄高速将于年内全线通车(图)
【快播报】印尼很快将不再出口原铜因希望从资源中寻求更多价值金十数据6月21日讯,印度尼西亚总统佐科当地时间周二表示,该国很快将不再出口原铜,因为这一金属将在国内
首销仅售32元:3DMark登陆Epic商店
国内油价冲破上调红线!端午节过后涨价可能性很大
笔记本存储“官方升级”谁最贵最坑?对比后揭晓答案 新资讯
免费玩!国产大作《仙剑奇侠传7》即将登陆XGP订阅服务-当前短讯
演员陈建斌多巴胺穿搭引热议 律师:AI换脸侵犯肖像权
全球热推荐:官宣!NBA历史第一高薪即将诞生,哈登交易方案,勇士3人离队
万能u盘低级格式化工具下载_u盘格式化工具下载-世界热推荐
关于在Redhat-7-linux-系统-Apache-2.4.6-版本上部署多个版本的yum仓库-的配置文件写法
【Java】使用 validation 完成自定义校验注解 今日热文
性能提升30%!袋鼠云数栈基于 Apache Hudi 的性能优化实战解析|世界新视野
视频直播源码技术知识分享:连麦功能(一)
环球即时看!ClickHouse(14)ClickHouse合并树MergeTree家族表引擎之VersionedCollapsingMergeTree详细解析
北汽极狐成立法务部:200万粉丝知名汽车博主收到“告知函” 快资讯
中国首位!科学家付巧妹获联合国阿勒福赞奖-全球快播
226元大额券:361板鞋运动鞋休闲鞋74元抄底|全球百事通
离大谱!男子偷马路卖钱:把路分成小块去卖 天天时讯
3岁女童患罕见病 肚大如石鼓随时会“爆炸”:医生科普 续命针1次上万-环球快播
当前滚动:【后端面经-java】java线程池满的处理策略
Rust语言 - 接口设计的建议之受约束(Constrained)_天天最资讯
java~理解可重入锁 焦点速读
硬件博主自费实测5大旗舰手机信号:iPhone各种被狂虐
焦点热文:载亿万富翁观光潜艇失联 被曝用游戏手柄操控 专家:生还希望渺茫
电动汽车也能无线充电了:像手机一样简单 超大充电板长这模样
全球热议:微软停止涨薪影响明显:员工跳槽意愿上涨23%