基于BREW平台松耦合设计V-USBApp的设计和权衡

从‘最速控制’到代码:深入拆解韩京清ADRC中TD跟踪器的fhan函数(含Matlab/Simulink实例) 本文深入解析韩京清ADRC中的fhan函数,从理论到代码实现,详细拆解其在Matlab/Simulink中的应用。通过分析最速控制问题和非线性TD的连续形式,揭示fhan函数在信号处理和噪声抑制中的独特优势,并提供工程实践中的参数整定和优化技巧。 阅读详情

基于BREW平台松耦合设计V-USBApp的设计和权衡

毛晓冬 2008-5-7

一、        概论:

本文通过一个新模块USB App的设计,探讨了一些基本的设计思想和原则,同时说明了思想和原则的使用有时必须权衡复杂度。

 

二、        需求说明:

目前我们手机进入U盘模式的设计是通过进入Setting菜单选择后进入。但是现在主流手机的实现,都是在任意界面插入USB数据线后,自动弹出选择框,供用户选择进入U盘模式。我们的期望也是设计成如此,但同时又是有条件的弹出选择框,即,某些界面允许立即弹出(如IDLE,MainMnu等),某些界面不允许弹出框(如正在下载BREW App时),某些界面需要延迟弹出(比如,正在发送短信时插入USB,需等短信发送完毕后才弹出选择框)。

 

三、        为何不这样设计:

基于上面的需求,我们最直觉的设计可能是这样的:哪些应用对是否可以弹出USB模式选择框有特殊要求的,那么我们就对他们做特殊处理。可以利用发事件的方式,因为我们知道这些特殊应用的CLSID,根据他们对事件处理的返回值,可以判断当前这些特殊应用是否允许USB App启动。 或者直接调用某些特殊应用提供的API,来完成冲突的特殊处理,比如MP3_Suspend,Mp3_Resume等。

但是这种设计根本不能成为方案,是很糟糕的,为什么?

这是耦合! 模块间必须是透明的,所以冲突处理必须是框架性的,而不是特殊的针对某个模块。否则,特殊模块的变化,会直接导致冲突处理的变化。

向特定的已知的CLSID的App发送事件,或者调用已知的App提供的API。 这种特殊性,使得其不能成为一种框架,甚至是方案,因为无法抗变化,因为是App-Spec的。

试想,当参与冲突的App减少时,可能出现编译无法过,因为CLSID不存在,或者API不存在,USB App需要改。 当参与冲突的App增加时,USB App需要改,因为需要调用新增加的API或者向新的CLSID App发送事件。更何况这种变化甚至允许发生在运行期!

这种不期望的更改的发生,就是由于耦合的存在,导致了变化点无法封装。

 

四、        应该如何设计:

这里,我们可以看到,变化点其实就是参与冲突的App。 所以,需要把该变化点封装起来,即,不管参与冲突的App的增加和减少,甚至是运行期的增加和减少,以及冲突处理策略的变化 都被隔离, 不影响到USB App。 如何隔离那? 那就是要使得这一 对 多的关系彻底不可见, 即, USB App 与哪些 参与冲突的 APP交互 完全不可见, 只是在运行时动态的绑定。

此时就需要制定冲突的框架,每个参与冲突的模块,自觉遵循该框架(规约),以此,达到相互“完全陌生”的情况下,实现冲突处理。

这个框架是一个一对多的框架,负责把一 对 多的通信间的耦合解除。 所以可以借鉴 Observer 方式。

首先,我们将USB App抽离出UI逻辑和业务逻辑,业务逻辑由IUSBEx扩展接口完成,UI逻辑由USBApp完成。 

接着,IUSBEx提供AddInterester 和 RemoveInterester API供冲突感兴趣的观察者 注册 和 取消。 

最后,当USB数据线插入事件发生时,USB App会通知所有这些观察者,并根据反馈,决定下一步操作。 由于注册 和 取消是在运行时发生的,所以,USB App和 其他模块只是在运行时才绑定,所以是松耦合。

 

五、        设计的权衡:

