当前位置: 首页 > 编程日记 > 正文

为什么我们需要开源的系统芯片?

作者 | bunnie

译者 | 弯月,编辑 | 杨碧玉

来源 | CSDN(ID:CSDNnews)

现代的小型电子产品往往基于某个高度集成的芯片构建,这种芯片称为“系统芯片”(System on aChip,缩写:SoC)。最早的家用计算机主板大约包含一百多个芯片,然而当80286 PC/AT兼容机成为主流后,在摩尔定律的推动下,主板上的芯片减少到了寥寥几个,而且这个行业永远不会走回头路。现在,典型的SoC可以集成一个CPU核心组件,以及数十个外围设备,包括模拟、RF和电源等功能。我们甚至还有“系统级封装”解决方案,可将SoC、RAM,有时甚至将FLASH芯片封装到一个塑封中。

现代SoC极其复杂。现代SoC完整的“用户手册”往往长达几千页,而bug列表也有几百页。我在“用户手册”上加了引号,因为即使是最开放、文档最齐全的SoC(例如NXP的i.MX系列),也必须签署严格的保密协议,才能阅读各种第三方知识产权功能模块对应的数千页文档,例如视频解码、图形加速以及安全等。除了需要保密协议的文档之外,通常还有数千页未发布的、针对那些不再使用的芯片区域的文档,例如原本设计中包含但最终未能成功的外围设备,内部调试工具以及预引导工具等。许多不再使用的功能,甚至连设计芯片的团队都不知道。

不再使用的芯片区域是一件大事,因为构建芯片可不像搭乐高积木那般简单,它更像是雕刻家刻在大理石快上的雕塑,因此添加电路的难度远远高于关闭电路。增加一条电路仅制作新的掩膜就大约需要花费100万美元,同时还会导致项目延迟70天(大约10万人时的额外工作)。而在正确计划的情况下,关闭一条电路非常简单,只需要修改代码,或者针对某个掩模层进行轻微改动,只需要花费大约1万美元以及几天的延迟(假设晶圆尚处于中期阶段,很容易进行这样的改动)。

因此,刚开始的时候,系统芯片的掩模组常常拥有很多额外的功能、备用逻辑和调试功能,然后逐步剔除(弃用)部分功能,直到最后系统芯片成型。正如米开朗基罗曾经说:“每一块大理石中都隐藏着一个雕像,而雕塑家的任务就是发现它。”

而我们可以说:“每个系统芯片的掩模组中都隐藏着一个数据手册,而验证团队的任务就是发现它。”有时,最后的修补发生在启动时刻,利用一些在CPU执行任何指令之前就执行的代码来关闭错误的功能或者打补丁。这样做的结果就是,即使是文档最完善的系统芯片中,被标记为不再使用的晶体管数量也不可忽视,尽管理论上这些晶体管不会被用户看到。

从安全角度来看,系统芯片中的这种“暗物质”的存在令人担忧。不必担心ROM的启动或CPU微代码的问题,内建自测试(Built in Self Test,即BIST)基础设施具有执行代码注入所需的一切,你只需将它设置为正确的模式。此外,系统芯片集成商都会从寥寥几个IP供应商那里购买DDR、PCI和USB等功能块。这意味着,成千上万的设备都加载了相同的弃用逻辑单元,甚至不同品牌和竞争产品之间也一样。所以,系统芯片中存在无法修补,甚至可能破坏生态系统的危险。

为了规避这种风险,Precursor使用FPGA来实现系统芯片。FPGA允许使用者重新编程,从而极大地降低了设计错误带来的成本。我们不必再像大理石雕刻那样做减法,而是可以像乐高积木那样来搭建。当然,这种灵活性需要付出一定的代价:FPGA的价格比同等功能的系统芯片高50倍,而绝对频率则慢5-10倍。

但是,这样能保证Precursor中没有暗物质,因为描述系统芯片的每一行代码都可以查看。这也意味着,如果Precursor的系统芯片中发现逻辑错误,则可以通过更新对其进行修补。这大大降低了迭代系统芯片的成本,从经济的角度来看它也可以向开源靠拢。理想情况下,Precursor的系统芯片设计将在未来几年内成熟并接受彻底的审查,以低风险的方式朝着打造固定芯片的方向发展,从而降低生产成本并提高性能,同时保持高标准的透明度。

LiteX:Precursor系统芯片背后的框架

