2020-12-07

卫星测试科普(三):卫星载荷的核心测试设备探秘 总的说来,卫星芯片与元器件,部组件与单机,整机与子系统,系统与整星的设计、定型、制造、验证、总装、发射、在轨等环节都离不开各种测试场景,对于这些卫星测试场景而言,“射频三大件”与高速数字示波器是构成强大测试系统的基础。卫星通信信号生成:覆盖Ka、Q等波段,具备扫频、脉冲、数字调制、噪声信号、雷达信号、数据链信号、OFDM 等多种信号库,用于测试和验证卫星电子设备的电气性能、频率响应、抗干扰能力等。卫星的通信需要高效、快速地传输大量数据,高速信号的质量至关重要,如果卫星信号不佳,卫星就会出现故障或者隐患。 阅读详情

ucosⅡ分析——同步机制

  uCOS同步机制的硬件支持是一个比较坏的方案——关中断,不过由于uCOS的应用领域是单核的嵌入式实时机器,关中断的无法用于多核情况的弊端可以忽略;但关中断的时间消耗还是让效率有所下降(可能是成本较高导致原子操作的底层支持没有)!至于其实现方案和细节下面会仔细陈述;另外在最后讲述一些关键却零碎的关键点。

1 实现的机制

同步机制主要通过事件的释放和等待操作实现,(取消)挂起任务作为事件实现同步机制的补充。事件的具体实现一共有邮箱(mail box)、互斥锁、信号量、消息队列和标志组五种形式;以释放和等待操作含义划分可以分为三种:
① 消息的放入和取出。邮箱和消息队列的释放操作是将消息放入相应的结构中;而等待就是取出一个消息,不过若无消息则进入阻塞状态。
② 资源的释放和占有。信号量和互斥锁的释放操作是将占有的资源释放,将事件所代表的资源数加一;而等待就是占有事件中资源的一份,不过若无空闲资源则进入阻塞状态。(互斥锁有特殊的地方)
③ 状态的更新和匹配。标志组的释放操作是以指定的模式和状态去更新标志组的标志状态,若更新后其阻塞队列中任务等待的标志状态有与之匹配的标志则将其转变就绪状态(可能改变多个任务的状态),并在最后任务调度一次;而等待是以一个特定的标志状态去匹配标志组的标志状态,若不匹配则进入阻塞。
  前两种在释放的最后将其阻塞队列中优先级最高的任务转变成就绪状态,并也进行一次任务调度。特别注意,三种类型释放将等待任务转变到就绪状态的最大前置条件是,任务没有因其他情况被阻塞,在uCOSⅡ中,其他情况只可能是被挂起(零碎点会讲为什么)!

2 实现细节

  在这五种实现中,除了消息队列和FLAG_GRP标志组实现,event结构体可以表示所有的事件。其属性event type记录了事件的类型(宏定义规定值和类型的映射);属性OSEventPtr指针指向邮箱的信息或指向占有互斥锁的任务控制块、消息队列的实质结构;属性OSEventCnt有些特殊,在信号量时它代表资源的数目;而在互斥锁的时候低八位表示占用锁任务的优先级,高八位表示防止优先级导致而预备的较高优先级,另外,互斥锁还用OSEventPtr指向占有锁的进程。
  除了互斥锁,OSEventPtr和OSEventCnt在一个事件里,只有一个有效。值得一提的是,互斥锁预备的较高优先级是其占用的,也就是说在此互斥锁在系统中仍存在时,互斥事件的OSEventCnt所代表的两个优先级有一个不能给实际任务使用,这导致了稀有资源优先级的减少,因此在设计的应用中存在互斥锁时要考虑优先级是否够用(除非设计逻辑上避免了优先级倒置的现象发生)。
  一些以_DATA为后缀的事件结构体的存在,仅仅是为了更好地;更具体地表示特定一类事件类型,以供用户进程查询;这也是为什么所有事件实现的方法中都提供XXX Query函数。
  而特殊的消息队列和标志组的细节如下所示:
① 消息队列:
  a) 结构体。其实质是一个指向消息指针的指针数组,不过其封装了下一条插入、获取消息的地址(实际上还是数组中的一个);并有着数组首尾(尾是一个无效地址即不在数组内)地址和队列目前信息数量的信息。这些信息提升了消息队列操作的效率。
  b) 对event的依赖。不过其数据结构存储在event结构体之外,并通过event的OSEventPtr记录其存储地址;之所以不完全脱离event,是因为它需要借助event了解具体有哪些进程在等待它。

② FLAG_GRP:
  a) 数据结构。FLAG_GRP结构体由一个标志状态、事件标识和指向阻塞队列指针组成。标志状态是一个16位的数,其取决于OS_FLAG_GRPS被定义多长字节的数据类型。
  b) 独立性。FLAG_GRP同步实现是不属于event体系的一种事件实现,其没有依赖event结构体存储等待队列,甚至连事件类型都是FLAG_GRP结构体自身存储;另一方面,event体系阻塞队列中的任务都是等待同一个事件,但FLAG_GRP中的阻塞队列task等待可以是不同的事件,这是一个本质区别!而这个区别是依赖FLAG_GRP的阻塞队列的结构。
  c) 阻塞队列结构。其结构是一个链表,而每个节点存储了一个等待任务和其期望的标志。但特殊的是每个等待的进程所期望的标志状态可以不同,即16位0/1可以的组合可以不同!