为何不实现成完全的Observer模式,即,单独抽出一个接口,作为被观察者接口 IUSBSubject, 感兴趣的模块向该接口注册, 通知的发生,是由IUSBSubject内部去通知各观察者,并反馈结果给USB App(即整个冲突处理策略完全封装在接口内部),而不是直接由USB App去完成冲突处理。 这是基于复杂度的权衡, 因为系统相对简单,没有必要为了分层而分层,为了使用模式而使用模式。需要知道实现成完全的Observer,没有直接的事件通知和反馈简单。

六、        如何抵抗变化:

由于目前的冲突处理是松耦合的,一 对 多的通信被解耦,并且USB App的UI和业务逻辑分离。所以不管哪个变化点单独变化,都不会影响无关的方面。比如当修改USB弹出界面的UI时,不会影响其他方。 当有新的应用加入冲突处理行列,或退出时,对USB App包括IUSBEx 业务逻辑没有任何影响,不需要做任何变化。

七、        总结:

本文通过USBApp的设计,探讨了应该如何设计,而不该如何设计,以及相应的原因,以此突显一些重要的设计思想。

目前,该设计框架已经运用于后续的项目中。

康耐视CogPMAlignTool模板匹配详解 康耐视CogPMAlignTool是一款基于边缘特征的模板匹配工具,适用于工业视觉检测。该工具提供PatMax、PatQuick、PatFlex等不同算法,分别对应高精度、快速匹配和柔性表面等应用场景。关键参数包括特征粒度(粗糙/精细)、边缘阈值、弹性范围等,支持旋转缩放匹配和极性忽略功能。工具操作流程包括图像采集、参数设置、模板训练和运行检测,通过调整查找概数、接收阈值等参数可优化识别效果。配套的卡尺工具(CogCaliperTool)通过一维投影和边缘筛选实现精准定位,适用于高精度尺寸测量场景。 阅读详情

相关推荐

Unsloth Desktop 本地大模型微调量化实战指南

大语言模型的本地化定制正在成为开发者与内容创作者的重要需求,而微调与量化则是其中最关键的两项技术。LoRA 与 QLoRA 通过仅训练少量低秩矩阵,大幅降低显存占用和训练成本,让消费级 GPU 也能完成模型适配;GGUF 格式则打通了训练与推理的边界,使微调后的模型可直接接入 Ollama、llama.cpp 等主流推理引擎。本文以 Unsloth Desktop 为切入对象,从其底层加速原理出发,梳理了环境准备、模型加载、对话测试、量化导出、微调验证及 API 批量调用的完整链路,并针对显存优化、端口冲突

weixin_29055137的博客 397

IPC(进程间通信),Remote Call(远程调用),IDL(接口描述语言)架构及其在BMP(BREW移动平台),Android中的应用浅析

<br /><br />由于本人才初识BMP和Android,所以仅仅是自己的一些肤浅认识,难免有错误,欢迎指正。<br /> <br />首先我们看IPC,现代操作系统都是多进程,多线程的。进程间存在地址边界,无法直接跨越。所以,两个进程间无法进行直接的请求,传递和调用。IPC是操作系统内核提供的一种跨进程的机制,允许两个进程间使用IPC来传递数据。 虽然某些情况下我们可以将Service直接加载到自己的进程中调用服务,此时可以进行简单的本地调用(Local Call),但是,从安全,性能和共享的角度出发

东方欲晓的专栏 3749

C语言由scanf(“%d“,)非法输入字符造成的死循环及其解决方案