Precursor的系统芯片使用LiteX构建。LiteX是由Florent Kermarrec创建的框架,使用Migen/MiSoC FHDL定义系统芯片,该框架本身是用Python 3.6+编写的。LiteX的核心是一组“处理程序”,它们能够自动根据总线标准和宽度进行适配。这样,设计人员可以很容易地在Wishbone、AXI和CSR等总线互联标准下混合使用不同的控制器和外设。只需几行代码就可以将一个额外的USB调试控制器连接到一个复杂的系统芯片中,而且整个总线仲裁和适配器的架构能够自行做出响应。

Precursor系统芯片简介

上图是于2020年10月发表的Precursor芯片系统的示意图。请随时关注图中的日期,因为基于FPGA的系统芯片会不断发生变化。一般,我们都不用太在意这般漂亮的手绘示意图,因为通常这些图片在完成的那一天就已经过时了。而我们的CI系统会在每次代码推送时,动态生成“程序员手册”。对于Rust程序员,我们的svd2utra工具可将LiteX生成的SVD文件自动转换为Rust API的crate。使用基于FPGA的开源系统芯片,自动化CI不仅是最佳实践,而且是至关重要的部分,因为有时子模块依赖项中一个很小但很重要的补丁会不断影响你的设计。

核心区域

“核心区域”(Core Complex)目前由一个RISC-V核心构成,它由Charles Papon的VexRiscV实现。我们将其配置为支持“RV32IMAC”指令子集,给它添加了一个MMU,还强化了缓存。VexRiscV将缓存大小限制为4kB,但可以通过增大缓存关联来提高有效容量。通过给核心添加一个双向I-cache和一个四向D-cache,我们将性能提升了大约10%。我们还准备了一个32kB的启动ROM,目前包含三条指令,但以后可以扩展,可以对从外部内存加载的代码进行签名检查。还有一个128kB的板载SRAM,用于紧密耦合或高安全性的操作。CPU核心被适配到一个由LiteX实现的Wishbone总线多用控制器上,以后可以进一步利用独立的CSR桥适配到CSR总线上,只需要将CSR桥配置为自动在4kB页面边界上进行空间并行,从而与MMU单独建立映射。还有一个IRQ控制器负责管理来自芯片周围外设的中断。

核心区域还包含一组负责执行下面功能的CSR,大部分为样板代码:

  • “Reboot”可以为重置向量指定一个新位置

  • “Ctrl”可以发送软重置

  • “Timer 0”是LiteX提供的默认定时器。这是一个高解析度的32位定时器,时钟频率与CPU核心频率相同。

  • “CRG”是负责控制FPGA时钟生成器的接口。目前我们还没有考虑太多,但最终它将在电源管理和延长电池寿命方面发挥重要作用。

  • “Git Info”是一个静态寄存器,提供用于构建Precursor芯片的git代码库的信息。

  • “BtSeed”是一个64位数,经过随机初始化后可以为布局布线过程提供一个熵。如果最终用户要求为其设备设计独有的FPGA网表,那么通过BtSeed,无需改动代码就可以实现(否则所有构建都是完全相同的)。

  • “Litex ID”是一个可供人阅读的文本字符串,用于标识系统芯片设计。

  • “TickTimer”是一个低分辨率的64位定时器,时钟增量为1毫秒。它作为Xous OS的时钟源使用。

调试块

核心区域旁边是一个调试块。调试块拥有一个全速的USB MAC/PHY,负责为Wishbone包打开隧道,从CPU的角度来看,它是另一个Wishbone控制器。我们使用给它来驱动CPU上的调试接口。这样即使CPU停机,也可以通过USB用GDB连接到Precursor上。甚至可以构建一个不带RISC-V CPU的Precursor,然后通过USB来为Wishbone包打开隧道,进行调试和驱动开发。调试块还包含一个名为“Messible”的小型CSR外设,这是一个包含64个元素的8位宽FIFO,可以在调试时作为邮箱或草稿使用。

内存映射和CSR I/O

RISC-VCPU的内存空间通过Wishbone总线映射到多种外设和内存块上。在传统的系统芯片设计师看来,Wishbone有点像AXI,只不过是开源的。Wishbone支持许多很棒的特性,如多master、流水线和块传输等。Wishbone总线空间的一部分还映射到了一个名为“配置和状态寄存器”(Configurationand Status Register,CSR)的总线上。