3 零碎的关键点

  首先简单介绍一下,系统如何识别任务的状态。识别机制是依靠TCB中状态字(OSTCBStat)属性,其二进制上的每一位的值表示任务是否处于某一个状态(状态可以组合),第一位的值若是1则代表着任务状态属于第一位所规定的状态;而当每一位均为0的时候,进程便是就绪状态。而第几位隐喻任务属于哪一类状态,请参考图2-1。值得注意的是,不同任务状态的二进制上的1是无任何重叠的,因此系统允许状态组合,不过仅存在一个事件类型状态和悬挂的阻塞状态组合(由于休眠状态没有任务状态,所以没有算),接下来详细论述。

  其次论述,不考虑休眠状态,uCOSⅡ中的进程只可能同时因一个事件和悬挂而阻塞。由于事件等待若超时,事件等待的队列中会删除进程,进程的任务状态同时会移除相应事件的任务状态,即将当前任务状态与上对应的事件任务状态字(OS_EventTaskRdy的功能),因此task及时在等待超时后去等待另一个事件,其任务状态字和阻塞队列中只会显示等待一个事件。而悬挂和事件体系是独立的;且在task在等待事件的同时,其他任务可以悬挂其;因此进程最多同时因等待一个事件和被悬挂而阻塞。
  最后抛出并解决一个关键问题——等待事件的进程如何获得事件的句柄?这个问题是同步机制的第一步,而且本来很好解决,只需要在事件数组中索引检索即可,但是由于uCOSⅡ的事件建立和删除都是在事件的空闲事件链表(线性数组)的头进行操作,即使是有单独的空闲链表的消息队列和标志组也是如此;在多任务情况下无法预计事件数组中某一特定位置的事件一定是假设事件!因此从全局变量事件数组中获得是不可靠、不可行的。我研究出解决该问题的可行方案有两个:
① 父进程建立子进程的时候将事件的句柄作为参数传递给子程序。考虑到嵌入式系统中大多以作业为单位允许,即一个父进程构建一些子进程完成一个任务的情况,该方案可以满足绝大数需求,但是比较大型的应用中作业间同步无法获得,而方案二可以解决这个问题。
② 规定一个空闲的内存地址为事件的首地址,并用内存控制块管理其整个数据结构的内存空间;而且事件的拥有者不依赖系统创建和删除事件。该方案其实破坏了事件的封装性,但可以事件作业间通讯同步的第一步。

华为OD机试双机位C卷:打印机队列 (C++/Py/C/Java/Js/Go) 华为OD机试双机位C卷 打印机队列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 打印机队列。 阅读详情

相关推荐

使用pytorch构建LSTM_AE模型的两种方式

2.基本LSTM_Unit计算——基本LSTM_AE结构 3.自定义LSTM_Unit计算——自定义LSTM_AE结构 1.LSTM-Encoder-Decoder模型结构及简要解析 图基本lstm计算单元

qq_37840762的博客 7273

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万+

IC617多线程仿真卡死?手把手教你用TigerVNC替换解决ADE XL Explorer问题(附Manjaro/Centos8实测)

本文针对IC617在Manjaro、CentOS 8等高版本Linux系统中运行ADE XL Explorer进行多线程仿真时出现的卡死问题,提供了详细的诊断与解决方案。文章指出问题根源在于软件内置的旧版VNC组件不兼容,并手把手指导用户通过使用TigerVNC替换原组件来彻底解决,附有在Manjaro和CentOS 8系统上的实测步骤与验证方法。

hill8的博客 774

2020.12.07

实验室每日一题 2020.12.07 先用pe工具检查程序有没有加壳,发现有upx壳: 用工具脱壳(没有的话百度上下载个upx然后配置下环境变量就能用了): 然后把程序丢进ida里面,开始逆向。因为内容比较多,先搜索字符串,发现了这两段话: 先看第一个,刚开始看着感觉像16进制,后来发现不对,然后用base16解码可以得到一个蓝奏云链接,但是需要密码,密码就是第二张图上的钥匙。下载可得到一个word文档。打开后先查看隐藏文字,发现末尾有一串空白,将字体颜色改为黑色可以得到: 把中文逗号改为1,英文

wind_sail的博客 250

[机器学习] 第二章 模型评估与选择 2.ROC:roc_curve原理及源代码详解

代码见:https://github.com/Carrie-Yi/machine_learning/tree/main/roc_curve

心宝的博客 1493

从 Claude Code 到 SAP ADT,vibing-steampunk 把 ABAP 开发带进 Agentic 工程现场

vibing-steampunk(vsp)是一个连接SAP ADT API与AI编码代理的桥梁工具,通过MCP协议实现ABAP开发的自动化。它绕开传统GUI脚本方式,直接利用ADT REST API进行代码读写、调试和部署。该工具提供包分析、边界检查、LUW分析等功能,并创新性地采用Hyperfocused模式和方法级编辑来优化token使用效率。通过上下文压缩技术,vsp能智能提取关键代码片段,显著提升AI处理ABAP代码的精准度,为SAP系统现代化改造提供了高效的技术路径。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值