声明:此文章仅作为C语言学习历程中的思路整理,用于解决入门阶段较为浅显的问题,如有错误还请指正。 现象描述: 代码要求实现用户输入1或2,通过scanf("%d",&a)读取这个值,从而判断分属于1或2的两种情况。输入非1,2的数字都应该返回"Invalid Number!",并且要求重新输入数字。 while(a!=1&&a!=2) { printf("Invalid Number!\n"); printf("Enter the number:"); scan

weixin_49764077的博客 8717

BREW Notify机制使用注意点

<br /><br />BREW Notify机制使用注意点<br />毛晓冬<br />2007-10-12<br />一、注册Notify的注意点:<br />       a. 注册方式:<br />BREW中有两种注册Notify的方式,一种是在MIF文件中Add Notification,一种是在代码中通过调用ISHELL_RegisterNotify来显式的注册Notify。MIF文件中注册的Notify,从BREW初始化后就开始生效,所以从此刻开始,App就可以收到Notification,即

东方欲晓的专栏 1626

ESP-Mesh-Lite vs ESP-Mesh:如何选择适合你的物联网组网方案?

本文深入对比了乐鑫ESP-Mesh-Lite与ESP-Mesh两种物联网组网方案的核心差异。重点解析了ESP-Mesh-Lite分布式协议栈架构的优势,即每个节点拥有独立IP,可直接访问外部网络,极大简化了应用层开发。文章从网络架构、性能、开发体验及适用场景等多维度进行分析,为开发者根据项目需求(如分布式数据采集、智能家居或集中控制网络)选择最合适的方案提供了清晰的决策框架。

pluto的博客 815

集成calibre到cadence virtuoso环境中 load: can‘t access file - “/opt/eda/Mentor/lib/calibre.skl“

项目场景: 设想是将Calibre集成到cadence virtuoso中,但网上的解决办法尝试过在本机上实验都有点问题,因此想记录下来我的解决办法仅供参考。 问题描述: 安装好cadence, calibre之后打开virtuoso,CIW窗口显示 *Error* load: can't access file - "/opt/eda/Mentor/lib/calibre.skl" 问题是出在calibre.skl的加载路径出错,尝试网上的在工程目录下修改.cdsinit文件,添加calibre安装

weixin_52714276的博客 1万+

比较BMP和Android的RPC机制

RPC机制是现代系统的重要的一种机制,和IPC有关,却又没有必然关系。 RPC是更广义的,更高层的,为解决异构/非本地对象/过程调用而形成的一套解决方案,其目的重在解决如何让远程对象/过程的访问可以如同本地对象/过程那般,将真正的差异性向上层客户隐藏。   而IPC仅仅是

东方欲晓的专栏 1502

2024年数字IC秋招-速腾聚创-数字芯片验证工程师-笔试题

笔试题型:单选 + 问答题笔试平台:牛客(手机+电脑监控)笔试时间:1hA. len取10的概率是1/2;B. len取10的概率是1/3;C. len取10的概率是1/4;D. len取10的概率是1;

qq_42135020的博客 1396

BREW与面向对象的比较

<br /><br />BREW与面向对象的比较<br />毛晓冬2007-6-13<br />一、    概述:<br />虽然BREW的整体框架是基于接口体系,是面向对象的。但是和C++,C#,Java不同,这些语言的面向对象是语言(编译器)层次上的支持,而BREW的面向对象是实现层次上的支持(BREW的框架是以纯C实现面向对象的体系)。由于支持的层次不一样,所以仍然存在着很大的差异性。<br />我们有必要了解这些差异性,不能直接拿传统面向对象语言的特性来同等的看待BREW,那样有时可能存在偏差,可

东方欲晓的专栏 1359

PSINS工具箱学习(四)捷联惯导更新算法

原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning。

实践出真理,接毕设/课设项目开发指导 604

Python内置函数zip()——《Python内置函数手册》Python老吕编著

zip()函数是 Python 中的一个内置函数,用于将多个可迭代对象(如列表、元组、字符串等)中对应的元素打包成一个个元组,然后返回由这些元组组成的迭代器。zip()函数常用于将多个序列并行迭代,或者用于数据对齐。zip()它返回一个迭代器,这意味着你可以逐个获取打包后的元素,而不是一次性将所有元素加载到内存中。如果输入的可迭代对象长度不一致,zip()会以最短的可迭代对象为准,只打包到最短对象的末尾。它可以用来并行迭代多个序列,使得代码更加简洁和高效。在接下来的章节中,我们将详细介绍。

Python老吕的博客 680

BREW(包括BUIW)引用计数及内存使用规则

<br /><br />BREW(包括BUIW)引用计数及内存使用规则<br />毛晓冬2007-1-26<br /> <br />一、概述:<br />BREW使用COM的引用计数机制在多个客户间同时共享一个接口的实例,保证各个客户在使用期间,该接口实例始终有效,而不管其他客户是否已经使用完该接口实例。只有当所有客户都结束使用时,该接口的实例才会被释放。<br />该机制使得我们必须正确操作接口的引用计数,否则会造成内存泄漏,或者重复释放等严重问题。<br />所以,我们需要掌握引用计数的使用规则和注意点

东方欲晓的专栏 1280

芯擎SEC1000芯片参数详细介绍

随着龙鹰一号的不断进化和应用,未来的智能座舱将不仅仅是显示和控制的集成,更是人与车之间的一种默契和无缝交互的体现。在汽车行业迈向智能化和电动化的浪潮中,座舱已不仅仅是一个驾驶者的操作空间,而是逐渐演变为一个集娱乐、信息、控制于一体的智能交互平台。今天的汽车不仅需要强劲的动力和炫酷的外观,更需要一颗强大而智能的“心脏”来支撑复杂的座舱体验和安全驾驶需求。想象一下,未来的汽车不再仅仅是交通工具,它将成为你的移动私人管家,了解你的习惯,甚至提前预测你的需求。让我们一起走进龙鹰一号的世界,探索智能座舱的无限可能!

weixin_43199439的博客 1722

BREW和Android的安全思想

<br /><br />理论上,所有的公众(公开)实体,都需要安全机制保障, 比如网络。 从分层角度而言,每一层都可以进行安全保护,比如网络协议中的IpSec(Ip层), SSL(传输层), sMIME(应用层)安全协议。 对于移动平台也不例外, 也可以在不同的层次进行安全保障,系统底层和框架上层。<br /> <br />对于BREW平台,一直就是非智能的平台,所以它对底层系统的奢求不是那么高,无需任何现代操作系统的支持。 所以, BREW也就不能对系统层的安全做任何奢求,那么只能完全在BREW这一层实现

东方欲晓的专栏 1159

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

爱之深,期之切, 历数BREW几宗“罪”

本文不是敌人之间的奚落,谩骂。是爱人之间的激励。 那种感觉,是“只允许我1天骂他8次,却容不得别人说他一次不好”。那是因为爱她,所以希望她更好,走的更远。 所以,冒昧的写下本文,提出一些个人感觉BREW有待改进,完善的地方。1。 过于封闭,技术资源匮乏。      对于BREW,除了来自官方的SDK外,似乎找不到任何权威的技术资料和文档。1年,2年,3年过去了,还是这样。 看看后起之秀, IPhone,Android, 不管是来自民间的,还是来自官方,权威的资料,书籍,比比皆是,不管是深入的,还是浅出的。

东方欲晓的专栏 1131

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

BREW你问我答

发布该贴的唯一目的是尽我绵薄之力,在我有限的知识范围和能力范围内,解答部分网友brew方面的问题。有任何brew相关问题的TX,都可以在该贴的评论处提问,只要我能力范围内的,我将尽力解答。 闲话不多了,有问题的可以提。

东方欲晓的专栏 1068

BREW与Android中的UI事件框架比较

对于BREW,我非常熟悉,但是对于Android,只能算刚刚认识,最近看了些Android的UI事件处理的相关文档,发现Android的UI事件处理框架与BREW有一些异同,这里给予一些比较,纯属个人认识。 如有不当之处,欢迎指正。相同之处在于,从高层而言,Android与BREW的UI事件框架均是基于职责链模式的,运行时构成了Event Chain。 Event Chain中的每一个部件默认将事件传递给后继者。 事件在Event Chain的终点处自然终止, 或者在中间异常终止(中间部件返回了TRUE,导

东方欲晓的专栏 1010

【BREW你问我答】02期_20100709

为了使得BREW你问我答办的更好,决定不再在一个帖子中靠不断的回复来问答,这样多了后比较乱。 以后,基本上每周我会更新一期, 大家每次的新问题,请都在最新期的BREW你问我答(会置顶)中提问。 我一般只会关注最新期的问题。  当然,对于老问题的继续探讨,可以在原先的提问的基础上再提问谢谢~~~~~新的问题请在本帖子下开始提问

东方欲晓的专栏 1002

More Than BREW: 解析BREW核心机制

More Than BREW: 解析BREW核心机制 的提纲

东方欲晓的专栏 991

移动平台中的模块复用

在“复用”这一角度,无疑android是最棒的,至少到目前尚无平台可以出其右。 当然,我相信android的思想也不是一蹴而就的,也是借鉴并发展了前人的思想。 我们慢慢看来:     1. 首先,在Windows等PC平台上,最常见的复用的粒度 是基于 “进程”的复

东方欲晓的专栏 977

CS(Component Service), BMP(Brew Mobile Platform)那点事

<br />大家知道Qualcomm最新的BREW版本为BMP,BMP又是基于CS的,那么为何要演进到BMP,以及BMP为何需要基于CS那,其实,这个还是有一个背景的, 本文主要就笔者的观点,谈谈我所认为的背景。<br /> <br /> <br />BREW从1.0一直发展到3.x,一直充当着Feature Phone中的平民英雄的角色, 它的优点,就是可以不依赖于(不奢望)底层平台/系统的现代特性(多进程,多线程,内存保护,动态链接,动态加载等)而依靠自身实现一个轻量级的应用框架,同时支持动态加载。 所

东方欲晓的专栏 962

Android, BREW中Observer(观察者)模式的两种表现

Observer模式无疑是最伟大的设计模式之一。 她被用来解耦一对多的关系,并对“多”的变化进行隔离。 现代移动平台中,各是随处可见她的身影。 本文将从Android,BREW两个移动平台中,一窥其迷人身姿。Listener机制。 在BREW和Android中,同时都提供了Listener机制。这是血统纯正的Observer模式体现。 BREW中的IModel的AddListener和Android中的View的AddXXXListener就是两个很好的例子。 在这种纯种Observer模式下,我们需要明确

东方欲晓的专栏 901

BREW事件使用技巧: 避免事件冲突

详述了BREW中事件定义的注意点

东方欲晓的专栏 901

# WPF ComboBox 控件详解与使用 —WPF 中的控件(7)--下拉框选项列表控件( ComboBox)

ComboBox`(下拉框选项列表)是 WPF 中最常用的选择类控件之一,它在有限空间内提供下拉选项列表,支持**单选、可编辑输入、数据绑定、自定义项外观**等核心能力,继承自 `System.Windows.Controls.Primitives.Selector`。 本文将从基础属性、核心事件、基础用法、数据绑定、自定义模板、高级定制到最佳实践,逐一带代码注解进行讲解。

yunmaowu0917的博客 142

从零搭建半导体设备上位机(五):三套 UI 库共存,HandyControl、MaterialDesign、Wu.Wpf 的样式基线

三套 UI 库共存:HandyControl、MaterialDesign、Wu.Wpf 的样式基线 这是「从零搭建半导体设备上位机」系列第5篇。一个 WPF 应用里同时装了 HandyControl、MaterialDesignThemes、Wu.Wpf 三套控件库。这篇讲它们为什么会打架、打架的具体机制是什么,以及怎么建立一套"谁也别想偷偷改我外观"的样式基线。 一个下拉框,白底白字 界面做完

samble的专栏 453

【QT入门到晋级】用开源的自定义控件开发

直接点击mainwindow.ui文件是看不到quc控件的,关键步骤是右键点击mainwindow.ui,右键菜单选择【Qt Designer】,在UI设计器中才能找到“Quc Widget”。注意:以上是前端调用自定义控件的方式,需要编译动态库等操作,相对要麻烦一些。如果有自定义控件的源码.h和.cpp文件,直接加入到现有qt项目中,以后台方式直接调用即可,以下是我分享过一个手搓的自定义控件类【QT自定义2D控件】QGraphics绘制仪表盘_qt仪表盘控件-优快云博客。

ocy的博客 174

K210+STM32+LVGL:手搓边缘AI智能安防监控网关

在传统的物联网或嵌入式毕设中,“智能安防”往往沦为“温湿度+蜂鸣器”的简单堆砌。由于单片机(如STM32)算力有限,无法在本地运行复杂的视觉AI模型,导致很多项目只能在云端处理图像,带来高延迟和隐私风险。本文将分享一个真正的边缘计算安防网关项目。我们采用“K210视觉协处理 + STM32F407主控 + LVGL高颜值UI”的分布式架构,完美解决了单芯片算力不足的痛点。项目不仅实现了明火与陌生人脸识别,还加入了多源传感器融合、5秒智能防抖、以及硬件与UI的双向闭环控制,是一套工业级标准的开源方案。

181
上一篇: 基于BREW平台松耦合设计IV-重构AlarmService的整体设计
下一篇: BREW你问我答
nicefuture
博客等级 码龄23年 75粉丝 60原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值