虽然Wishbone是高性能总线,但它需要更多的接口逻辑,而且只在外设带宽匹配总线带宽时才能发挥最佳性能。CSR有区域效应,从硬件和软件API两方面都可以适应任意寄存器位宽,但性能较低。因此,CSR最适合用作低速到中速的输入输出任务(例如命名配置和状态寄存器),这些任务中Wishbone非常适合映射到内存上的I/O,这样可以提高带宽并改善延迟,足以补偿区域效应带来的额外开销。

在设计过程中,绝大多数外设的第一步都是映射到CSR空间,然后升级成内存映射实现,从而达到性能要求。因此,Precursor上的绝大部分外设都是仅支持CSR的设备,这并非偶然。下面是每个CSR外设的简单介绍。需要提醒一点,你可以查看我们的参考手册以获取更详细的信息。

  • “COM SPI”是连接到嵌入控制器(EmbeddedController,EC)系统芯片上 的SPI总线。这是一个20MHz的SPI外设,传输带宽为固定的16位。该块的目标为升级成内存映射I/O块。

  • “I2C”是一个I2C总线控制器。目前,只有实时时钟(RTC)芯片和一个音频编码解码芯片连接到了这个I2C总线上。

  • “BtEvents”是一个负责各种外部实时终端的catch-all类型的块。目前它负责处理来自EC和RTC芯片的中断。

  • “KeyScan”是键盘控制器。它负责扫描9x10的键盘矩阵来发现击键,使用一个慢速的32kHz外部时钟源。将键盘扫描器与系统核心时钟解耦合,系统就可以在等待键盘输入时进入更低功耗状态,从而将Precursor在两次充电之间的使用时间延长数天。

  • “BtPower”是一组GPIO,专用于电源管理。它可以将音频和离散的TRNG打开或关闭,覆盖EC的电源控制指令,为USB type C端口激活boost模式(以支持DFP“宿主”操作),还可以采用自毁机制。

  • “JTAG”是一组GPIO,连接到FPGA的JTAG引脚。这些与我们的eFuseAPI驱动结合使用,可以在7 Series FPGA上自行提供AES比特流加密。

  • “XADC”是7 SeriesXADC块的接口。它是一个12位的多通道ADC。主要用于自我监测系统电压。在最终的产品版本中,至少有一个通道的ADC可以用于GPIO内部头的配置项,这样用户可以很容易地将模拟传感器集成到Precursor中。

  • “UART”是一个简单的115200、8合一串口,连接到控制台I/O的调试头。

  • “BtGpio”是一个数字I/O块,用于在GPIO内部头上驱动引脚。注意由于FPGA的实现限制,在不更新比特流的情况下无法在数字GPIO和模拟GPIO功能之间切换。

除了CSR的I/O之外,还有一些I/O设备也映射到了内存,以实现高性能:

  • “External SRAM”是一个32位宽的一部接口,映射了16MB的外部SRAM。这些SRAM由电池供电,所以在系统芯片断电时也可以保持状态。这样做的目的是通过减少睡眠和唤醒的额外开销来优化电力消耗。但是,这也意味着自毁过程必须先清除SRAM中的敏感数据,才能启动清除系统芯片的过程,因为自毁电路也是由SRAM的备用电源负责供电的。外部SRAM块还有一个CSR接口,负责从SRAM中读取配置模式。

  • “Audio”是一个连接到外部音频编码解码的I2S接口。它包含一个用于配置I2S接口的CSR块,还包含一对256x16的、映射到内存的采样FIFO。

  • “SPI OPI”是一个类似于SPI的高速接口,连接到外部闪存存储,并映射了12个8MB的非易失性存储器上。OPI中的“O”代表八位,这是一个8位总线,频率为DDR的100MHz。它还包含一个与读取器,可以存储相当于数个缓存线的代码,可以优化顺序代码执行的情况。该总线的高性能非常重要,因为它主要被CPU用来运行代码。它还包含一个CSR接口,用于控制诸如块擦除、页面编程等操作。

  • “MemLCD”是LCD的帧缓冲。Sharp Memory LCD包含自己的内部内存,因此即使宿主断电,也能够维持图像。因此,MemLCD帧缓冲就是LCD自身的缓冲。它负责管理LCD中的哪些线需要重画,在CSR上有请求发生时,它只会刷新那些需要重画的线。这样可以提高LCD的感知刷新率。如果重画整个屏幕,那么刷新率只有10Hz;但屏幕上的静态内容越多,刷新率也就越高。

加密区域

前面描述的所有功能仅占用了FPGA大约20%的逻辑,而Precursor的FPGA的主要逻辑位于加密区域。

