精华内容
下载资源
问答
  • 今天给各位大侠带来一篇项目开发经验分享“基于JESD204B的LMK04821芯片项目开发”,这是本人实打实的项目开发经验,希望可以给有需要的大侠提供一些参考学习作用。 以后机会多多,慢慢分享一些项目开发以及学习方面...

    大侠好,阿Q来也,今天头一次和各位见面,请各位大侠多多关照。今天给各位大侠带来一篇项目开发经验分享“基于JESD204B的LMK04821芯片项目开发”,这是本人实打实的项目开发经验,希望可以给有需要的大侠提供一些参考学习作用。

    以后机会多多,慢慢分享一些项目开发以及学习方面的内容,欢迎各位大侠一起切磋交流。本人已入驻“FPGA技术江湖”知识星球,各位大侠如果对本篇以及后续更新内容有问题交流,欢迎各位大侠在“FPGA技术江湖”知识星球内一起交流,如何加入知识星球可以查看如下文章,欢迎加入FPGA专业技术交流群、知识星球!(交流群QQ、微信双向选择)。话不多说,上货。

    一、 LMK04821功能介绍
    LMK0482X系列是德州仪器推出的高性能时钟调节芯片系列,该芯片目前有三种,分别为LMK04821、LMK04826以及LMK04828,该系列芯片都支持最新的JESD204B协议。本次调试主要以LMK04821为例,对调试过程中出现的一些问题进行总结说明。

    其性能描述如下:
    支持JESD204B;
    超低的时钟抖动和噪声;
    能够同时输出14路差分时钟:
    <1>. 7对可作为JESD204B的SYSREF时钟;
    <2>. 最大输出频率可以达到3.1GHz;
    <3>. 输出差分时钟的电平标准可编程选择:LVPECL、LVDS、HSDS、以及LCPECL;
    双PLL结构;
    PLL2的VCO分频系数为1-32;
    输出时钟精确的数字延时、模拟延时、以及动态延时;
    多工作模式:双PLL、单PLL以及时钟分发模式;

    LMK0482X系列的这三款芯片不同之处在于支持不同的VCO,如下图图1所示:
    图1
    LMK04821芯片的应用示意图如下图图2所示:
    图2
    LMK0482X的管脚分布定义图如下图3所示,熟知每个管脚的功能很重要,逐一介绍:
    图3
    PIN1、2:第0路Device CLK差分输出;
    PIN3、4:第1路SYSREF/Device CLK差分输出;
    PIN5: 该芯片的复位输入或者是通用GPIO;
    PIN6: 该芯片的时钟同步输入端口或者是连续SYSREF CLK请求输入端口;
    PIN7、8、9:没用,悬空即可;
    PIN10: 电源输入;
    PIN11:LDO旁路电容,外接10uf到地;
    PIN12:LDO旁路电容,外接0.1uf到地;
    PIN13、14:第3路SYSREF/Device CLK差分输出;
    PIN15、16:第2路Device CLK差分输出;
    PIN17:电源输入;
    PIN18:芯片的SPI配置CS信号;
    PIN19:芯片的SPI配置SCK信号;
    PIN20:芯片的SPI配置SDIO信号;
    PIN21:电源输入;
    PIN22、23:第5路SYSREF/Device CLK差分输出;
    PIN24、25:第4路Device CLK差分输出;
    PIN26:电源输入;
    PIN27、28:第6路Device CLK差分输出;
    PIN29、30:第7路SYSREF/Device CLK差分输出;
    PIN31:可编程的状态监测I/O管脚;
    PIN32:PLL1的电荷泵输出;
    PIN33:电源输入;
    PIN34、35:PLL1的参考时钟输入1、零延迟模式下的外部反馈时钟输入、外部VCO输入;
    PIN36:电源输入;
    PIN37、38:PLL1的参考时钟输入0;
    PIN39:电源输入;
    PIN40、41:反馈到PLL1,参考输入到PLL2。AC耦合;
    PIN42:电源输入;
    PIN43、44:PLL2的参考时钟输入、PLL1的反馈时钟输入;
    PIN45:电源输入;
    PIN46:PLL2的电荷泵输出;
    PIN47:电源输入;
    PIN48:可编程的状态监测I/O管脚;
    PIN49、50:第9路SYSREF/Device CLK差分输出;
    PIN51、52:第8路Device CLK差分输出;
    PIN53:电源输入;
    PIN54、55:第10路Device CLK差分输出;
    PIN56、57:第11路SYSREF/Device CLK差分输出;
    PIN58:可编程的状态监测I/O管脚;
    PIN59:可编程的状态监测I/O管脚;
    PIN60、61:第13路SYSREF/Device CLK差分输出;
    PIN62、63:第12路Device CLK差分输出;
    PIN64:电源输入;
    DAP : 散热盘,接地;

    二、 LMK04821使用步骤
    2.1 硬件电路检查
    2.1.1 芯片供电是否正常,是否符合器工作的条件,该步骤直接决定芯片能否正常工作,测试点参考下图;
    图4

    2.1.2 芯片的参考时钟输入是否正常,借助示波器进行检查,CLKin0端的时钟由外部信号源提供,OSCin端的时钟由板上晶振提供,测量进入AD之前时钟是否正常;
    图5
    2.2 寄存器配置
    LMK04821的配置采用SPI方式,其配置规则通过阅读数据手册提取关键的知识点,如下:

    2.2.1 写操作时,CS信号为低电平时,SDIO的数据在SCK上升沿写进芯片,写数据格式为1bit的读写控制位+2bit的0+13bit地址+8bit数据。

    2.2.2 读操作时,先写入1bit的读写控制位+2bit的0+13bit地址,然后在接下来SCK的上升沿获取8bit数据;
    时序图如下图6所示:
    图6

    2.2.3 进行SPI时序编写时,务必按照图七的时序要求,除此之外,在FPGA内设计SPI代码时一定要可读可写,这样一来在FPGA配置寄存器时就能够知道每个寄存器内部配置的值是否正确,这一步是控制整个芯片工作时,FPGA要完成的第一步工作。
    图7

    2.2.4 LMK04821的双PLL级联系统的介绍:

    该系列芯片功能非常灵活,一般JESD204B系统的双PLL级联应用最为经典,但是对于传统的应用来说,同样适用。需要注意的是Device CLK不提供单端输出,只有OSCout管脚可以提供LVCMOS单端输出。另外,除了双PLL应用模式,亦可以配置单PLL或者时钟分发模式。

    LMK0482X系列芯片的双PLL结构保证了在很宽的输出频率范围内还可以输出最低抖动的时钟。第一级PLL(PLL1)被外部的参考时钟驱动,第二级PLL(PLL2)由VCXO或者可调晶振提供高精度、低噪声的二级参考时钟。经过这两级PLL,输出时钟的精度将会大大提高。

    LMK0482X系列芯片共输出7对JESD204B DeviceCLK和7对SYSREF CLK,其中每个Device CLK对应一个SYSREF CLK。对于那些非JESD204B的应用,SYSREF CLK同样可以编程为Device CLK。
    PLL1的输入参考时钟包括管脚CLKin0,CLKin1以及CLKin2,任选一个作为时钟输入即可,选择的规则由配置寄存器参数决定。

    VCXO/Crystal 缓存输出,LMK0482X系列芯片提供OSCout输出,该输出其实就是PLL1的反馈输入,也是PLL2的参考时钟输入,芯片的该功能其实就是为了在其编程之前可以提供一个时钟给控制器工作,控制器编程再配置LMK0482X。OSCout输出可以为LVDS、LVPECL以及LVMOS电平。

    LMK0482X具有频率保持的功能,当外部参考时钟丢失后,输出频率还能保持最小的漂移,直到外部参考时钟恢复。

    7路Device CLK都可以分别的分频,分频系数为1~32。

    7路SYSREF CLK统一分频,分频系数为8~8191。

    Device CLK具有延迟的功能,其包括模拟延迟和数字延迟。模拟延迟是以25ps为单位的时钟延迟模块,使用该模块本身也会带来500ps的延时。数字延时范围为4~32 VCO时钟周期,每一个延迟单元的大小为0.5 VCO周期。需要注意的是延迟的功能必须在同步使能后才起作用。

    SYSREF CLK同样具有模拟核数字延迟。模拟延迟的最小单位为150ps。数字延迟的范围为1.5~11VCO,同样每一个延迟单元的大小为0.5 VCO周期。

    14路时钟的输出不仅在电平标准上可编程,在输出的幅度方面也可编程。

    要使时钟的数字延时起作用,管脚SYNC必须给一个脉冲,在脉冲的上升沿所有的时钟同步。

    LMK04821提供了几个状态管脚用来供用户监测芯片内部的状态或者作为输入端口来响应用户的需求,具体的功能在寄存器配置说明里介绍。

    2.2.5 功能框图
    图8
    2.2.6 寄存配置顺序
    在进行LMK04821寄存器配置的时候,手册里给了一个推荐的顺序,如下图图9所示:
    图9

    在辅助软件TICS Pro中,生成的寄存器顺序也是严格按照手册中进行配置的。

    但是在实际运用中,按照该寄存器配置顺序,时钟输出端并没有正确的时钟输出。实际运用中,将寄存器顺序按照如下顺序进行配置:
    1、0X000配置两次,先进行复位,然后0X000再配置00,无操作;
    2、然后紧接着从0X100~0X145;
    3、0X171~0X17D;
    4、0X146~0X16E;
    5、0X143(90)、0X149(00)、0X143(两次B0、90)、0X144(FF)、0X143(两次10、11)、0X139(03)、0X002(00);固定数值;尽量不要改变,具体为什么要这样进行配置,对应数据手册进行查阅即可。

    注意:在实际应用中,目前为止该寄存器顺序是唯一能够正确产生时钟的顺序,可以参考软件给的寄存器数据,尽量不要改变配置寄存器的顺序。部分寄存器在设计中没有进行配置,比如一些只读寄存器,IC信息相关的寄存器,reback相关的寄存器都没有进行配置,实际操作中无伤大雅,可以不用配置。但是在SPI配置寄存器时,如果要检验寄存器读写是否成功时,可以将这些寄存器进行读操作,确保SPI操作正常。

    2.2.7 寄存器对应数据
    在此之前,确定寄存器配置顺序之后,利用辅助软件TICS Pro软件产生对应的参数,按照6中所示的寄存器顺序进行写操作。软件使用中重要参数的产生以及对应在软件中如何设置见下图图10;
    图10

    一定要熟练掌握软件运用,明确在产生想要的时钟时,如何进行软件操作,得到相应的系数,软件中每个点如何进行配合;参数之间是如何对应的,建议配合数据手册进行对比,能够事半功倍。

    标记1选择CLKin0作为参考时钟输入;硬件环境值在CLKin0端有时钟输入;
    标记2选择PLL1,MUX是可以进行选择的,不同的选择,对应寄存器要配置的数值不同;
    标记3处选择相应的DIV数值,得到需要的时钟100M;
    标记4 CPout1直接连接到外部晶振,目的是,当参考时钟丢失时,延时功能可以将PLL1的调谐电压固定在VCXO或者可调谐晶振上,使得在外部参考时钟丢失时,输出的时钟频率的偏移最小,直到外部时钟恢复。
    标记5 OSCin,PLL1的反馈输入,PLL2的参考时钟输入,实际调试中,发现OSCin如果没有输入,输出端就没有时钟输出,没有CLKin0输入,输出时钟依然正常输出;
    标记6、7、8、9、10、11、12,这几处都和PLL2 VCO Frequency有关系,手册中显示LMK04821在使用VCO1时,PLL2频率要求在2920~3080MHz之间。
    超出范围,软件会报红出错。这几处设置其实就是简单的将OSCin的时钟进行先倍频后分频的一个操作;比如,实际中需要DCLKout输出150M、75M时钟,再复合要求范围的情况下,找到一个合适的公倍数,例子中为1500M,这样一来,既能得到150M的DCLKoutX的输出,又能得到75M的时钟输出;

    除此之外,时钟输出设置如下图图11所示:
    图11
    标记1,公倍数;
    标记2,PLL1的反馈输入,PLL2的参考输入,实际运用中,PLL2的参考输入为OSCin;
    标记3,分频系数,1500M十分频150M;
    标记4,选择PD,意味着该通道不输出,处于关闭状态;
    标记5,DCLK输出频率,可在对应位置直接填入想要的数值。注意,最好是公倍数的整数分频后的值,不然,软件会自动产生一个和填入值最相近的数值;
    标记6,SCLK输出端口,SCLK不能单独分频,7个通道只能统一进行分频;具体设置如下图图12所示:
    图12
    注意:在设定寄存器参数时,操作软件时,会在左下方窗口标记2处显示对应的寄存器以及数值,便于我们很迅速的在数据手册中查到该数值进行了哪些配置;

    软件配置时,最重要的几个参数以及对应的寄存器如下:
    Doubler,对应相关寄存器0X162;
    R Divider,对应寄存器0X160、0X161;
    N Divider,对应寄存器0X168;
    VCO,对应寄存器0X138;
    DCLKoutX_DIV, 对应寄存器0X100、0X108、0X110、0X1180、0X120、0X128、0X130;
    SYSREF DIV,对应寄存器0X13A、0X13B;

    注意;有些参数需要多个寄存器共同配合使用;另外的寄存器在软件配置过程中会生成,按照具体的设计要求进行软件操作配置,导出参数之后,在对应的寄存器中进行更改即可。

    三、 运用结果
    3.1 时钟输出结果
    在对LMK04821芯片进行正确配置之后,时钟能够正常输出想要的时钟频率,利用示波器进行测量,都能够直接观测到时钟有输出;程序中更改不同的分频系数,也能够在输出端得到相应的时钟输出。

    3.2 待解决问题
    考虑到系统中要求时钟同源的问题,在对CLKin0参考输入时钟、DCLK、SCLK通过示波器进行起始相位对比观测,发现通过倍频分频后,时钟起始相位存在大概1/4个周期偏差,多次测试,每次都有细微的偏差。

    其中,DCLK与SCLK如果输出频率相同时,相位差通过观察,有细微偏差,考虑到示波器使用过程中,探头不稳定原因,暂定相位偏差为0;后期有更好的测试方法时,再进行确认。

    阿Q的第一篇项目开发经验分享就到这里结束了,万事开头难,今天已经开启了第一篇,后续有时间还会继续给各位大侠带来更多的项目开发经验分享。各位大侠,有缘再见,祝一切安好!

    展开全文
  • 高效地在GitHub上寻找开源项目学习提升项目开发经验GitHub项目搜索技巧项目名称搜索项目详情搜索项目描述搜索如何判断一个项目是否值得学习 GitHub项目搜索技巧 项目名称搜索 项目名称关键字搜索 in name xxx ...

    GitHub项目搜索技巧

    项目名称搜索

    • 项目名称关键字搜索
    in name xxx
    
    • 项目名称关键字搜索stars大于3000
    in name xxx stars>3000
    
    • 项目名称关键字搜索stars大于3000分支forks大于100
    in name xxx stars>3000 forks>100
    

    项目详情搜索

    • 项目详情关键字搜索
    in readme xxx
    
    • 项目详情关键字搜索starts大于3000
    in readme xxx stars>3000
    
    • 项目详情关键字搜索stars大于3000分支forks大于100
    in readme xxx stars>3000 forks>100
    

    项目描述搜索

    • 项目描述关键字搜索
    in description xxx
    
    • 项目描述关键字搜索Java语言开发的项目
    in description xxx language java
    
    • 项目描述关键字搜索Java语言开发的项目提交时间在2019年11月10号以后的
    in description xxx language java push>2019-11-10
    

    如何判断一个项目是否值得学习

    • 看介绍description
      • 有哪些技术点
      • 更新时间
      • readme文档
      • 项目源代码格式规范,组织结构规范
    展开全文
  • 【weex实战】项目开发经验

    千次阅读 2018-08-04 23:47:08
    weex实战项目开发经验 前言 本人近期加入了公司开发的一款应用i7,此款应用前端选用的weex开发语言,就weex下面我来讲解一下自己的经验总结,可能不全。 正文 1. 什么是weex? WEEX是一个使用Web开发体验...

    这里写图片描述

    weex实战项目开发经验

    前言

    本人近期加入了公司开发的一款应用i7,此款应用前端选用的weex开发语言,就weex下面我来讲解一下自己的经验总结,可能不全。

    正文

    1. 什么是weex?

    WEEX是一个使用Web开发体验来开发高性能原生应用的框架

    介绍这里,我参照的官网,建议同学们还是去官网看一遍,下面有网址。

    Weex是使用同一套代码来构建 Android、iOS 和 Web 应用(一次编写,处处运行)。具体来讲,在集成了 WeexSDK 之后,你可以使用 JavaScript 和现代流行的前端框架来开发移动应用。

    Weex 在 iOS 和 Android 上都实现了一个渲染引擎,并提供了一套基础的内置组件。基于这些组件,你可以用 js 封装更多的上层组件。

    尽管 Weex 中的组件看起来很像 HTML 标签,但你无法使用所有 HTML 标签,只能使用内置组件和自定义组件。

    在框架内部,Weex 使用的是原生系统提供的 Widget 来渲染的。尽管 Weex 强调每个跨平台的一致性,但我们仍然接受平台本身的行为和 UI 差异。 例如switch 组件
    这里写图片描述
    除了内置组件以外,Weex 也支持你扩展更多原生组件,但是你需要在每个平台上实现它们,并保持其行为一致。最实用的方法是将现有的本地组件集成到 Weex 平台中。

    在 Android 和 iOS 上看起来是不同的(在 Web 端的外观模拟了 iOS)。

    具体解释请参考weex官网:weex.apache.org/cn/guide/
    苹果手机上weex最低支持到iOS7.0

    2. weex的安装

    这里写图片描述
    针对用过weex的同学可以直接跳过这一步。
    (简单的步骤:首先安装nodejs,里面自带npm包管理,然后安装weex-toolkit,npm install weex-toolkit -g,这条命令会向你命令行环境中注册一个weex命令。安装完成后命令行输入weex,查看是否有命令帮助内容,如果提示没有weex命令,表示weex没有安装好,检查一下自己的安装环境。)

    以前简单讲过,但是考虑到有些同学可能没有用过,下面我详细讲解一下。

    初始化

    Node.js官网nodejs.org/en/ 点进去直接下载安装,下载后会自带npm包管理工具
    在命令行中输入以下命令,查看是否安装成功:

    node -v
    npm  -v

    如果要安装淘宝镜像,输入以下命令:

    npm install -g cnpm --registry=https://registry.npm.taobao.org

    查看是否安装成功:

    cnpm -v

    请确保你已经安装了 Node.js,然后全局安装 weex-toolkit。

    npm install weex-toolkit -g

    你可以用weex create命令来创建一个空的模版项目。

    weex create awesome-app

    这样,你就拥有了一个weex工程了,可以简单的做些demo试一下。

    3. weex的优缺点

    优点:weex能够完美兼顾性能与动态性,让移动开发者通过简捷的前端语法写出Native级别的性能体验,并支持三端统一。

    缺点:控件太少,基本只能实现最基本的效果;上手难度大,如果是前端和移动端都比较懂上手很快;随着项目变大,编译速度会指数型上升。

    好了,基础的就不讲了,下面我们进入到项目中讲解。

    4.项目开发中,weex常常需要注意的地方

    (这里是我开发的经验,如果有认为错误的地方,可以在留言中指出)

    1)页面与网关的联调问题(说些业务上的注意点)

    1. 注意接口拿到的第一个状态值success是网关的接口状态,第二个才是后端接口的状态

    2. 注意后端传空的值,网关是否会自动过滤掉

    2)weex页面内判断的问题
    weex没有dom的概念,在页面渲染中,如果要进行页面元素的判断,记住最好用true和false。weex标签中对于字符判断兼容性不是很友好。

    例如判断一个元素如果接口返回值为1就显示,不为1就不显示,最好这样写:

    1.先在js代码中定义一个变量

     data(()=>{ 
       showFlag:false
    })

    2.然后在方法中判断如果返回值为1,状态为true

    if(data == 1){
       this.showFlag = true
    }else{
       this.showFlag = false
    }

    3.在template中,这么调用

     <div v-if="showFlag">demo</div>

    4.v-show 和display不起作用,可以用v-if来代替
    5.在组件内判断null==null和null!=null,结果都为true,所以判断并没有意义。
    6.Weex 目前不支持 z-index 设置元素层级关系,但靠后的元素层级更高,因此,对于层级高的元素,可将其排列在后面。
    7. 在 Weex 中,Flexbox 是默认且唯一的布局模型,所以你不需要手动为元素添加 display: flex; 属性
    8. 目前在 <image> 组件上尚无法只定义一个或几个角的 border-radius
    9. Weex 对于长度值目前只支持像素值,不支持相对单位(em、rem)
    10. 不要用float定位,用flexbox布局,可以用position,Weex 布局模型基于 CSS Flexbox,以便所有页面元素的排版能够一致可预测,同时页面布局能适应各种设备或者屏幕尺寸
    11. 如果定位元素超过容器边界,在 Android 下,超出部分将不可见,原因在于 Android 端元素 overflow 默认值为 hidden,但目前 Android 暂不支持设置 overflow: visible。
    12. weex内置组件一共17个,大家可以按照html标签一样理解,除了这些内置组件,其他标签不支持。

     <a>  <div>  <image> <indicator>  <input>  <list>  <cell>  <recycle-list>  <loading>  <refresh>  <scroller>  <slider>  <text>  <textarea>  <video>  <waterfall>  <web>

    13.weex内置模块一共有12个,weex的动画和数据交互都以这12个模块为基础进行开发:

     `animation  clipboard  dom  globalEvent  meta  modal  navigator  picker  storage  stream  webSocket  webview`

    14.Weex 支持四种伪类:active, focus, disabled, enabled

    所有组件都支持 active, 但只有 input 组件和 textarea 组件支持 focus, enabled, disabled

    15.background-image 优先级高于 background-color,这意味着同时设置 background-image 和 background-color,background-color 被覆盖,不要使用 background 简写。

    16.<recycle-list> 是一个新的列表容器,只能使用 <cell-slot> 作为其直接子节点,使用其他节点无效。
    17.navigator 实现前进后退功能。
    18.<web> 回退、前进和重新加载用。

    5.组件化

    在weex项目中,建议进行单页面应用开发,这样可以进行单页面的独立打包,进行上线替换。

    页面编写上尽量趋向于组件化编程,一次编写,多次引用。
    我们开发的时候是自己建了一个组件库,将组件开发完成后,发布到npm中。

    在开发过程中,因为有些功能不可能有改动就发布到npm上,所以我们大多数用的方法是npm link的方式,在组件项目中,输入命令行 npm link,会输入一个地址,然后在自己应用的项目中,输入命令行“npm link 地址”,下面给大家贴图说明一下做法,就是红框内的内容
    这里写图片描述
    配置完成后,本地的应用项目就可以引用本地的组件库了,组件库一旦更改,应用项目就会自动编译更新。引用组件的方法和引用npm时一样,不用变。更贴近于业务的组件,如果别的项目,基本不会用到,可以放到应用项目中,单独建立一个页面,进行调用。
    下面我简单举个页面例子:
    这里写图片描述
    这段代码,一共引用了5个组件,不知道你有没有看出来,这样编写,可以让页面结构和布局更简洁明了,这只是一个开发建议,大家开发还是要看自己的习惯。

    这段代码最后有一句话,是引入列表页模块,下面我们就来说一下单页面应用中,多个页面内如果进行数据传递。

    6. 页面数据的交互

    1.例如a页面的值传入到b页面中,第一种方法用props。
    在页面index.vue中设置变量data,然后在second.vue中设置

    props:{
       data:{
         type:Object
       }
    }

    2.路由
    页面跳转:this.$router.push('/a');
    页面回退:this.$router.back();
    加上参数:this.$router.push({path:'/a',query:param});
    获得路由请求的参数:

    let routerparams = this.$router.currentRoute.query;

    7. weex 日历控件的使用

    说几个坑,大家注意下。
    我目前知道的weex日历控件有三个,如果有更好的,大家可以告诉我下,互相学习嘛~

    1. weex内置组件 iphoneX iphone8不支持,日历组件弹都弹不出来
    2. weex-ui的WxcPageCalendar组件,这个组件手机上都能成功调用,缺点就是有点影响性能,不过这个组件支持往返日期的选择,如果你的功能需要这样的交互,也是个不错的选择
    3. weex的picker内置模块,这个相对于前两个,性能更好,而且兼容iphoneX。测试时发现在不同型号手机上,样式和交互方式是不一样的。如果想要样式和交互一致,建议用weex-ui的日历组件。
    4. 上次测试发现了一个问题,我在这里描述下,大家知道一下。手机360N4上,例如当前日期是2018-06-30,默认选中。当你翻到其它年份的6月30日时,它也是选中状态。目前我没有提供解决方案,功能是不影响使用,在其它手机上没有发现这个问题。如果有好的解决方法,请给我留言。

    8. weex的渲染问题

    说一个我遇到的问题,如果你也遇到这种问题,希望对你有帮助。
    一个页面中多个按钮,点击后可以切换面板,如果面板中有可编辑区域的内容,例如input和textarea,面板切换走,在切换回来,你会发现,刚才你编辑的内容不见了,那么这个问题怎么解决。
    说下我的思路,先定义一个变量inputTxt:”“,inputFlag:false,编辑的时候,获取blur或者change方法内的值,也就是你编辑的值,将变量this.inputTxt = event.value;
    this.inputFlag=true;(这个变量的意思就是你编辑过)
    然后切换回来的时候判断:

    if(this.inputFlag){ //编辑过
    编辑框的内容 = this.inputTxt;
    }else{ //没有编辑过
    编辑框的内容 = 接口回显的值;
    }
    这样不论你怎么切换,页面内容的显示都没有问题了 。

    9. css的写法

    Css不支持用scss或者less,组合式css分开写
    这里我重点强调一句,用最原始的写法,最笨的写法,就是最好用的写法。
    组件的话,大家可以参考下weex-ui和bui-weex

    10. 文件下载和图片上传

    参见:natjs.com/#/

    展开全文
  • DirectShow项目开发经验

    千次阅读 2008-02-14 17:06:00
    DirectShow项目开发经验一、 开发环境开发平台:PPC/SP MicrosoftR Windows Mobile 5.0、MicrosoftR Windows Mobile 6.0;开发工具:Visual Studio 2005;开发文档:magneto documentation may 18, 2006.chm,...
     
    
    DirectShow项目开发经验
    一、              开发环境
    开发平台:PPC/SP MicrosoftR Windows Mobile 5.0、MicrosoftR Windows Mobile 6.0;开发工具:Visual Studio 2005;开发文档:magneto documentation may 18, 2006.chm,directshow.chm,Windows Media Player SDK。
    二、              Windows Media Player
    Microsoft公司的WMP(Windows Media Player)对文件的播放提供了一套基于DirectShow的框架,而对于开发者而言,可以基于该原理来实现对本地、网络数据的不同处理。
    DirectShow主要包括三大功能模块,Source Filter负责解决数据来源,Transform Filter一般指各种Decoder Filter,实现数据的解码,Renderer Filter负责解码后数据的显示与呈现,即负责数据的“去向”。
    三、              LocalSource Filter(跳帧的实现原理)
    LocalSource Filter一般包括推模式和拉模式,为了减少开发的工作量我们采取推模式,即该LocalSource Filter一边从文件中读取数据,一边实现Audio、Video数据的分离,然后分别推送给各自的Decoder Filter,数据经过A/V分离后,在各自的线程中解码、显示,哪它们怎么达到A/V同步的呢?
    DirectShow确保A/V同步,主要是依赖于Sample(数据包)上的TimeStamp(时间戳),Video Renderer根据其TimeStamp来安排何时进行显示,或者丢弃一些sample。由于我们的开放平台是Windows Mobile,其CPU的性能不高,一般在200~500Mhz左右,因此当播放一些high performance文件时,仅仅依靠Video Renderer丢包处理是远远不够的,而必须需要Source Filter“早早”地进行数据丢包——跳帧。
    又由于Video Renderer依赖于流时间Stream Time 并比较TimeStamp来进行决策的,所以我们的Source Filter也必须参考Stream Time(Ts)这个“桥梁”进行跳帧处理。此外LocalSource Filter需要给将发送的sample打上时间戳,而该时间戳一般是从文件层(File Layer)获取的,这里不妨命名为Tf,另外跳帧后为了不引起花屏现像,我们必须选择keyframe位置进行跳帧。这样一来需要综合考虑文件层keyframe的分布情况:
    1.Keyframe间隔不大,且分布比较均匀
    这种keyframe分布是最为理想的,因为基本上任意点都可以作为跳帧点,这样LocalSource Filter随时可以在文件层获取一个与Ts匹配的Tf,这样发送出去的Samples很好地符合了Video Renderer的要求,也很好达到了A/V同步。
    2.Keyframe间隔大,且分布不均匀
    这种情况较差,因为LocalSource Filter较难在文件层获取一个与Ts匹配的Tf,同时考虑到Video Renderer对Sample的处理,我们选择的跳帧点(Tf)不能偏离Ts太远,否则如果Tf>>Ts,那么Video Renderer将Hold住该Sample,画面表现为停滞一段时间;如果Tf<<Ts,那么Video Renderer将丢弃一些Sample或者极快的进行显示,这样画面看起来滚动飞快。根据经验我们选择那些满足Ts<Tf<Ts+500ms的keyframe点作为LocalSource Filter的跳帧点。这样A/V同步是暂时的,不同步是动态的,但总体说来基本能够满足A/V同步的要求,毕竟这类文件是比较少的。一种最差的情况是整个文件就一个keyframe,对于该类型的文件只能是不同步播放了。
    另外Seek之后的Sample也需要作些特殊处理。Seek之后由于Sample的时间戳进行了突变,DirectShow的流时间也会有一个动态调整来确保Stream Time与新起始的Sample时间戳相吻合。但由于Video Seek要求文件的keyframe点,这样与实际得到的位置有一个偏差,一般我们采取超前请求点Seek 关键帧。这样得到的Samples对于Video Renderer而言是“迟到”的。所以LocalSource Filter需要对这些Samples作特殊处理以“决定”是否丢弃(比如处理后的TimeStamp < 0就应该直接丢弃,以免图像过快播放)。
    四、              网络接收NetSource Filter
    目前我们的项目采用rtsp协议进行网络数据的接收,由于客户端采用WMP,这就涉及WMP基于rtsp://的url来Load NetSource Filter,以及当网络Buffer数据时怎样与WMP进行“对话”的问题。
    首先通过查阅Windows Media Player SDK,我们可以修改注册表如下:
           [HKEY_LOCAL_MACHINE/Microsoft/MediaPlayer/Player/Schemes/rtsp]
           Runtime = 7             //Render using Microsoft DirectShow.
           Permission = 31     
                  这样我们的NetSource Filter就可以被WMP通过rtsp://urlload了。
    下面看看当NetSource FilterBuffer数据时,怎么“通知”WMP的。我们知道WMP是通过创建FilterGraph来管理各种Filters,这样当Buffer数据时,NetSource Filter必须向FilterGraph发送EC_STARVATION消息,即“告知“FilerGraph当前的Filter转换到了一种新的状态,要求上层应用程序等待该转换过程。同时WMP接收到EC_STARVATION消息后会不断调用NetSource FilterGetState接口来查询其状态是否转换完成。这就要求我们虚继承该函数,当Buffer数据时,直接返回VFW_S_STATE_INTERMEDIATEThe state transition has not completed)否则返回S_OK表明转换完毕。从而在用户看来当网络Buffer数据时,其进度条是暂停的,当数据足够时,进度条又继续前进了。
    LiveSourcePause/Resume问题的解决。当NetSource Filter接收广播数据时,我们碰到最棘手的就是播放过程中怎么解决用户的Pause/Resume问题。由于底层库没有提供针对LiveSource源的Pause功能,即用户Pause一段时间后,继续播放时,其图像应该是同步于服务器的。所以我们只好在Pause时“人为”地断开RTSP的连接,继续播放时重新建立连接,采取这种绕的方式来达到LiveSource中的Pause/Resume功能。由于这种“Pause”的实现违背了DirectShow的基本原理,即Pause时数据线程被强行Stop掉了。因此在深入研究DirectShow Push Source框架和多次试验后,我们做出了这样的特殊处理:当用户Pause时,我们一方面StopRTSP的数据连接,同时确保Audio/Video Pin中各自线程的正常运行,当用户执行Resume操作时,我们在Audio或者Video Pin的线程中进行RTSPReset重连接操作,最后由于RTSP ResetVideo/Audio Sample的时间戳复位了,为了保证画面的连贯性,我们必须给ResetResume)后的Video/Audio Sample加上Pause时各自的时间戳(作为偏移量)。
     
     
    五、              Decoder Filter
    Decoder Filter的开发比较简单,一般都是跟踪调试一些解码Crash的问题。比如:内存越界、解码容错处理、Seek或者Flush后对头信息的解析处理等等。
    六、              Video Renderer
    Video Renderer在我接手开发时已经比较完善了,我主要解决了一些刷新问题。比如全屏后不能返回到正常模式,Stop后WMP又Repeat播放起来等等问题。
    七、              Muxer Filter
    Muxer Filter实现时,也时碰到了类似LiveSource的Pause/Resume的问题。当时由于Muxer Filter接收的Sample只有Audio打上了绝对时间戳,Video的是相对的。如果用户执行了Pause/Resume操作,就给我们Dump文件时带来了一定的困难,因为Resume后这些Sample需要减去Pause->Resume段内时间戳的累积,否则播放该文件时要么黑屏,要么A/V不同步。因此Resume后Dump Video时必须参考Audio来计算Pause->Resume的时间段了,这里不妨记为DeltTa这样需要考虑以下几种情况:
    1.Resume后Video Sample先到达Muxer
    如果Video Sample先于Audio到达Muxer,由于这时我们没法从Audio中得到正确的DeltTa,因此我们只好在Pause时刻的基础上加上一个默认值(比如100ms)作为Resume后那些先于Audio的Video Sample的起始时间戳。
    2.Resume后Audio Sample先到达Muxer
    如果Resume后有太多的Audio Sample先于Video到达Muer,我们需要给Resume后第一帧的Video Sample的时间戳进行调整,否则播放该文件时会出现某处被卡住的现象。Resume后接收到的第一帧Video Sample经由DeltTa的偏移调整后,还比Pause的时刻滞后许多(比如大于1秒),我们需要对其作特殊处理,确保与Pause的时刻点连贯起来——在Pause时刻基础上加上500ms的偏移作为新的起始时间戳。
    八、              小结
    我们这个DirectShow项目的开发是在既定的框架下,所以需要做好的工作往往是一些细节方面的处理,以及探索、熟知Windows Media Player应用层如何通过Graph这个桥梁与各种Filter进行交互的,还包括熟知一些注册表信息的特殊功能。而涉及到Filter本身功能的开发一般都比较顺利,项目往往是卡在Filter与Windows Media Player打交道的处理上。WMP应用层对于DirectShow的处理并没有详细的官方资料,所以我们往往是通过两头“凑”的方法来进行探索的,即一方面查阅DirectShow的资料,一方面查阅WMP SDK,同时进行许多试验和经验总结,来积累一些它们之间相互处理的一些具体细节过程。
     
    展开全文
  • java项目开发经验总结

    万次阅读 多人点赞 2016-09-05 18:02:09
    Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1、掌握项目开发的基本步骤 2、具备极强的面向对象的分析与设计技巧 3、掌握用例驱动、以架构为核心的主流开发方法 ...
  • 项目开发经验总结

    千次阅读 2017-07-05 14:00:58
    需求关乎项目要做什么,要达到什么样的结果,对公司开展业务有什么样的帮助等,需要在需求阶段理解清楚,做到心中有数。另外需求是工作量评估的基础,要想工作量评估适当且充分,不出现大幅度偏差,就需要客观理解...
  • 项目开发经验总结070228

    千次阅读 2007-03-01 16:05:00
    项目开发经验总结 自从2006年暑假七月份起到年底,我参与项目开发已有半年多的时间。在这期间,我感受了许多,明白了许多,同时也学到了许多。深深地感悟到:作为一名项目开发者应当具备高度的责任心,踏实的劳动心...
  • 游戏项目开发经验分享

    千次阅读 2015-04-05 23:12:43
    下周参与开发的第三款MMORPG准备上市了,开发了一年左右,前面感觉拼得有点太过了,心身比较疲惫,总结下是太过于急于求成了。近两个月进行了一些调整,感觉状态和开发效率有所提升,在3人的服务器团队的努力下,完成...
  • J2EE项目开发经验二则

    千次阅读 2007-12-12 00:50:00
    J2EE项目开发经验二则一、war包中的文件的读取在开发J2EE Web应用时,在开发阶段通常采用目录的部署方式,而在正式运行时通常把web应用打包为单个的.war文件进行方便地部署。也就是在你的应用目录(比如WebLogic的...
  • 项目开发经验----如何同时应对多个项目 & embedded tomcat 使用   如果有几个项目同时开发,将它们都发布在tomcat下运行调试,一种简单容易的方法。用myeclipse自带的"add and remove deployment"菜单进行...
  • 机器学习项目开发经验

    千次阅读 2016-12-03 23:02:23
    机器学习项目中,可用那么多算法,那么多Feature,模型有那么多参数,怎么选择合适的?凭直觉?
  • 小程序项目开发经验总结

    千次阅读 2019-09-02 22:29:08
    场景:因为时间关系,项目中原生app端,小程序端都需要引入一个自助终端机定位及路径导航功能,所以统一以web-view的方式引入H5 小程序的限制: 生产环境中小程序是会校验 业务域名 , 合法域名 ,以及Https证书...
  • java项目开发经验总结,值得收藏!

    千次阅读 多人点赞 2018-09-08 14:46:09
    Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1、掌握项目开发的基本步骤 2、具备极强的面向对象的分析与设计技巧 3、掌握用例驱动、以架构为核心的主流开发方法 没有...
  • 项目开发经验教训

    2013-11-09 10:40:46
    1.避免需求不明,盲目干;...4.解决问题的方法很多,注意根据项目需求寻找合适的方案方法,包括:研发时间的估量,可扩展性,模块的可复用性; 有时候问题本身并不是很复杂,把握核心问题点寻找解决方法
  • 这篇博客是我在持续的开发以及维护项目中遇到的坑,并总结出做法,以备需要立项新项目需要注意的点。 1.字符串一定能提到语言包中就提到语言包,不要贪图方便写死在代码中或者写死在美术资源中 很多程序员喜欢...
  • 外包项目开发经验

    2007-09-19 09:28:00
    因为单位工作不是很紧张,平时有接一些公司的外包项目,总结一些...二、要和顾客明确软件的功能,在项目开发之前,要写好需求文档,并和顾客确认,否则在后期顾客常常逼你“义务”地为他添加或修改很多功能,那么你获
  • 如何获取独立项目开发经验

    千次阅读 热门讨论 2009-07-30 21:37:00
    ☆★☆★快来!!10月25日读者见面会☆★☆★ 本文是,清华大学出版社《Java...什么是独立的项目开发?以及为什么问这个问题? 我们在面试中经常听到下面这样的对话: 考官:“你有独立完成一个项目的经历吗?”A
  • 项目开发经验分享—分页查询

    千次阅读 2015-01-31 16:33:06
    从今天开始,我将和大家分享一下最近经手项目开发经验。今天我们分享的内容是:分页查询! 引言:  大家在浏览网页的时候,肯定遇到过这样的效果,一个滚动条套另一个滚动条,上下拉动,看着非常不方便,或是整个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,099
精华内容 11,239
关键字:

项目开发经验