上图展示了在Precursor系统芯片设计中各个功能的相对尺寸。一些块(如半冗余SHA-512和SHA-2加速器)的存在,仅仅是因为FPGA中能够容纳这些功能,而不是因为有需求。幸运的是,删除SHA-2块很简单,只需要注释掉4行代码,能节约大约2800个SLICE LUT,相当于大约9%的设备资源。LiteX和svd2rust脚本会负责其余的一切!

下面是加密区域中各个块的简要说明:

  • “Engine25519”是算术加速器,用于加速2^255-19质数域中的操作。它是一个微指令的256位算术引擎,计算带有正规化的256位乘法仅需要大约1微秒,比在RISC-V CPU上运行同等操作大约快30倍。它需要消耗大量的资源,但依然非常重要,因为Betrusted安全通信应用程序建立在Double-Ratchet算法上,该算法非常依赖这种运算。要理解Engine25519,最好从CI文档开始阅读。该块非常大,稍后我们会单独写一篇文章来解释它的功能。

  • “SHA-512”和“SHA-2”是硬件加速的SHA散列块。它们来自Google的OpenTitanSystemVerilog源代码。SHA-2块直接来自OpenTitan,几乎包括了OpenTitan的所有代码,因为它非常容易集成。SHA-512块是我们自己对SHA-2块的改进。由于历史原因,目前的Precursor中同时包含了两个快,尽管绝大部分应用程序仅需要其中一种。

  • “AES”是一个AES加速器,也直接来自Google的OpenTitan项目。它可以支持AES 128、192和256,还支持ECB、CBC和CTR模式下的加密和解密。

  • “KeyROM”是一个256x32的ROM,使用FPGA中的固定位置LUT实现。由于ROM的位置是固定的,我们可以使用PrjXray来确定FPGA比特流中KeyROM比特的位置。这样就可以在FPGA比特流中直接编辑KeyROM,从而将信任从低层的eFuse AES key传递到Precursor系统芯片中的高层功能中。我们会在其他文章中进一步讨论一些最近发现的FGPA eFuse AES key的重要脆弱性。

  • “TRNG”是芯片内的、基于环形振荡器的真随机数生成器。它使用多个小环来收集足够多的熵,然后合并成一个大环,用于最终的测量。Precursor TRNG的构建和验证也会另文介绍。

  • “ICAPE2”是在FPGA构造(fabric)中对未使用的内部调试端口的显式绑定(tie-down)。ICAPE2是Xilinx采用的方法,FPGA可以通过它进行内省,并访问内部配置状态。我们显式地将其绑定,这样其他功能就无法使用它。此外,由于ICAP2位于比特流中众所周知的位置,实际上可以写一个工具,在编译后对比特流进行检查,以验证ICAP2块确实被禁用了。

分块的思路

以上就是对Precursor系统芯片的介绍!我们按照功能和安全性分块,希望开发社区能够添加更多内容。只需要注释掉一些代码,就可以去掉不需要的块,为你自己的创作腾出空间。Precursor的代码完全开源,没有任何隐藏的测试逻辑,也没有微代码块,你如果想追踪从电源键按下到第一条指令执行之间发生了什么事情,也不需要签署保密协议。此外,Precursor系统芯片还有一个值得你信赖的原因:没有“暗物质”,设计完全透明。

原文:https://www.bunniestudios.com/blog/?p=5971

本文为 CSDN 翻译,转载请注明来源出处。

更多精彩推荐
  • 强化学习:10种真实的奖励与惩罚应用

  • NLP实战:利用Python理解、分析和生成文本 | 赠书

  • AI 隐身术,能让物体在视频中消失的魔法

  • CPU究竟是如何执行任务的?

  • 太扎心!人艰不拆!16 个程序员专属笑话讲给你听

相关文章:

InnoDB和MyISAM区别

MySQL作为当前最为流行的免费数据库服务引擎,已经风靡了很长一段时间,不过也许也有人对于MySQL的内部环境不很了解,尤其那些针对并发性处理的机制。今天,我们先了解一下MySQL中数据表的分类,以及它们的一些简单性质。 …

图书管理系统5W1H

Who 图书管理员 When 图书管理员在图书馆借阅期间管理用户的借书还书,非借阅时间管理后台图书、管理用户信息 Where 借书台、办公室 What 一个图书管理系统,能实现图书的借书还书操作、管理后台图书信息、管理用户信息 Why 能够方便快捷的实现图…

程序员奶爸用树莓派制作婴儿监护仪:哭声自动通知,还能分析何时喂奶

作者 | Fabio Manganiello译者 | 弯月,责编 | 杨碧玉头图 | CSDN 下载自东方 IC来源 | CSDN(ID:CSDNnews)首先,告诉大家一个好消息,我当爸爸了!我不得不暂停一下我的项目来承担一些育儿的重任。…

python快速小教程

http://www.cnblogs.com/vamei/archive/2012/09/13/2682778.html

web标准的投资回报

web标准的投资回报(ROI)作者:阿捷 2004-7-6 0:17:49原文作者:D. Keith Robinson 原文出处:asterisk 原文发表时间:2004年6月1日 用web标准开发能够带来实际利益,这一点还有人怀疑吗? 如果有,…

使用javascript让项目支持热插拔

2019独角兽企业重金招聘Python工程师标准>>> 突然想起之前做过的一个小项目,项目虽小,需求却不小,要求解析特定格式的字符串,并且特定格式并非一成不变,想要一套系统能够支持解析多变的规则且更改规则时不能…

设计模式:状态模式(State Pattern)

作者:Wang Juqiang 创建于:2012-07-16 出处:http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html 收录于:2013-03-01 结构图 意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 适用性…

拼命学的编程,你却可能错过一个亿!

先来看 2 则新闻:近日 AI 圈最火的新闻当属“AI独角兽依图科技上市”,“AI四小龙”先后开启了上市之路,继旷视科技、云从科技分别谋求港股、A股上市后,依图科技也加入了 IPO 队伍。国内 AI 科技公司的发展,也标志着国家…

web标准的商业价值

web标准的商业价值作者:阿捷 2004-7-3 0:37:26原文来自:adaptivepath.com 作者介绍:Jeffrey Veen是AdaptivePath.com的合伙人之一,专门研究网页设计新技术,你可以在他的个人站点veen.com上学到更多知识。 自从开始we…

OO真经——关于面向对象的哲学体系及科学体系的探讨(上)

http://www.cnblogs.com/leoo2sk/archive/2009/04/09/1432103.html 目录 Catelog 序言 Perface 真经第一章:世界 Waltanschauung 真经第二章:抽象 Abstraction 真经第三章:层次 Arrangement 真经第四章:继承 Inheritance 真经第五…

一次防CC***案例

本文来自 :http://baiying.blog.51cto.com/1068039/1113087 名词解释:摘自百度百科 名称起源 CC Challenge Collapsar,其前身名为Fatboy***,是利用不断对网站发送连接请求致使形成拒绝服务的目的, CC***是DDOS(分布…

滴滴联合比亚迪:首款定制网约车D1发布

11月16日,滴滴出行举办“滴滴开放日”,正式发布全球首款定制网约车D1。这款车基于滴滴平台上5.5亿乘客、上千万司机需求、百亿次出行数据,针对网约车出行场景,在车内人机交互、司乘体验、车联网等多方面进行定制化设计。作为第一款…

表格对决CSS--一场生死之战

表格对决CSS--一场生死之战作者:阿捷 2004-7-19 21:00:54原文作者:Sergio Villarreal 作者简介:墨西哥网页设计师,1993年接触网络,个人主页为Overcaffeinated.net 原文出处:sitepoint.com 原文发表时间&…

使用Docker-Docker for Web Developers(2)

1. 使用镜像 1.1 在Docker Hub上查找镜像 我们查找一下之前博客里面,推送到Docker Hub里面的bage88/docker-demo,能看到有2个仓库,第一个就是我们上次上传的镜像。点击“Details”进入到详细页面。 1.2 拉取镜像到本地机器 在我们本地虚拟机上…

赠书 | 图像分类问题建模方案探索实践

作者 | 中国农业银行 陆春晖责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国*文末有赠书福利背景图像分类,是计算机视觉领域的一个核心问题,顾名思义就是输入一张图像,根据内容将其划分到某一个特定的类别。与其他分类问题相比&a…

数据库开发个人总结(ADO.NET小结)

一.用SqlConnection连接SQL Server 1..加入命名空间using System.Data.SqlClient;2.连接数据库SqlConnection myConnection new SqlConnection();myConnection.ConnectionString "user idsa;passwordsinofindb;initial catalogtest;data source127.0.0.1;Con…

PHP 调用C的代码

用php调用C函数,常通过调用系统命令函数的方式来实现,其中主要有system()和exec()两种,还有一种是passthru(),这种方法没有尝试,暂不作讨论。 system()方法输出并返回最后一行的shell结果。 exec()不输出结果,返回最后…

态势“知”多少,点开就知道

2019独角兽企业重金招聘Python工程师标准>>> 态势感知,最核心的是“知” 关于“知” 典故不少 《孙子兵法》六千多字,“知”出现了79次,只有《势篇》与《行军篇》中没有“知”字。 史称两个半完人之一的王阳明 在经过五溺三变的曲…

17 种正则表达式

作者:http://blog.csdn.net/hivak47/archive/2004/10/31/161006.aspx"^/d$" //非负整数(正整数 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-/d)|(0))$" //非正整数(负整数 0&#xff09…

程序员如何乘风破浪?从数据库历史看技术人发展 | CSDN 高校俱乐部

2009 年我国数据库软件市场规模为 35.03 亿元,2017 年我国数据库软件市场规模增长至 120.00 亿元。8年时间内,我国数据库软件市场始终保持平稳增长,年均复合增长率为 17.5%,且增速呈现递增趋势。根据中研产业研究院估计&#xff0…

陶哲轩实分析 定理 13.3.5 :紧致度量空间上的连续函数一致连续

设 $(X,d_X)$ 和 $(Y,d_Y)$ 都是度量空间,假定 $(X,d_X)$ 是紧致的,如果 $f:X\to Y$ 是函数,那么 $f$ 是连续的当且仅当 $f$ 是一致连续的.证明:当 $f$ 是一致连续时,$f$ 显然是连续的.我们主要证明 $f$ 连续时一致连续.我们采用反证法,假若 $f$ 不是一致收敛的,意味着无论如何…

SQLServer------插入数据时出现IDENTITY_INSERT错误

详细错误信息: 当 IDENTITY_INSERT 设置为 OFF 时,不能为表 Student 中的标识列插入显式值。 原因: 表中存在某个字段是自动增长的标识符 解决方法: set IDENTITY_INSERT Student ON //设置为OFF时表示不能手动给拥有标识符的列插…

ASP.NET 制作让搜索引擎可以友好访问的链接

作者:http://www.donews.net/lealting/archive/2004/03/31/9759.aspx今天看了一篇文章,主要是讲,如何制作让搜索引擎可以友好访问的链接,大概的内容是这样的:很多的时候我们在进行查询的时候,总是会以这样的…

机器学习中的7种数据偏见

作者 | Hengtee Lim翻译 | Katie,责编 | 晋兆雨出品 | AI科技大本营头图 | 付费下载于视觉中国机器学习中的数据偏差是一种错误,其中数据集的某些元素比其他元素具有更大的权重和或表示。有偏见的数据集不能准确地表示模型的用例,从而导致结果…

windows7 下arp 绑定的实现

局域网的arp***常常让人头痛,绑定IP/MAC地址是解决方式之一; 在xp下面绑定mac地址很简单,只需“arp -s IP地址 MAC地址 ”就ok, 在win7下的命令有所不同; 首先,需要查看可用网卡的id,使用命令n…

Asp.net(c#)实现多线程断点续传

http://www.cnblogs.com/bestcomy/archive/2004/08/10/31950.html以前一直错误的认为在ASP.NET中无法通过编程方式实现多线程断点续传,今天终于获得了这样一个解决方案,让我明白要学习的东西还很多。此解决方案基于其它解决方案及相关资料,根…

0.7秒完成动漫线稿上色,爱奇艺发布AI上色引擎

出品 | AI科技大本营(ID:rgznai100)中国漫画的需求量在不断增加,而动漫制作成本一直居高不下。究其原因为动漫制作是一个复杂且耗时的过程,需要大量工作人员在不同阶段进行协作。动漫制作过程中,需先创作关键帧草图&am…

Java Web整合开发读书笔记

下载JDK:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 下载Eclipse: http://www.eclipse.org/downloads/ 下载Tomcat: http://tomcat.apache.org/download-70.cgi 正则表达式:http://www.cnblogs.com/deerchao…

ListView中CheckBox使用问题

因为CheckBox的点击事件优先级比ListView的高,所以当ListView中使用CheckBox会导致ListView的setOnItemClickListener失去响应。 解决的方法:在CheckBox中加入android:focusable"false"。使得CheckBox初始的时候没有获取焦点。 假设想在单击C…

网页播放的视频代码

网页播放的视频代码 第一种是通过调用window media player进行播放诸如&#xff1a;wmv,asf等格式文件: <object alignmiddle classOBJECT classidCLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 height320 idMediaPlayer width356> <param name"ShowStatusBar…