• 产能紧缺!光刻胶要靠抢,是机遇还是挑战

    产能紧缺!光刻胶要靠抢,是机遇还是挑战

    一颗芯片的诞生大致可以分为三个环节,先设计、再生产、最后进行封装和测试。当前,在芯片制造的环节中,原材料紧缺、产能供不应求同样存在。 而光刻胶是芯片封测的重要原材料,一瓶4公斤的光刻胶成本约4-5万元,能制造约400万颗芯片。3月22日,央视财经聚焦芯片市场调查,报道了芯片生产存在原材料紧缺,产能满负荷的情况。天科技(昆山)电子负责人介绍,由于订单爆满,下游芯片需求不断增加,公司从去年到现在不断扩充产能,目前产能处于满负荷状态。据央视财经报道,全球芯片短缺引发上游芯片材料供应紧张,企业进口光刻胶困难。海关人员介绍称,以往企业采购光刻胶的量每次都在100多公斤,近期由于原材料紧缺,企业每次只能买到很少的量(10-20公斤),价格方面也随之水涨船高。 虽然光刻胶缺货很严重,但国内公司很难使得上劲儿。国内光刻胶的自给率只有10%,而且以中低端产品为主,无法满足下游厂商的需求。所以行业缺货很难全面传导到上市公司业绩中,这个道理应该很容易理解。因为光刻胶影响着整个光刻工艺,芯片制造商不会轻易换产品。已经具备光刻胶产能并开始向客户交付的公司,才能真正受益于这波景气周期。 芯片的诞生由两个步骤决定,设计与生产。设计方面,上至北斗导航系统,下至各种手机,都有我国自行设计的芯片,但是在生产方面,却一直有一道难以逾越的坎放在国产芯片行业面前——光刻胶。光刻胶是一种对光敏感的混合液体,也是微电子技术中微细图形加工最重要的关键材料,光刻胶的质量对光刻工艺有着重要影响,其主要作用是在光刻过程中,起到防腐蚀的保护作用。光刻胶可分为半导体光刻胶、面板光刻胶和PCB光刻胶。其中,半导体光刻胶的技术壁垒最高,目前中国国内市场上半导体设备商也多为国外厂商。 作为唯一被Semicon列入全球光刻胶八强的中国光刻胶公司,2020年北京科华光刻胶销售8928万元,是中国销售额最高的光刻胶公司,也是产品科技含量最高的公司。其中i线光刻胶产品销售额5495万元,占中国i线光刻胶销售额的16.7%,中国i线产品国产替代基本上靠北京科华贡献。同时,北京科华是KrF光刻胶国家02专项的承担单位,2020年KrF(248nm)光刻胶销售286万元,是唯一可以批量供应KrF光刻胶给8寸和12寸客户的本土光刻胶公司。在彤程新材赋能北京科华后,北京科华将在现有基础上,快速发展。248nm光刻胶预计将会在2023年达到10%市占率,i线产品在2023年达到50%市占率。 目前,日本占据了全球9成左右的光刻胶市场份额。全球专利分布前十的公司,约有7成来自日本。其中,日本JSR和东京日化、信越化工掌握着EUV光刻胶的供应,富士胶片和住友化学也计划将在2021年量产EUV光刻胶。另外,值得肯定的是,国内相关企业在近年来也在集中力量攻克高端光刻胶的产业化。以宁波南大光电为例,该公司自主研发的ArF193nm光刻胶产品在2020年12月通过了客户的使用认证,这意味着我国ArF光刻胶产品开发和产业化项目取得了关键性的突破。晶瑞股份发布2020年度报告,报告期内公司实现营业收入1,022,332,455.74元,同比增长35.28%;归属于上市公司股东的净利润76,950,097.76元,同比增长145.72%。报告期内经营活动产生的现金流量净额为63,782,672.24元,截至2020年末归属于上市公司股东的净资产1,314,263,604.16元。2020年度,公司营业收入与上年相比有所增长,比上年同期增长35.28%。随着我国芯片制造行业国产替代进程加速,报告期内,公司核心产品光刻胶及配套材料的销售取得历史最好成绩。

    嵌入式新闻 光刻胶 半导体 芯片

  • 央视报道!芯片缺货导致价格大涨

    央视报道!芯片缺货导致价格大涨

    最近半导体行业产能紧张,缺货可以说是近期很难拿解决了,价格也应声而涨,中国去年进口了2.4万亿元的集成电路,涨价一事也影响到国内产业,芯片的交期延长了很多。继之前关注挖矿导致显卡涨价之后,央视财经频道昨晚又关注了芯片缺货的问题,采访了多个业内公司。 华天科技(昆山)电子采购经理表示,像她以往在这个行业从事了十几年,从来没遇到过这么紧张的情况,现在的情况和以前大不相同了,尤其在光刻胶这一块,以往都是供应商找上门,可现在的情况是厂家去找供应商端,直接在供应商端的办公室来办公。 去年开始,受 5G 手机芯片用量大幅提升和关键厂商大幅备货影响,芯片出现明显供不应求,而今年受汽车等行业复苏的推动,部分下游仍在持续追单,导致供不应求进一步加剧,出现了历史上少有的晶圆产能状况,目前仍然是 PMIC、driver IC 和 RFIC 等传统制程芯片紧缺最为明显,需要挤压相关芯片向更高阶制程 升级来逐步缓解缺口瓶颈。而经过此轮缺口以后,大部分下游品牌将会保留更多的库存以应对风险,整体供需缺口短期很难根本性改变,判断缺货可能还会持续一年以上。 球芯片短缺,从去年三季度爆发以来,已经波及了汽车、手机、PC 等多个行业。事实上,在上游芯片制造、汽车电子等环节,也普遍存在短缺现象。位于江苏昆山的蔚隆汽车电子,是国内新能源汽车域控制器领域市场份额最大的公司,域控制器就相当于电脑的中央处理器。公司原料库生产负责人表示,汽车上的通讯芯片作为核心原材料,从去年至今一直很紧缺。现在的交期不断拉长,据公司负责人介绍,通常一颗芯片的制造周期为 3-6 个月,而从去年三季度以来,交付周期不断拉长,有的品类甚至超过一年,这说明了什么问题呢?“也就是说今天下订单,在 500 天之后才能拿到货”。 日本东京芯片制造商瑞萨一家工厂上周五发生火灾。瑞萨电子公司总裁柴田英利表示,公司重要工厂日前发生火灾,可能对供应链产生非常大的影响,公司将竭尽全力使受灾工厂在一个月内恢复生产。在全球芯片供应紧缺的情况下,瑞萨芯片工厂的火灾势必会加剧全球的芯片供应难题,而苹果产品的生产也会受到影响。因为瑞萨正是苹果的供应商之一。 按照半导体市场的发展规律,芯片缺货属于正常情况,且存在一定的缺货周期。在总供应不变的情况下,需求时强时弱,存在从强转弱或从弱到强的动态变化,但当下这一动态出现不平衡和矛盾点,芯片缺货的周期规律发生巨大变化,芯片短缺已成为新常态。 此前,半导体行业的发展奉行三段论,从存货到消化库存再到重新拉库存。但这一理论从2016年之后不再适用,导致企业可能在价格高时反而拉高库存,造成供需动态不平衡。缺少芯片的情况是近期芯片缺货潮最新的蔓延警讯。受到全球芯片缺货潮的冲击,目前已经造成汽车制造商不得不关闭产线。在消费电子制造商方面,目前也因此而正在简火生产速度。例如韩国三星就发出警讯指出,因为严重芯片供需失衡,预期将会冲击下一季三星的整体财务营收状况。因此,如何积极改变这样的情况,已经成为全球半导体企业当前最重要的课题。 持续不断的供需不平衡,芯片制造面困难,以前靠晶圆制造技术驱动的集成电路产业,可能会走向以晶圆制造加封装为核心驱动力的发展方向。国外的芯片生产企业受到了疫情和气候问题的影响,导致生产能力大降,因此导致的芯片短缺越来越严重,这对国内的半导体生产企业是一个利好,截止目前,A股半导体版块相关股票大涨,希望国内生产企业能够担起来责任,加强科研投入,早日摆脱对国外的依赖。此次既是挑战也是机会,希望中国企业能够抓住机遇,奋力发展。

    嵌入式新闻 缺货 芯片缺货 半导体 芯片

  • 大缺货,网通芯片何去何从?交期最长博通高达50周

    大缺货,网通芯片何去何从?交期最长博通高达50周

    随着上游晶圆制造产能的持续紧缺,网络通信行业也开始爆发史上最大芯片缺货潮。据台湾媒体报道,近日全球网络通信芯片龙头大厂博通已通知客户,旗下网通主芯片交期拉长至50周,部分芯片更是长达一年以上。网通设备厂直言“缺料看不到尽头”,大量订单转移至联发科、瑞昱、立积等台厂,下游疯狂扫货,联发科、瑞昱交期也上看30周。可以说是遇到了最大的缺货潮。 台湾网通主芯片供应商以联发科、瑞昱为代表,成为此波缺货最大受惠厂。联发科近期手机芯片在主要对手高通出货因三星德州厂停工而受阻下,大量安卓手机厂商订单涌进,如今网通芯片拉货动能也同步强劲。联发科不评论交货情况及价格,强调在产能吃紧的情况下,会与晶圆代工厂紧密合作,希望业绩稳健成长。瑞昱是台湾最大网通芯片厂,产品线涵盖乙太网路、交换器、WiFi、蓝牙、音效解码、电视等领域。面对全球网通芯片大缺货,瑞昱表示,在产能有限的情况下,会按照需求的轻重缓急,持续优化产出,进行产销协调。 台系相关网通芯片供应商表示,目交货的产品都是数月之前所下的订单,而且交货也无法一次全部交货,必须分阶段的交货,而且无法预期什么时候可以完全交货完毕,必须看芯片制造企业的产能状况。有企业指出,当前经常被客人追着订单跑,还被抱怨无法交齐数量。不过,在对客户说明现在的情况,甚至表示已经尽全力将部分产品交货后,客户在当前缺货潮的情况下,反而会回头感谢供应商的协助与帮忙。至于,接下来何时还能再交货,厂商表示也只能慢慢等。 产能缺货有三方面的原因: 1)下游在线办公、5G、LoT及新能源汽车智能化叠加一起,导致芯片需求旺盛,上游厂家产能紧张。 2)上游晶圆制造的产能主要集中在台积电、联电、世大、中芯国际这几家大厂手里,这几家厂目前的产能利用率均超过90%。 3)晶圆厂扩产的门槛较大,随便建一个晶圆厂就要花费上百亿的资金,这还没算上研发费用,所以一时半会扩产很难。 由于供应紧张,芯片以及核心原材料也随之水涨船高,有一些甚至加价也很难能抢到货物。IT之家了解到,据海关人员介绍,以往企业采购光刻胶的量每次在 100 多公斤,近期由于原材料紧缺,企业每次只能买到很小的量。去年开始,受 5G 手机芯片用量大幅提升和关键厂商大幅备货影响,芯片出现明显供不应求,而今年受汽车等行业复苏的推动,部分下游仍在持续追单,导致供不应求进一步加剧,出现了历史上少有的晶圆产能状况,目前仍然是 PMIC、driver IC 和 RFIC 等传统制程芯片紧缺最为明显,需要挤压相关芯片向更高阶制程 升级来逐步缓解缺口瓶颈。而经过此轮缺口以后,大部分下游品牌将会保留更多的库存以应对风险,整体供需缺口短期很难根本性改变,判断缺货可能还会持续一年以上。 中银证券指出,全球经济数字化趋势下,在线办公、5G、IoT、汽车电动化等叠加在一起,导致先进制程需求旺盛且成熟制程产能紧缺,逻辑电路晶圆厂扩产将持续,全球范围内半导体设备供应商业绩持续向好;尽管晶圆制造已经向日韩及中国台湾地区、中国大陆地区转移,但芯片供应安全问题使得美国、欧洲重回晶圆制造的决心,半导体行业将进入以亚太、美、欧为分布的新时期,利好半导体设备供应商。半导体产业过去两年经历了一波全面性的牛市,这轮科技牛市成长最快的就是诺安成长这家几百亿的基金。

    嵌入式硬件 博通 网通芯片

  • 6个“吓人”的Linux命令

    crypt 好吧,我们一直都有crypt。顾名思义,crypt不是存放垃圾文件的地宫或墓坑,而是加密文件内容的命令。 如今,“crypt”通常作为一个脚本而实现:通过调用一个名为mcrypt的二进制程序,模拟较旧的crypt命令,从而发挥其功用。直接使用mycrypt命令是一种更好的选择。 $ shred dupes.txt $ more dupes.txt ▒oΛ▒▒9▒lm▒▒▒▒▒o▒1־▒▒f▒f▒▒▒i▒▒h^}&▒▒▒{▒▒ zombies 虽然zombies(僵尸进程)不是一个命令,但它在Linux系统上却根深蒂固。zombies基本上是没有被完全清除的死亡进程的残骸。 进程不应该以这种方式运行——任由死亡进程逗留,而不是仅仅让它们死亡、进入数字天堂,所以zombies的存在表明了留下它们的进程存在某种缺陷。 检查你的系统是否有僵尸进程残留下来,一个简单的方法就是查看top命令的标题行。 好吓人!上面显示有三个僵尸进程。 $ ps -ef | grep sshd root 1142 1 0 Oct19 ? 00:00:00 /usr/sbin/sshd -D root 25342 1142 0 18:34 ? 00:00:00 sshd: shs [priv] $ ps -ef | grep daemon | grep -v grep message+ 790 1 0 Oct19 ? 00:00:01 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation root 836 1 0 Oct19 ? 00:00:02 /usr/lib/accountsservice/accounts-daemon

    嵌入式ARM Linux crypt

  • C++ 连载内容汇总

    C ++ 的连载教程就到此结束了,所涉及的内容也只是 C++ 中很浅显的一部分,写这个连载教程也是记录笔者学习 C++ 的一个过程,同时也提供了一个适合具备 C 语言基础的C++入门教程, 快速的掌握 C++ 相对于 C 语言来说独特的语言特性,为了方便大家查看,以下就是所有 C++ 连载教程的一个汇总链接。 (一) C++ 的引入,this 指针,程序结构,函数重载,引用和指针 (二) 构造函数,析构函数,拷贝构造函数,对象的构造顺序 (三) C++命名空间,静态成员,友元函数,运算符重载 (四)返回值为引用和非引用的区别,类内实现运算符重载函数 (五)封装,继承,继承后的访问控制,调整访问控制,三种不同继承方式的差异 (六)派生类扩展父类的功能,派生类的空间分布,多重继承,虚拟继承 (七)多态,虚函数,多态的限制 (八)C++类型转换 (九)纯虚函数,抽象类,多文件编程,动态链接库 (十)抽象类界面,模板函数的引入,模板函数参数的推导过程 (十一)函数模板重载,类模板,类重载 (十二)异常的引入,异常处理机制 (十三)智能指针 (十四)轻量级指针 (十五)强指针,弱指针 以上就是 C++ 连载的所有内容,笔者能力有限,内容难免有纰漏之处,如果各位朋友在阅读的时候发现错误,欢迎指出来,不胜感激,下面是笔者的联系方式,也欢迎各位朋友添加微信好友,一起探讨技术问题,共同进步~ 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    wenzi嵌入式软件 指针 C

  • C语言模拟实现字符串操作函数

    前言 在编写程序过程中,我们经常使用到一些字符串函数,例如求字符串长度,拷贝字符串……,这些函数都在C标准库中存在,我们可以直接使用。但我们还需要掌握这些函数的实现方法,今天来看看一些常用的字符串操作函数的实现方法。 带长度参数的函数 1. strlen strlen是用来求字符串长度的函数,字符串长度就是字符串中包含的字符的个数,但是不包含字符串结尾的 ‘\0’ 实现strlen有三种方法: (1)定义一个计数器 size_t mystrlen(const char* str) { size_t count = 0; while (*str != '\0')     {         count++;         str++;     } return count; } (2)递归版本 size_t my_strlen(const char *str) { if (*str == '\0') return 0; else return my_strlen(str + 1) + 1; } (3)利用指针 - 指针 size_t mystrlen(const char* str) { const char* end = str; while (*end++); return end - str - 1; } 2.strcpy 用于复制字符串的函数是strcpy,它的原型如下: char* strcpy ( char* dest, const char* src ); 使用这个函数时,要注意几点 (1)目标字符数组的空间必须足够大,足以容纳需要复制的字符串 (2)目标字符数组要可以被修改 (3)被复制的字符串要可以找到’\ 0’ char *mystrcpy(char *dest, const char *src) { char *res = dest;     assert(dest);     assert(src); while (*dest++ = *src++) ;//注意这里是一个等号 return res; } 3.strcat strcat函数是可以把一个字符串添加(连接)到另一个字符串的后面。strcat函数要求dest参数原先已经包含了一个字符串(可以是空字符串)。它找到这个字符串的末尾,并把src字符串的一份拷贝添加到这个位置。 char *mystrcat(char *dest, const char *src) { char *res = dest;     assert(dest);     assert(src); while (*dest != '\0')         dest++; while (*dest++ = *src); //这里同样也是一个等号 return res; } 4.strcmp strcmp用于比较两个字符串,及对两个字符串对应的字符逐个进行比较,直到发现不匹配。那个最先不匹配的字符中较“小”的那个字符所在的字符串被认为“小于”另外一个字符串。如果其中一个字符串是另外一个字符串的前面一部分,那么它也被认为“小于”另外一个字符串,因为它的’\0’出现的更早。 int my_strcmp(const char* src1, const char* src2) { while (*src1 == *src2)     { if (*src1 == '\0') return 0;          src1 ++;          src2 ++;      } return *src1 - *src2;  } 5.strstr 为了在一个字符串中查找一个子串,可以使用strstr函数,该函数是在s1中查找整个s2第1次出现的起始位置,并返回一个指向该位置的指针。如果s2并没有出现在s1的任何地方,函数将返回一个NULL指针。如果第二个函数是一个空字符串,函数就返回s1。 char* my_strstr(char* s1, const char* s2) { char* p = s1; const char* q = s2; char* cur = NULL;     assert(s1);     assert(s2); if (*s2 == '\0') return s1; while (*p != '\0')     {         cur = p; while ((*p != '\0') && (*q != '\0') && (*p == *q))         {             p++;             q++;         } if (*q == '\0') return cur;         p = cur + 1;         q = s2;     } return NULL; } 6.strchr strchr是用来查找一个特定的字符,在字符串str中查找字符ch第一次出现的位置,找到后函数返回一个指向该位置的指针。如果该字符并不存在于字符串中,函数就返回一个NULL指针 char* my_strchr(const char* str, char ch) { const char* tmp = str; while (*tmp)     { if (*tmp == ch) return tmp;         tmp++;     } return NULL; } 7.strrchr 与strchr类似的查找函数还有一个是strrchr,它和strchr的不同之处在于,该函数返回的是一个指向字符串中该字符最后一次出现的位置 char* my_strrchr(const char* str, int ch) { char* pos = 0;     assert(str); while (*str)     { if (*str == ch)         {             pos = str;         }         str++;     } if (pos != 0)     { return pos;     } else return NULL; } 长度受限制的字符串函数 标准库中还包含一些函数,它们以一种不同的方式去处理字符串。这些函数接受一个显示的长度参数,用于限定进行复制或比较的字符数。 1.strncpy 和strcpy一样,strncpy()函数把源字符串的字符复制到目标空间,但是,它总是正好向dest中拷贝len个字符,如果strlen的(src)的值小于len,dest数组就用额外的’\0’填充到len字节长度。如果strlen的(src)的值大于或等于len,那么只有len个字符被复制到目标寄存器中。 char* my_strncpy(char* dest, const char* src, size_t len) { char* res = dest;     assert(dest);     assert(src); while (len--)     {         *res++ = *src++;     } if (*(res) != '\0')         *res = '\0'; return dest; } 2.strncat strncat函数,它从src中最多复制的len个字符到目标数组的后面。 char* my_strncat(char* dest, const char* src, size_t len) { char* res = dest;     assert(dest);     assert(src); while (*dest != '\0')         dest++; while (len--)     {         *dest = *src;         dest++;         src++;     } return res; } 3.strncmp strncmp也用于比较两个字符串,但它最多比较len个字节。如果两个字符串在第len个字符之前存在不相等的字符,这个函数就像的strcmp一样停止比较,返回结果。如果两个字符串的前len个字符相等,函数就返回零。 int my_strncmp(const char* s1, const char* s2, size_t len) {     assert(s1);     assert(s2); while (len--)     { if (*s1 == *s2)         {             s1++;             s2++;         } else return *s1 - *s2;     } return 0; } 标准库里的字符串函数还有很多,今天就先介绍到这里。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    嵌入式大杂烩 C语言 字符串

  • STM32CubeMX | | 使用小熊派串口驱动峰汇ETH-01以太网模块上传数据到OneNet

    前两天世伟兄发了一篇RJ45以太网模块的技术分享文章,用的是W5500以太网模块,他也将他的学习成果和实验共享到我们的私聊小蜜圈里,这是他分享的文章。 最近我也在用类似的模块,但我选的这个模块更简单,没有W5500那么复杂,它就是峰汇物联开发的一款ETH-01串口以太网模块,外观如下: 1、硬件管脚说明 2、STM32CubeMX配置 以下根据目前需要配置为TCP客户端模式,方便后面与云平台通信: 2.1、时钟配置 2.2、调试接口配置 2.3、调试串口配置 2.4、网口模块配置 网口模块通信串口配置如下,这里用的是USART3: 然后采用串口+DMA的方式来处理。 以下是读TCP状态的IO,配置为上拉输入模式,用于监测网卡是否已经连接服务器 以下是配置模式IO,当输出电平为低时为指令配置模式,当输出电平为高时为数据透传模式: 2.5、调试灯配置 2.6、生成工程 3、软件编程 由于官方没有提供MCU的例程,所以只能从头到尾自己写啦,由于篇幅原因,这里仅分享其中一部分代码,完整工程请从我的码云上clone获取,以下根据目前需要配置为TCP客户端模式,方便后面与云平台通信: 3.1、串口指令配置模块之写命令操作 命令头1 命令头2 命令码 数据 0x57 0xAB 由于需要进行TCP传输,所以只设置红框圈起来的这几个指令就好了,还有一个更新指令到EEPROM的在手册示例里出现。 根据要求,简单实现如下函数(暂时不优化,先保证能用即可): rj45_eth.h头文件实现如下: #ifndef __RJ45_ETH_H #define __RJ45_ETH_H #include "main.h" #define UART_NNUM      USART3 #define UART_PORT      &huart3 #define RJ45_CONFIG_PORT  GPIOC #define RJ45_CONFIG_PIN     GPIO_PIN_9 #define RJ45_READ_TCP_STATUS_PORT   GPIOA #define RJ45_READ_TCP_STATUS_PIN     GPIO_PIN_8 #define RJ45_RXBUFFER_SIZE 1024 #define RJ45_TXBUFFER_SIZE 1024 #define NR_RJ45(x)  (sizeof(x)/sizeof(x[0])) #define Delay_ms(x) HAL_Delay(x) #define ACK_OK 0 #define ACK_TIMEOUT 1 typedef struct {     __IO uint8_t  BufferReady ;     uint8_t  RJ45TxBuffer[RJ45_TXBUFFER_SIZE];     uint8_t  RJ45RxBuffer[RJ45_RXBUFFER_SIZE]; } RJ45HandleTypeDef; extern RJ45HandleTypeDef RJ45r_Handler ; typedef struct _DEVICEPORT_CONFIG {     uint8_t dataMode;  /* 数据模式:0:命令模式 1:透传模式*/     uint8_t bNetMode;    /* 网络工作模式: 0: TCP SERVER;1: TCP CLENT; 2: UDP SERVER 3:UDP CLIENT; */     uint8_t  gDesIP[4];   /* 目的IP地址 */     uint16_t gNetPort;    /* 目的端口号 */     uint8_t  bMacAddr[4]; /* 芯片MAC地址*/     __IO uint8_t tcp_status ; /*服务器连接状态*/ } DevicePortConfigS; extern DevicePortConfigS Deice_Para_Handledef ; /**********************写指令函数*************************/ /*使能RJ45配置模式*/ void Enable_RJ45_Config_Mode(void); /*RJ45设置模式*/ uint8_t RJ45_Set_Mode(uint8_t mode, uint16_t delay_ms); /*设置模块目的端口号*/ uint8_t Set_Module_Gobal_Port_Number(uint16_t number, uint16_t delay_ms); /*RJ45设置目标IP*/ uint8_t Set_Module_Gobal_Ipaddr(uint8_t bit0, uint8_t bit1, uint8_t bit2, uint8_t bit3, uint16_t delay_ms); /*更新配置参数到EEPROM*/ uint8_t Update_Config_Para_To_EEPROM(uint16_t delay_ms); /*执行配置参数*/ uint8_t Runing_Config_Para_To_EEPROM(uint16_t delay_ms); /*配置RJ45模块参数*/ uint8_t Config_RJ45_Module_Para(void); /**********************写指令函数*************************/ /**********************读指令函数*************************/ /*获取芯片工作模式*/ void Get_RJ45_Chip_Work_Mode(uint16_t delay_ms); /*获取芯片目的IP地址*/ void Get_RJ45_Chip_Gobal_Ipaddr(uint16_t delay_ms); /*获取芯片目的端口号*/ void Get_RJ45_Chip_Gobal_Port_Number(uint16_t delay_ms); /*获取芯片Mac地址*/ void Get_RJ45_Chip_Mac_Addr(uint16_t delay_ms); /*获取RJ45模块参数*/ uint8_t Get_RJ45_Module_Config_Para(void); /**********************读指令函数*************************/ /*使能RJ45配置模式*/ void Enable_RJ45_Config_Mode(void); /*失能RJ45配置模式*/ void Disable_RJ45_Config_Mode(void); /*检测TCP状态,返回1则为未连接,返回0则已连接*/ /*进入数据透传模式*/ uint8_t Enter_Data_Penetrate_Mode(void); /*退出数据透传模式*/ uint8_t Quit_Data_Penetrate_Mode(void); //RJ45发送网络透传数据函数,必须在透传模式下使用 void RJ45_Send_NetWork_Penetrate_Data(char* fmt, ...); uint8_t Check_TCP_Status(void); #endif //__RJ45_ETH_H 以设置模式为例编写函数: /*使能RJ45配置模式*/ void Enable_RJ45_Config_Mode(void) {   /*关闭空闲中断,此时不接收非配置模式的数据,只接收模块本身指令收发的回复数据*/   __HAL_UART_DISABLE_IT(UART_PORT, UART_IT_IDLE);     HAL_GPIO_WritePin(RJ45_CONFIG_PORT, RJ45_CONFIG_PIN, GPIO_PIN_RESET); } /*使能DMA,清除数据包*/ static void Enable_And_Clear_Data_Packet(void) {     HAL_UART_DMAStop(UART_PORT);     memset(RJ45r_Handler.RJ45TxBuffer, 0, RJ45_TXBUFFER_SIZE);     memset(RJ45r_Handler.RJ45RxBuffer, 0, RJ45_RXBUFFER_SIZE);     HAL_UART_Receive_DMA(UART_PORT, RJ45r_Handler.RJ45RxBuffer, RJ45_RXBUFFER_SIZE); } /*0 成功  其他失败*/ static uint8_t RJ45_Check_Cmd_Ack(uint8_t ack) { if(RJ45r_Handler.RJ45RxBuffer[0] == ack) return 0; return 1; } /*RJ45设置模式*/ uint8_t RJ45_Set_Mode(uint8_t mode, uint16_t delay_ms) {     uint8_t Res = 0 ;     Enable_And_Clear_Data_Packet();     RJ45r_Handler.RJ45TxBuffer[0] = 0x57 ;     RJ45r_Handler.RJ45TxBuffer[1] = 0xab ;     RJ45r_Handler.RJ45TxBuffer[2] = 0x10 ;     RJ45r_Handler.RJ45TxBuffer[3] = mode ;     wifi_uart_write_data( RJ45r_Handler.RJ45TxBuffer, 4); while(delay_ms--)     {         Res = RJ45_Check_Cmd_Ack(0xAA) ; if(0 == Res) return 0 ;         Delay_ms(1);     } return ACK_TIMEOUT ; } 在调用如上设置指令前,先要将配置引脚拉低,然后开启DMA接收,接下来按照通信协议要求将对应的格式填入到发送Buffer,然后调用wifi_uart_write_data函数将协议数据通过串口发给模块,在一定超时延时以后,需要检测DMA接收缓存区是否有协议回复AA,如果有则表示该指令设置成果,这样就完成了写数据的过程,其它指令也是类似的,我们只需要照着手册实现即可。 3.2、串口指令配置模块之读命令操作 命令头1 命令头2 命令码 0x57 0xAB 读命令比写命令要简洁许多,查看手册主要支持以下指令: 同样的,由于例程需要进行TCP传输,所以只实现红框圈起来的这几个指令就好了。 以获取芯片工作模式、获取芯片目的IP地址为例,实现如下函数: /*获取芯片工作模式*/ void Get_RJ45_Chip_Work_Mode(uint16_t delay_ms) {    Enable_RJ45_Config_Mode();     Enable_And_Clear_Data_Packet();     RJ45r_Handler.RJ45TxBuffer[0] = 0x57 ;     RJ45r_Handler.RJ45TxBuffer[1] = 0xab ;     RJ45r_Handler.RJ45TxBuffer[2] = 0x60 ;     wifi_uart_write_data( RJ45r_Handler.RJ45TxBuffer, 3);     Delay_ms(delay_ms);     Deice_Para_Handledef.bNetMode = RJ45r_Handler.RJ45RxBuffer[0]; } /*获取芯片目的IP地址*/ void Get_RJ45_Chip_Gobal_Ipaddr(uint16_t delay_ms) {    Enable_RJ45_Config_Mode();     Enable_And_Clear_Data_Packet();     RJ45r_Handler.RJ45TxBuffer[0] = 0x57 ;     RJ45r_Handler.RJ45TxBuffer[1] = 0xab ;     RJ45r_Handler.RJ45TxBuffer[2] = 0x65 ;     wifi_uart_write_data( RJ45r_Handler.RJ45TxBuffer, 3);     Delay_ms(delay_ms);     Deice_Para_Handledef.gDesIP[0] = RJ45r_Handler.RJ45RxBuffer[0] ;     Deice_Para_Handledef.gDesIP[1] = RJ45r_Handler.RJ45RxBuffer[1] ;     Deice_Para_Handledef.gDesIP[2] = RJ45r_Handler.RJ45RxBuffer[2] ;     Deice_Para_Handledef.gDesIP[3] = RJ45r_Handler.RJ45RxBuffer[3] ; } 与写命令操作一样,在调用如上读指令前,先要将配置引脚拉低,然后开启DMA接收,接下来按照通信协议要求将对应的格式填入到发送Buffer,然后延时一段时间,直接查看串口缓存区对应数据即可,但是如上写法并不严谨,更严谨的做法是是否判断串口一共回复了多少个字节,然后对每个字节进行校验,如果正确才获取,这里先不考虑优化问题,先保证能用即可,其它读指令函数也是差不多的逻辑,由于篇幅有限,这里就不贴出来了。 3.3、初始化函数及与服务器通信过程实现 初始化部分分为配置参数和获取参数两部分,这里我配置的服务器IP和端口号是移动OneNet的,分别实现如下 /*配置RJ45模块参数*/ uint8_t Config_RJ45_Module_Para(void) {     uint8_t ret = 1;     Enable_RJ45_Config_Mode();    Deice_Para_Config_Handledef.bNetMode = 0x01 ;     ret = RJ45_Set_Mode(Deice_Para_Config_Handledef.bNetMode, 300); if(ret != 0) return 1;    Deice_Para_Config_Handledef.gDesIP[0] = 0xB7 ; //180    Deice_Para_Config_Handledef.gDesIP[1] = 0xE6 ; //230    Deice_Para_Config_Handledef.gDesIP[2] = 0x28 ; //40    Deice_Para_Config_Handledef.gDesIP[3] = 0x21 ; //33     ret = Set_Module_Gobal_Ipaddr(Deice_Para_Config_Handledef.gDesIP[0],  \     Deice_Para_Config_Handledef.gDesIP[1], Deice_Para_Config_Handledef.gDesIP[2], \     Deice_Para_Config_Handledef.gDesIP[3], 300); if(ret != 0) return 2;    Deice_Para_Config_Handledef.gNetPort = 80 ;  //80     ret = Set_Module_Gobal_Port_Number(Deice_Para_Config_Handledef.gNetPort, 300); if(ret != 0) return 3;     ret = Update_Config_Para_To_EEPROM(300); if(ret != 0) return 4;     ret = Runing_Config_Para_To_EEPROM(300); if(ret != 0) return 5; printf("配置RJ45模块参数如下:\n"); printf("1.配置RJ45模块工作模式:%d\n",Deice_Para_Config_Handledef.bNetMode); printf("2.配置RJ45模块目的IP地址:%d.%d.%d.%d\n",Deice_Para_Config_Handledef.gDesIP[0], \    Deice_Para_Config_Handledef.gDesIP[1],Deice_Para_Config_Handledef.gDesIP[2],    Deice_Para_Config_Handledef.gDesIP[3]); printf("3.配置RJ45模块端口号:%d\n",Deice_Para_Config_Handledef.gNetPort); return 0 ; } /*获取RJ45模块参数*/ uint8_t Get_RJ45_Module_Config_Para(void) { printf("读取RJ45模块配置参数如下:\n");  /*读取芯片工作模式*/   Get_RJ45_Chip_Work_Mode(300); printf("1.读取芯片工作模式:%d\n",Deice_Para_Handledef.bNetMode);   /*读取芯片目的IP地址*/   Get_RJ45_Chip_Gobal_Ipaddr(300); printf("2.读取目的IP地址:%d.%d.%d.%d\n", Deice_Para_Handledef.gDesIP[0], Deice_Para_Handledef.gDesIP[1], \                Deice_Para_Handledef.gDesIP[2], Deice_Para_Handledef.gDesIP[3]);   /*读取芯片目的端口号*/   Get_RJ45_Chip_Gobal_Port_Number(300); printf("3.读取芯片目的端口号:%d\n", Deice_Para_Handledef.gNetPort);   /*读取芯片Mac地址*/   Get_RJ45_Chip_Mac_Addr(300); printf("4.读取芯片Mac地址:%d.%d.%d.%d\n", Deice_Para_Handledef.bMacAddr[0], Deice_Para_Handledef.bMacAddr[1], \                Deice_Para_Handledef.bMacAddr[2], Deice_Para_Handledef.bMacAddr[3]); return 0 ; } 在配置完毕以后获取模块配置参数,如果获取到的模块配置参数正确,接下来在网口连接正确的情况下即可以进入数据透传模式,就是直接和服务器打交道了,实现如下: /*进入数据透传模式*/ uint8_t Enter_Data_Penetrate_Mode(void) {  /*失能配置模式*/  Disable_RJ45_Config_Mode();  /*使能DMA,清除数据包*/  Enable_And_Clear_Data_Packet();  /*开启空闲中断,此时接收的是TCP/IP协议收发的数据*/   __HAL_UART_ENABLE_IT(UART_PORT, UART_IT_IDLE);  Deice_Para_Config_Handledef.dataMode = 1 ; return 0 ; } 首先需要将配置引脚拉高,然后使能DMA,开启空闲中断,然后在中断服务函数处编写空闲中断处理逻辑: /**   * @brief This function handles USART3 global interrupt.   */ void USART3_IRQHandler(void) {     /* USER CODE BEGIN USART3_IRQn 0 */ if(RESET != __HAL_UART_GET_FLAG(&huart3, UART_FLAG_IDLE))     {         __HAL_UART_CLEAR_IDLEFLAG(&huart3);         HAL_UART_DMAStop(&huart3);         //如果支持RTOS,则数据接收完毕时发送信号量,否则发一个全局变量标志位 #ifdef CMSIS_RTOS_SUPPORT osSemaphoreRelease(reciver_rj45_sem); #else RJ45r_Handler.BufferReady = 1 ; #endif }     /* USER CODE END USART3_IRQn 0 */     HAL_UART_IRQHandler(&huart3);     /* USER CODE BEGIN USART3_IRQn 1 */     /* USER CODE END USART3_IRQn 1 */ } 当串口触发了空闲中断,则表示一包数据已经接收完了,这时候就可以将整包数据获取出来,处理获取数据的逻辑在main函数的while循环中实现: /**   * @brief  The application entry point.   * @retval int   */ int main(void) {     /* USER CODE BEGIN 1 */     /* USER CODE END 1 */     /* MCU Configuration--------------------------------------------------------*/     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */     HAL_Init();     /* USER CODE BEGIN Init */     /* USER CODE END Init */     /* Configure the system clock */     SystemClock_Config();     /* USER CODE BEGIN SysInit */     /* USER CODE END SysInit */     /* Initialize all configured peripherals */     MX_GPIO_Init();     MX_DMA_Init();     MX_USART1_UART_Init();     MX_USART3_UART_Init();     /* USER CODE BEGIN 2 */ printf("RJ45 dEMO\n");     /*配置模块参数*/     Config_RJ45_Module_Para(); printf("\r\n"); Read_Config_Para:     /*获取RJ45模块参数*/     Get_RJ45_Module_Config_Para();     /*进入数据透传模式*/     Enter_Data_Penetrate_Mode();     /* USER CODE END 2 */     /* Infinite loop */     /* USER CODE BEGIN WHILE */ while (1)     {         /* USER CODE END WHILE */         /* USER CODE BEGIN 3 */         /*1.检查与远端服务器的连接状况,返回1表示已连接服务器*/         Deice_Para_Handledef.tcp_status = Check_TCP_Status(); if(1 == Deice_Para_Handledef.tcp_status)         { if(Count_LED_Timer > 500)             {                 Count_LED_Timer = 0 ;                 HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);             }         } else { if(Count_LED_Timer > 500)             {                 Count_LED_Timer = 0 ;                 HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);             }         }         /*2.每1s透传一次数据给服务器*/ if(Count_Timer >= 10000)         {             Count_Timer = 0 ; printf("透传数据:\n%s\n", post_http_data); if(1 == Deice_Para_Handledef.tcp_status)             {                 RJ45_Send_NetWork_Penetrate_Data(post_http_data); printf("服务器已连接,发送成功!\n");             } else { printf("服务器未连接,发送失败!\n");             }         }         /*3.接收服务器下发的数据*/ if(RJ45r_Handler.BufferReady)         {             RJ45r_Handler.BufferReady = 0 ; printf("接收网络数据:\n%s\n", RJ45r_Handler.RJ45RxBuffer);             /*退出透传模式*/             //Quit_Data_Penetrate_Mode();             //goto Read_Config_Para ;             memset(RJ45r_Handler.RJ45RxBuffer, 0, RJ45_RXBUFFER_SIZE);             HAL_UART_Receive_DMA(UART_PORT, RJ45r_Handler.RJ45RxBuffer, RJ45_RXBUFFER_SIZE);         }     }     /* USER CODE END 3 */ } 通过自己的服务器发送测试协议进行测试,由于这是我私人创建的设备,所以就不将设备ID和api-key公布出来了,结果如下: 之前写过类似的文章,参考如下即可: ESP8266实战贴:使用HTTP POST请求上传数据到公有云OneNet 上传数据流展示: 4、项目开源地址 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    嵌入式云IOT技术圈 小熊派 STM32CubeMX OneNet

  • 用于先进视频处理解决方案的现场可编程逻辑门阵列(FPGA)产品与技术

    用于先进视频处理解决方案的现场可编程逻辑门阵列(FPGA)产品与技术

    部署先进的网络基础设施不仅可以解决数据传输量激增的问题,而且还能在诸如边缘、核心和云端等网络的不同部分进行数据处理。不足为奇的是大部分数据要么是视频,要么是图像,并且这些数据正以指数级速度增长,并将在未来几年内保持持续增长。因此,需要更多的计算资源来应对数据的大量增长(如图1所示)。 由于应用的类型多种多样,因此在数据中心中存在着各种各样的视频或图像处理工作负载。基于专用集成电路(ASIC)的解决方案通常可提供更高的性能,但是无法进行升级以支持未来的算法;基于中央处理器(CPU)的解决方案要比其更加灵活,但其时钟主频已经固定,而且已不再可能大幅提升处理器性能;图形处理器(GPU)是提供视频/图像处理解决方案的另一种候选方案,但其功耗明显高于基于现场可编程逻辑门阵列(FPGA)的解决方案。FPGA在视频处理和压缩领域内,是一种具有吸引力的选择,因为它们提供了实现创新视频处理算法所需的、平衡的资源。此外,FPGA提供了一种灵活的解决方案,可以缩短产品上市时间,并能在解决方案的整个生命周期内实现持续升级和部署新的功能。 表1:互联网用户和数据流的增长 来源:思科(Cisco)公司 图1:全球互联网视频数据流(来源:思科) 33% CAGR 2017-2022:2017-2022年间的复合年增长率33% Exabytes per Month:每月的Exabytes数量 基于FPGA的视频解决方案的示例 本白皮书将介绍三种典型的视频应用,以展示基于FPGA的解决方案在广播行业中的优势。这些优势包括缩短处理时间、降低功耗,以及为服务提供商和终端用户节省成本。 本白皮书将介绍基于FPGA的解决方案在以下三种应用中的优势: · 视频流 · 使用视频编辑软件来创作视频内容 · 人工智能(AI)和深度学习–图像识别是该应用的主要部分,其需要高性能的计算资源 视频流传送 为了使媒体流变得快速和高效,对视频进行转码的需求已急剧增加。目前大多数产品都采用了一种基于软件的方法,但该方法无法满足高带宽、广播级视频流的处理要求。视频流和/或云服务提供商面临着由基于软件的解决方案所带来的低吞吐量、高功耗、长延迟和占用空间大等挑战。根据思科的一份题为《思科可视网络指数:预测与趋势——2017-2022年白皮书》的报告,视频流数据流量正在增加,并且到2022年时将占据整个互联网数据流的82%。在包括视频点播、流媒体直播和视频监控等所有应用中,视频数据流量将逐年稳步增长。 诸如Netflix和YouTube等视频流应用的兴起推动了对视频转码的需求。传统广播和视频流媒体之间最显著的区别在于内容量和频道数。为了支持从电脑到智能手机等各种接收设备,内容必须被转码成不同的分辨率和压缩格式。因此,视频流将消耗大量的计算资源。 图2:视频转码工作流程 Acquisition:获取 content creator dramatically growing:内容创作者的数量在急剧增加 Editing:编辑 Uploading:上传 Streaming Company:流媒体公司 Cloud Service Provider:云服务提供商 Transcoding:转码 different compression:不同的压缩率 different resolution:不同的分辨率 different bitrates:不同的比特率 Distribution:发布 iPhone:iPhone手机 Andriod:安卓手机 PC Browser:电脑浏览器 流媒体和云服务提供商需要一种解决方案来缓解对计算需求的压力。Achronix Speedster®7t系列FPGA器件中搭载了IBEX这种最先进的视频处理半导体知识产权(IP)能够解决这一重大问题。这种基于FPGA的解决方案可以提供高吞吐量的、低功耗的和占用空间小的系统,而且无需牺牲灵活性。尽管基于ASIC的解决方案功能强大,但只能支持在设计时定义的功能集,而不能支持现场更新。 视频内容创作 在过去,高清分辨率(HD)格式在视频内容创作中占据主导地位。最近,标准分辨率已被提升至4K,甚至到8K,这使得视频编码或解码面临挑战。用于这些较高分辨率的压缩格式主要有Apple ProRes、Avid DNx和SONY XAVC。由于这些压缩格式是专有的,因此ASIC或GPU并不能原生支持这些格式,而且CPU提供的性能也不佳。因此,在较高分辨率下创作视频内容时,FPGA是最佳的解决方案。 图3:视频编辑工作流程 Import:导入 Editing Software:编辑软件 Import(Decode):导入(解码) Export(Encode):导出(编码) Remote Edit:远程编辑 Export:导出 在新的趋势下,远程后期制作的概念正变得越来越普遍。然而,现有的电脑并没有足够的能力来实时处理高分辨率的内容(例如8K)。因此,编辑人员开始借助云基础设施来获得更好的计算性能。此外,由于需要保持社交距离,新冠肺炎疫情也加速了这一趋势。基于云和FPGA的解决方案为编辑人员提供了巨大的好处。Achronix Speedster7t系列FPGA器件进行架构创新,例如二维片上网络(NoC),使其特别适合于加速编码和解码算法。 人工智能与深度学习 人工智能、机器学习和深度学习是众所周知的领域,它们在过去几年中得到了迅速的发展。除了这些领域,图像识别也逐渐成为一个全新的重要领域,这得益于人工智能/机器学习(AI / ML)的创新。例如,先进驾驶员辅助系统(ADAS)使用深度学习算法来处理捕获的图像。安装在车上的行车记录仪使用H.264压缩技术记录视频,然后将视频流转码为诸如JPEG或PNG等合适的图像格式,以用于深度学习图像识别。根据应用场景,可以同时完成丢帧、更改分辨率或其他图像处理任务。 在零售业的安全摄像头或物流业的包裹分拣中也有类似的应用案例,其数据流与上述示例相同 —— 这些应用中的摄像头使用H.264或H.265等压缩比相对较高的压缩格式记录视频,然后将编码的视频流传输到云端或数据中心。在云端,视频流由原始格式转码为适合深度学习的格式,将视频文件转换为图像资料库。 图4:典型的深度学习图像数据流 Transcoding:转码 Different compression:不同的压缩率 Video=Image:视频=图像 AI:人工智能 Deep Learning:深度学习 Image Recognition:图像识别 从历史来看,FPGA一直擅长将电影转码为图像。此外,使用FPGA中的深度学习算法对图像预先进行预处理,不仅可以提高吞吐量,而且还能减少系统级的数据事务量。Achronix Speedster7t的创新架构及其带有的专用机器学习处理器(MLP),使之成为实现定制的和既定的深度学习算法的理想选择。 FPGA代表性视频用例的性能 我们分别使用FPGA和CPU来实现上述三个典型应用案例,并对一些关键指标进行对比,如下表所示。 表2:FPGA与CPU的性能比较 表注 ↑ FPGA提供更佳的性能。 ↔ FPGA和CPU提供同等的性能,但FPGA是卸载CPU负担的首选解决方案。 ↓ FPGA和CPU提供同等的性能,但CPU是首选解决方案。 视频流传输 在视频流传输应用中,常用的压缩格式是H.264或H.265,因为终端(接收端)设备原生支持这些格式。诸如位深或色度和分辨率等参数通常为8位、4:2:0和1920×1080或1280×720。在解码器方面,基于FPGA的实现比基于CPU的系统提供更高的吞吐量。在数据层面,FPGA效率更高,因为如果将CPU用于纯数据处理之外的其他任何与数据相关的任务时,它通常都没有得到充分的利用。然而在编码器方面,硬化的CPU编码器内核是专门针对这些典型参数而设计的,并提供了足够的性能。 为了获得两全其美的效果,将FPGA和CPU解决方案相结合,并由FPGA来处理繁重的工作负载是理想的解决方案。FPGA上的高效功能可以被移植到可重新配置的硬件上去运行。例如,运动估计算法是一种适合FPGA的工作负载。另一方面,CPU更适合处理比特率控制算法。 一些服务提供商要求在软件解决方案中实现与x264相同的视频质量和流媒体格式。FPGA和CPU的组合解决方案可以有效地满足这些要求。使用这种方法,每种功能都被合理地分配,较繁重的处理负载被转移到FPGA,与纯软件解决方案相比,这种方法能提供类似或更好的视频质量和流媒体格式,而且编码时间显著减少。 下表列出了使用这种方法的x264评测结果,第一行显示了在FPGA上的运动估计函数(x264_8_me_search_erf)的结果。运动估计是CPU最繁重的工作负载之一,占据总处理时间的21.2278%。 表3:x264评测结果(通过评测软件获得) 视频内容创作 用于内容创作的视频编辑软件支持多种压缩格式,其中包括Apple ProRes、Avid DNx、Sony XAVC和Panasonic AVC-Intra,这些格式都带有基于内帧结构的专有压缩方案。此外,还有一些支持RAW模式的格式,诸如Apple ProRes RAW、RED RAW、ARRI RAW和Blackmagic RAW,这些格式都得到了摄像机制造商的支持。由于这些格式(以及新型的和不断出现的格式)具有不断变化的特性,因此基于ASIC的解决方案并不实用,而需要基于FPGA的解决方案。 在过去,主要的分辨率为HD/2K,CPU具有足够的速度来处理这些视频流。但是,随着4K或8K分辨率变得越来越普遍,仅靠CPU加软件的解决方案不能够提供实时处理。另一方面,基于FPGA的解决方案可以轻松地实时处理4K和8k分辨率视频。 内部基准测试表明,即使与中级FPGA芯片相比,基于FPGA解决方案的处理速度也比最新的CPU加软件解决方案快五倍。虽然GPU可以提供与FPGA类似的性能,但其功耗更高、解决方案占用空间更大。 图5:仅使用CPU(无FPGA卸载)的处理方案性能 FPGA解决方案的好处不仅仅在于加速,而且还能降低CPU的繁忙程度。在只有CPU的解决方案中,所有CPU周期都被4K或8K内容的编码所消耗,而使用FPGA来卸载编码任务可以释放CPU周期。因此,FPGA加速器为该应用提供了最佳的解决方案,通过减少4K和8K视频制作所需的处理时间,来提高视频编辑人员的创作效率。 图6:使用FPGA卸载的CPU利用率 人工智能与深度学习 如前所述,在处理H.264/H.265解码方面,FPGA提供了与CPU相当或更高的性能。如果解码器和内帧编码器(例如JPEG或PNG)都位于同一FPGA中,那么基于FPGA的解决方案将提供比CPU更佳的性能。此外,在深度学习应用中,在将图像数据发送到深度学习处理之前,通常会进行一些图像预处理。在同一个FPGA上可以执行所有的处理,包括解码、图像处理和编码等(如图7所示),并且与CPU相比,FPGA可以提供高吞吐量、低延迟和更少的数据事务。深度学习技术在现在和未来都将被广泛应用于各个行业或领域,而基于FPGA的解决方案将助力这一发展。 图7:使用深度学习进行视频和图像处理的典型数据流 Decoding:解码 Image Processing:图像处理 Encoding:编码 针对性能而优化的Speedster7t架构 Speedster7t FPGA是专为满足最高性能的数据加速应用而设计的,该架构非常适合解决本白皮书中提到的所有应用挑战。具体而言,Achronix开发了一种全新的创新型二维片上网络,它力助在I/O带宽、外部存储带宽和片上性能之间提供一种平衡架构,以确保总体最高的吞吐量。在传统的FPGA架构中,用户需要设计电路来连接加速器,从而导致并不理想的布局和布线。现在更新的FPGA架构使用一种网络,在逻辑阵列内的处理单元与各种片上高速接口和存储器端口之间传输数据流(如图8所示)。 图8:在传统的FPGA架构中连接加速器 Status Control:状态控制 Parameters:参数 Address decode and routing:地址解码和布线 Back pressure:背压 Request arbitration:请求仲裁 Response arbitration:响应仲裁 Response back pressure:响应背压 Response routing:响应布线 Accelerator:加速器 图9:先进的FPGA减少了所需的电路数量 硬连线架构极大地改善了处理的延迟和能效,但是缺乏应对需求变化的灵活性。Speedster7t系列FPGA器件中的第一款芯片AC7t1500提供了一系列高速接口,包括可分配的(fracturable)以太网控制器(支持高达400G的速率)、PCI Gen 5端口和多达32个SerDes通道,速率高达112 Gbps。AC7t1500器件是首款部署多通道GDDR6存储器接口的FPGA,它满足了需要高速缓存海量数据的编码器的需求。除了在可编程逻辑阵列中采用的面向位的布线结构外,这些外围设备还通过一个智能二维片上网络进行互连。因此,Speedster7t FPGA是第一款能够实现上述视频处理用例的器件,该FPGA器件利用一种平衡架构,在计算密度和数据传输能力方面带来重大改进。 Speedster7t架构通过提供总带宽超过20 Tbps的多级片上网络(NoC)层级化结构,消除了由于需要将高速I/O通道直接连接到以较低时钟速率运行的可编程逻辑所造成的瓶颈。与采用FPGA逻辑阵列实现互连方式相比,NoC不仅在速率上有了大幅的提升,而且NoC还能在不消耗任何FPGA可编程资源的情况下传输大量数据。内部NoC不仅提供了更高的带宽,而且Speedster7t FPGA中的智能连接机制也简化了将数据从NoC端口传输到逻辑阵列中的任务。 这种架构可支持进一步的设计创新,例如支持上述机器学习用例的面向矩阵的算术单元。通过使用诸如深度学习或较为简单的统计方法等技术,设备可以分析数据流的模式,以观察和增强数据包在网络中的传输,并对不断变化的情况做出快速反应。概括而言,以下三项Speedster7t的架构创新为上述用例提供了更好的FPGA设计: 高速存储接口 Speedster7t架构师对存储接口的选择反映出了以太网和NoC连接可提供的巨大带宽。一种可能的方法是在一系列产品设计中采用即将推出的HBM2接口。尽管这样的接口可以提供所需的性能等级,但HBM2是一种价格昂贵的选择,这将迫使客户去等待必要的组件和集成技术进入市场。 与此不同,Speedster7t系列则采用了GDDR6标准,该标准为当今片外存储器提供了最高的性能。Speedster7t FPGA是市场上首款支持该接口的器件,每个片上GDDR6存储控制器可维持512 Gbps的带宽。在单个AC7t1500器件中最多可带有八个GDDR6控制器,因此一个Speedster7t FPGA器件可提供高达4 Tbps的总存储带宽。 对PCIe Gen 5的支持 除了以太网和存储控制器,Speedster7t FPGA上提供的对PCIe Gen 5的支持还能够与主机处理器紧密集成,以支持高性能加速器应用。PCI Gen 5控制器使其能够读取和写入存储在FPGA存储层级结构中的数据,包括许多位于逻辑阵列内的块RAM,以及连接到FPGA存储控制器的外部GDDR6和DDR4 SRAM。在FPGA逻辑阵列中实例化的数据传输控制器(例如DMA引擎),可以类似地通过PCIe Gen 5总线访问与主机处理器共享的内存。无需消耗FPGA逻辑阵列内的任何资源即可实现这种高带宽连接,并且设计时间几乎为零。用户只需启用PCIe和GDDR6接口,即可通过NoC发送事务数据。 PCIe子系统与任何GDDR6或DDR4存储接口之间的直接连接如下图10所示。 图10:无需消耗FPGA逻辑阵列即可实现PCIe和GDDR6之间的数据传输 机器学习处理器(MLP) 对于计算密集型任务,在Speedster7t FPGA上部署的Speedster7t机器学习处理器(MLP)是灵活的且可分配的算术单元。机器学习处理器是高密度乘法器阵列,带有支持多种数字格式的浮点和整数MAC模块。机器学习处理器带有集成的存储模块,可以在不使用任何FPGA资源的情况下执行操作数和存储级联功能。机器学习处理器适用于一系列矩阵数学运算,从5G无线电控制器的波束成形计算到加速深度学习应用,如视频处理系统所需的数据流模式和数据包内容分析。 图11:机器学习处理器原理框图 结论 虽然ASIC的性能通常很高,但它只支持设计时设想的功能集,不能进行现场升级;CPU是最灵活且最易于设计的,但是其时钟频率已经难以提升,其性能大幅提升的时代已经结束;随着工作负载逐年增加,CPU已无法满足需求。FPGA在性能和灵活性之间提供了良好的平衡。由于需要大量的并行处理,因此视频编码、解码和图像处理算法都更适合于用FPGA来实现。总之,基于FPGA的解决方案可以缩短上市时间,具有高度的可定制性,并且可以有效地用于实现不断发展的算法。

    Achronix半导体 FPGA 视频处理 MLP

  • 英特尔与众不同的量子低温探测仪

    英特尔与众不同的量子低温探测仪

    图注:在英特尔美国俄勒冈州希尔斯伯勒市的Jones Farm园区,英特尔研究工程师Otto Zietz与量子低温探测仪站在一起。该仪器能将300mm硅晶圆冷却到可以进行量子计算研究的绝对零度。在全球同类产品中,英特尔的低温探测仪是唯一一款具有处理大型晶圆能力的工具。(图片来源:Walden Kirsch /英特尔公司) 在这些像校车一样大,并且造价高达数百万美元的高科技工具中,位于英特尔俄勒冈州Ronler Acres园区研究院里的工具最为独特。该工具被称为量子低温探测仪,它能将300mm的硅晶圆骤降至1.7开氏度,几乎接近绝对零度的低温。这在地球上是非常独特的。 英特尔的低温探测仪对于公司正在进行的量子计算研究至关重要。量子计算的愿景是解决目前最强大的超级计算机都无法解决的复杂问题。在本周美国物理学会会议上,来自英特尔研究院和组件研究集团的研究人员提交了10篇关于量子计算的技术论文,其中两篇首次公开了低温探测仪研究的技术成果。 英特尔携手芬兰公司Bluefors和Afore设计并制造了这款低温探测仪。它于去年抵达俄勒冈园区,经过一段时间的调试,在过去的6个月里一直稳定运行。这款低温探测仪大幅加快了英特尔工程师操作自旋量子位、量子点等新型微计算设备的速度。至少在今天,量子计算设备只能在超低温环境下工作,因此超低温的环境是必需的。 英特尔研究科学家Ravi Pillarisetty表示,这款低温探测仪已经能将英特尔的研究和测试速度从“每周几个量子点”加快到“每天数百个量子点”。这个速度要归功于它的大小。这款低温探测仪的“心脏”是它的真空罐,它的空间是现有用于研究标准低温系统的10倍左右。这意味着它有足够空间来容纳最新一代餐盘大小的、填满量子元件的晶圆,同时也可以容纳移动和探测超低温晶圆的机器零件。 在其他成果中,低温探测仪正在帮助研究人员向创建大型量子位阵列迈进。Pillarisetty表示,英特尔的愿景是最终创建将数百万个独立量子位压缩到一块芯片上的量子计算设备。 英特尔研究院量子应用与架构总监Anne Matsuura在去年12月英特尔研究院开放日上表示,英特尔正在逐步实现商用级量子计算的愿景。她认为量子计算能够改变世界上的很多领域,如帮助医疗保健行业新药的研发,电子行业新型材料和化学制品的研发等。Matsuura表示“英特尔正在开发量子计算堆栈的所有组件”,包括应用、编译器、量子位控制处理器、控制电路和量子位芯片设备。 在美国俄勒冈园区这台与众不同的机器上,英特尔在量子计算可扩展性方面的研究又向前迈进了一步。

    intel 英特尔 探测仪 量子低温探测仪

  • 迎来重大突破!国产高能离子注入机打破了国外垄断

    迎来重大突破!国产高能离子注入机打破了国外垄断

    由于众所周知的原因,近期国外尤其是美国对中国的科技“卡脖子”打击,这也掀起了我国自主研发突破国外封锁的一波热潮,近期也是捷报频频。在芯片方面,离子注入机是芯片制造中的关键装备,中国电子科技集团有限公司近日公布,该集团旗下电科装备已成功实现离子注入机全谱系产品国产化,可为全球芯片制造企业提供离子注入机一站式解决方案。 在晶圆制造中,总共有七大关键环节,分别是扩散、光刻、刻蚀、离子注入、薄膜生长、抛光、金属化。这其中金属化,也就是把集成电路里的各个元件用金属导体连接起来,用到的设备也是薄膜生长设备,所以这两个环节所用到的设备是类似的。另外,几乎每个环节都需要用到清洗机,因为生产工艺越来越复杂,几乎每一两步就要对硅片进行清洗一次。所以,晶圆制造需要七大类的生产设备,包括:扩散炉、光刻机、刻蚀机、离子注入机、薄膜沉积设备、化学机械抛光机、清洗机。其中,离子注入机是芯片制造中的关键装备。 用离子注入机向硅片注入硼离子,可以形成很多空穴,它们都是正电子。正电子带正电荷,质量与电子相等,是电子的反粒子。带有空穴的半导体,称为空穴型半导体,也叫P型半导体。它们以带正电的空穴导电为主,让三价元素(如硼)取代晶格中硅原子的位置。由于P型半导体中正电荷量与负电荷量相等,P型半导体呈电中性。另一类半导体叫N型半导体。在这类半导体中,参与导电的主要是带负电的电子,这些电子来自半导体中的磷、砷等五价元素。磷、砷都比硅元素多一个电子,所以能为硅片带来多余的电子。因此,要制造N型半导体,就得用离子注入机将磷、砷等五价元素以带电离子形态注入硅片。P型半导体与N型半导体结合,可以形成P-N结。通电后,正电荷与负电荷产生势能差,就会形成电流,像地势差会形成水流一样。 根据SEMI(美国半导体行业协会)的数据显示,离子注入设备在晶圆加工设备比重为5%左右,对应的全球市场规模25亿美元左右,不过在该领域,国外厂商占据着大部分市场,主要是由美国厂商所垄断,美国应用材料公司和美国 Axcelis 这两家公司占据全球共计70% 以上的市场份额。我国目前在离子注入机领域有所突破的是两家企业,一家是前面所提到的中国电子科技集团下面的电科装备集团,另外一家则是万业集团旗下的凯世通公司。 离子注入机行业存在较高竞争壁垒,行业集中度较高,整体而言整个市场主要由美国厂商垄断,美国应用材料公司和美国Axcelis公司合计占据全球70%以上的市场。分领域来看,半导体制造领域应用材料、Axcelis和汉辰科技AIBT地位领先,太阳能电池生产领域主要为万业企业旗下凯世通、美国Inte-vac和日本真空技术三家,其中万业企业旗下凯世通竞争地位领先,AMOLED面板制造领域被日本日新垄断。 早在2020年6月30日的时候,中国电子科技集团宣布,由该集团旗下电科装备自主研制的高能离子注入机,成功实现百万电子伏特高能离子加速,性能达到国际先进水平。 如今,中束流、大束流、高能、特种应用及第三代半导体等离子注入机全谱系产品国产化消息传来,工艺段覆盖至28nm,为我国芯片制造产业链补上重要一环,也为全球芯片制造企业在离子注入机领域提供了更多选择。 但是,我们距世界头部企业仍有一定的距离,离子注入机研发进度仍待加快。此次中国电科攻克离子注入机全谱系产品国产化,将为我国芯片制造产业链补上重要一环,为全球芯片制造企业提供离子注入机一站式解决方案。

    嵌入式硬件 卡脖子 离子注入机 芯片

  • Bridgetek推出了用于高级EVE图形控制器的新型评估硬件

    Bridgetek推出了用于高级EVE图形控制器的新型评估硬件

    2021年2月18日–为帮助基于其面向对象的图形控制器IC的人机界面(HMI)的初步开发和原型设计,Bridgetek宣布推出ME817EV评估板。 借助公司的BT817嵌入式视频引擎(EVE)设备,工程师可以试用最新一代的EVE技术,并全面了解其功能的广度。 由于BT817支持更高的分辨率和大尺寸显示屏,因此可以创建更具吸引力和功能丰富的HMI,具有更高的视觉清晰度和增强的视频播放功能。 ME817EV单元的尺寸为165mm x 100mm,具有进行与HMI图形,音频和触摸元素有关的开发工作所需的所有必要属性。 除了音频放大和多级音频过滤功能外,还有一个LED驱动器,可用于调节显示器的背光。 还包括一个支持5个同时触摸点的触摸控制器,以及16MB的板载闪存资源,用于存储Unicode字体,图像库等。 ME817EV可以与大规模,高分辨率显示模块接口。 对于1280x800像素的显示器,它可以通过40引脚LVDS接口连接,而对于1024x600像素的显示器,可以使用50引脚RGB接口。 电容式触摸屏可以使用10针或6针FPC连接器进行连接。 该板可使用SPI主机连接器通过5V电源或USB C型端口供电。 正如Bridgetek创始人兼首席执行官Fred Dart解释的那样; “我们已经看到我们的第四代EVE芯片在众多行业中都有着巨大的商业吸引力。 显然,确实需要一种更简化的方法来构建更大格式的HMI。 通过提供该评估平台,我们使工程师可以更快,更轻松地完成整个项目开发过程,并获得更好的最终结果。”

    Bridgetek 图形控制器 IC Bridgetek

  • PCB板上走100A电流的方法

    来源 | EDA365电子论坛 通常的PCB设计电流都不会超过10A,尤其是在家用、消费级电子中,通常PCB上持续的工作电流不会超过2A。 但有的产品设计动力走线,持续电流能能达到80A左右,考虑瞬时电流以及为整个系统留下余量,动力走线的持续电流应该能够承受100A以上。 那么问题就来了,怎么样的PCB才能承受住100A的电流? 嵌入式专栏 1 方法一:PCB上走线 要弄清楚PCB的过流能力,我们首先从PCB结构下手。以双层PCB为例,这种电路板通常是三层式结构:铜皮、板材、铜皮。铜皮也就是PCB中电流、信号要通过的路径。 根据中学物理知识可以知道一个物体的电阻与材料、横截面积、长度有关。由于我们的电流是在铜皮上走,所以电阻率是固定的。横截面积可以看作铜皮的厚度,也就是PCB加工选项中的铜厚。 通常铜厚以OZ来表示,1 OZ的铜厚换算过来就是35 um,2 OZ是70 um,依此类推。那么可以很轻易地得出结论:在PCB上要通过大电流时,布线就要又短又粗,同时PCB的铜厚越厚越好。 实际在工程上,对于布线的长度没有一个严格的标准。工程上通常会用:铜厚/温升/线径,这三个指标来衡量PCB板的载流能力。 以下两个表可以参考: 从表中可以大约知道1 OZ铜厚的电路板,在10°温升时,100 mil (2.5 mm) 宽度的导线能够通过4.5 A的电流。 并且随着宽度的增加,PCB载流能力并不是严格按照线性增加,而是增加幅度慢慢减小,这也是和实际工程里的情况一致。如果提高温升,导线的载流能力也能够得到提高。 通过这两个表,能得到的PCB布线经验是:增加铜厚、加宽线径、提高PCB散热能够增强PCB的载流能力。 那么如果我要走100 A的电流,我可以选择4 OZ的铜厚,走线宽度设置为15 mm,双面走线,并且增加散热装置,降低PCB的温升,提高稳定性。 嵌入式专栏 2 方法二:接线柱 除了在PCB上走线之外,还可以采用接线柱的方式走线。 在PCB上或产品外壳上固定几个能够耐受100 A的接线柱如:表贴螺母、PCB接线端子、铜柱等。 然后采用铜鼻子等接线端子将能承受100 A的导线接到接线柱上。这样大电流就可以通过导线来走。 嵌入式专栏 3 方法三:定做铜排 甚至,还可以定做铜排。使用铜排来走大电流是工业上常见的做法,例如变压器,服务器机柜等应用都是用铜排来走大电流。 附铜排载流能力表: 嵌入式专栏 4 方法四:特殊工艺 另外还有一些比较特殊的PCB工艺,国内不一定能找得到加工的厂家。 英飞凌就有一种PCB,采用3层铜层设计,顶层和底层是信号布线层,中间层是厚度为1.5 mm的铜层,专门用于布置电源,这种PCB可以轻易做到小体积过流100 A以上。

    strongerHuang PCB 走线

  • Linux设置动态库路径和环境变量

    pi@NanoPi-NEO-Plus2:~$ ldd untitled         linux-vdso.so.1 =>  (0x0000ffffba839000)         libQt5Widgets.so.5 => not found         libQt5Gui.so.5 => not found         libQt5Core.so.5 => not found         libpthread.so.0 => /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000ffffba7e2000)         libstdc++.so.6 => /usr/lib/aarch64-linux-gnu/libstdc++.so.6 (0x0000ffffba653000)         libm.so.6 => /lib/aarch64-linux-gnu/libm.so.6 (0x0000ffffba5a6000)         libgcc_s.so.1 => /lib/aarch64-linux-gnu/libgcc_s.so.1 (0x0000ffffba585000)         libc.so.6 => /lib/aarch64-linux-gnu/libc.so.6 (0x0000ffffba43e000)         /lib/ld-linux-aarch64.so.1 (0x0000ffffba80e000) 最笨的方法就是将编译出来对应的so 拷贝到/usr/lib或者/lib下,如果对应的so很多,那么就凉凉了。 设置方法: 1)在/etc/ld.so.conf.d路径下,创建动态库配置文件*.conf,例如: sudo vim /etc/ld.so.conf.d/Qt5.conf 在文件中添加: /usr/local/aarch64_qt5.12.0/lib 2)加载动态库配置 执行命令:sudo ldconfig

    嵌入式大杂烩 Linux 环境变量 动态库路径

  • Linux杀死了商业版Unix?

    商用 Unix 的销售量已经断崖式下跌。这种急剧下降的背后一定有什么原因。Linux 是否已经杀死了它的祖先,成为了一个完全可行的替代品,就像操作系统版的《天外魔花》(Invasion of the Body Snatchers)?Unix 起源Unix 首次发布是在 52 年前的 1969 年,诞生于 AT&T 旗下的研发公司贝尔实验室。其实,当时它还叫 Unics,代表 UNIplexed Information and Computing Service。显然,没有人记得「cs」是什么时候变成「x」的。它是在 DEC PDP/7 计算机上用 DEC 汇编语言编写的。后来,由于贝尔公司内部需要制作排版的专利申请,Unix 开发团队发现这种需求是一个契机,利用这个契机他们可以使用到更新、更强大的 DEC PDP/11/20 计算机,所以他们很快就用 Unix 制作了一个排版程序来生成专利申请书。 此后,Unix 的使用在贝尔公司稳步增长。1973年,Unix 的第 4 版发布了,用 C 语言重新编写而成。附带手册的介绍中有这样一段话。“The number of UNIX installations is now above 20, and many more are expected.” (K. Thompson and D. M. Richie, The UNIX Programmer’s Manual, 4th ed. November 1973.)"UNIX 的安装数量现在已经超过了 20 个,而且预计还会有更多的安装" (K. Thompson 和 D. M. Richie,UNIX 开发者指南,第4版,1973年11月)。 1973年,Ken Thompson 和 Dennis Ritchie 这两位 Unix 的核心架构师在一次关于 Unix 的会议上发表了一篇论文。他们立即收到了索取操作系统副本的请求。 早在 1956 年 AT&T 就与美国政府签订的同意令,AT&T 不得不退出“除提供普通运营商通信服务以外的任何业务"。但是他们可以授权贝尔实验室的产品,不过他们不能全心全意地将它们产品化。所以 Unix 操作系统是以源代码的形式发行的,有许可证,成本包括运输和包装以及“合理的版税“。 因为 AT&T 不能把 Unix 当做一个产品来对待,因此没有给它加上通常的包装,而且 Unix 也没有得到任何营销。它没有任何支持,也没有错误修复。尽管如此,Unix 还是传播到了大学、军事应用,并最终进入了商业世界。 由于 Unix 是用 C 编程语言重写的,所以将它移植到新的计算机架构上相对容易,很快 Unix 就在各种硬件上运行。它已经突破了 DEC 产品范围的限制,现在几乎可以在任何地方运行。商业 Unix 的崛起1982年,在签署另一项同意令之后,AT&T 被迫放弃对贝尔公司的控制权,贝尔公司被拆成了较小的区域性公司。这次动荡也使 AT&T 摆脱了以前的一些束缚。他们现在可以正式将 Unix 产品化。1983 年,AT&T 将授权许可证费用提高了,后续的支持和维护也终于跟上了。 正是这种商业化的趋势促使 Richard Stallman 创建了 GNU 项目,旨在编写一个完全摆脱 AT&T 源代码的 Unix 版本。而如今距离 GNU 项目的诞生,也已经过去了 38 年了。 当然,那些在之前的软件许可证下已经拥有 Unix 源代码的人,能够坚持使用那个版本。因此在没有 AT&T 支持的情况下,这些用户只能自行或者是在 Unix 用户社区下以技术自助小组的形式对 Unix 进行了修改、扩展和修补。 IBM、HP、Sun、Silicon Graphics 以及更多的硬件供应商都有自己的 Unix 专有商业版本或类 Unix 的操作系统。 Unix 逐渐成为医疗保健和银行等市场中关键任务工作负载的首选操作系统。航空航天、汽车和造船业制造商,以及世界各地的大学也广泛采用了 Unix。 当 Unix 被移植到个人电脑上时,特别是当更强大的英特尔 80386 处理器在 1985 年发布时,Unix的安装量急剧上升。Unix现在可以在大型机、微型计算机和个人计算机上使用。Unix 战争80 年代末和 90 年代初,各种 Unix 版本之间为争夺主导地位和标准化进行了长期而混乱的斗争。很明显,所有的利益相关者都想成为被公认为是黄金标准的那一个。最终,标准本身被引入,以尝试解决兼容性问题。 这导致了单一 UNIX 规范(也包括 POSIX 标准)的产生。大写字母"UNIX"现在是 Open Group 的商标,它被保留给符合 Single UNIX 规范的操作系统,"Unix"指的是一个操作系统家族,其中一些可以自称 UNIX。 这是对这一时期的一个非常精炼的总结,对于当时可能会购买 Unix 的人来说,这个时期的困惑可能比我们回过头来看更多。不用说,如果客户不知道该买什么,他们就会暂缓购买,观察事态的发展,Unix 销售量也大大放缓。 这对商业 Unix 来说是一个创伤,但还不致命。Linux1991年,芬兰计算机科学学生 Linus Torvalds 发表了他著名的声明,他正在开发一个操作系统内核,作为一种爱好。他的动机是学习 386 CPU 的架构。2021 年,Linux 已诞生 30 周年。 Richard Stallman 的 GNU 项目已经编写了许多类 Unix 操作系统的元素,但他们的内核 GNU Hurd 还没有。Linus Torvald 的 Linux 内核填补了这个空白。 有了 Linux 内核和 GNU 操作系统的工具和实用程序,一个完全可以运行的类 Unix 的操作系统诞生了。纯粹主义者会将其称为 GNU/Linux,我们其他人则使用 "Linux"这个简写版本。只要对两个阵营的贡献表示赞赏、尊重和认可,无论哪种方式我们都很高兴。 自 1991 年以来,Linux 的功能、完整性和稳定性都在稳步提升。现在,它在不同的用例和产品中被发现,数量惊人。 最古老的发行版是 Slackware,它发布于 1993 年。它是基于前一年发布的名为 Softlanding Linux 系统的早期发行版。Slackware 试图成为众多 Linux 发行版中最像 Unix 的一个。 Linux 的崛起无成本的类 Unix 的操作系统的吸引力,再加上对源代码的访问,是一个令人信服的信息。而如今,Linux 已无处不在。它驱动着网页。W3Techs 报告称,在 Alexa 排名前 1000 万的域名中,有 70% 使用了 Linux。它驱动着公有云。在 Amazon EC2 上,Linux 占服务器的 92%,拥有超过 35 万个独立实例。它驱动着世界上最快的计算机。世界上最快的 500 台超级计算机都在运行 Linux。它迈入了太空。猎鹰9号火箭的飞行计算机运行的是 Linux。它在你的口袋里。Google 的 Android 系统的核心是 Linux 内核。目前有超过 25 亿台活跃的 Android 设备。这包括 Chromebook和其他设备。(苹果 iOS 的核心是由加州大学伯克利分校开发的Unix变种 "伯克利软件发行版"(BSD)直接衍生出来的代码)。因此,无论你对智能手机的偏好如何,它们都依赖于类 Unix 操作系统的元素。它驱动着智能家居。你家里有智能小工具吗?几乎可以肯定它就是运行的嵌入式 Linux。它驱动着你的网络。大多数管理型交换机、无线接入点和路由器都运行在嵌入式 Linux 上。它为电信通信提供动力。你的办公桌上有一部 VOIP 电话,或者通讯室里有一台电话交换机?它们可能运行的是嵌入式 Linux。它就在你的电脑里。即使你没有运行 Linux桌面,微软也会在 Windows 10 的 Windows Subsystem for Linux 中加入 Linux 内核。它就在汽车里面。特斯拉(以及其他汽车制造商)在他们的汽车中使用 Linux。除了在个人电脑上,Linux 在任何地方都占主导地位。甚至微软也在通过 Windows Subsystem for Linux 从它的桌面端向 Linux 世界示好。 但这次讨论的重点是 Unix 和 Linux,而不是Linux 和 Windows。而如今,Unix 曾经占据的领域,Linux 同样现在也在,而且 Linux 还占据了一些 Unix 从未去过的地方。Linux 以无处不在。 IBM 是商业 Unix 最后的坚持者之一,它的 AIX 产品。即便如此,IBM 也在拥抱 Linux,花费了340 亿美元收购红帽,并且与其内部产品形成正面竞争。有趣的是,IBM 速度最快的超级计算机运行的是红帽企业 Linux,而不是AIX。Linux 比 Unix 好吗?不,它们或多或少是同样优秀的,各有各的特点。只不过 Linux 在泛用性方面更加优秀,比如可以运行在从超级计算机到Raspberry Pi 的任何设备上。你可以得到源代码,有一个充满热情的用户和维护者社区,而且它是免费提供的。 如果你想要商业支持,也可以从 Red Hat、Canonical 和 Oracle 获得。而这也是 Linux 能够从一些企业中取代 Unix 的关键之处,因为很多公司不相信 "免费",他们更乐意为支持付费。Linux 的崛起并不都是以 Linux 免费为前提的。商业 Linux 帮助击败了商业 Unix。 Linux 比 Unix 更成功吗?好吧,这也取决于对给成功的定义。如果拥有比其他操作系统更多样化和更广泛的使用是一个衡量标准,那么是的。如果是运行该操作系统的设备数量最多,那么是的。 红帽公司以 340 亿美元的价格出售,可能也是Linux 在商业成功方面上的一次成功。Linux 杀死了 Unix 吗?更准确地说,是 Linux 让 Unix 停住了脚步,然后迈入了 Unix 的赛道。 Unix 仍在那里,运行着关键任务系统,这些系统功能正常,运行稳定。这种情况会一直持续下去,直到对应用程序、操作系统或硬件平台的支持停止。 但是对于新的安装来说呢?有足够多的 Linux 变体,使得选择商用 Unix 的理由非常非常困难。END来源:开源中国作者:Dave Mckay;编译:Alias_Travis免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    嵌入式ARM Linux Unix

  • Qt Designer、Qt Quick Designer、Qt Creator有什么区别?

    不管是Qt新手还是开发过qt的群体来说,对Qt Designer、Qt Quick Designer、Qt Creator这几个应用程序肯定是熟悉的,但是你要是说具体的区别,干啥用的或者是它们实际上是单独的事物还是同一事物的名称,或者还是名称随时间变化了还是不再受支持了,这个可能还不是完全清楚。 总的来说: Qt Designer是一个图形工具,可以构建QWidget GUI,Qt Quick Designer与之类似,只是用于构建QML GUI,而两者都内置在Qt Creator中。 我们通过使用它们的方法来解释这些工具之间的区别 Qt Designer Qt Designer是用于使用Qt小部件文件(.ui)设计和构建图形用户界面(GUI)的Qt工具,可以按所见即所得(WYSIWYG)的方式编写和自定义窗口或对话框,并使用不同的样式和分辨率对其进行测试。 之前做自动化测试使用pyqt开发,qdesigner就起到了关键作用,在PyQt应用程序中设计图形化内容,Qt Designer生成的.ui文件(实质上是XML格式的文件)通过pyuic5工具转换成.py文件。 Qt Designer在安装Qt时安装,一般在以下路径中:D:\Qt\Qt5.12.0\5.12.0\mingw73_64\bin\designer.exe。它也可用于编辑Qt、C++应用程序的任何(.ui)文件,但是由于它仅允许编辑图形内容(而非C++逻辑),因此它非常受限制。 但是借助OpenGL图形加速的强大功能,可以实现完全可自定义的外观,触摸反应式元素以及平滑的动画过渡。 有关如何使用Qt Designer的快速教程,请参阅Qt Designer快速入门。 Qt Quick Designer Qt Quick Designer(指Qt Creator)实际上是已经集成在Qt Creator中的。通常说Qt Quick Designer允许编辑QML文件(.qml),但是现在它已集成在Qt Creator中。 Qt Creator Qt Creator是Qt的IDE,功能最强大,它大大简化了Qt开发,可以原生创建QT应用程序(带有Qt引擎的C++)。并且允许我们创建和编辑源代码,调试应用程序等。 除此之外,可以在Qt Creator中打开.ui文件或.qml文件,然后进行编辑并创建Qt/C++应用程序。例如,打开.ui文件,它将显示嵌入在完全集成的Qt Creator IDE中的Qt Designer应用程序。当然,如果文件是.ui,则Qt Creator将显示Qt Designer工具;如果文件是.qml,则将允许编辑QML。 Qt Creator只是用来构建QT应用程序的IDE,Qt Widgets和Qt Quick都可以组成。编写Qt Widgets应用程序时,可以在Qt Designer中编辑GUI,对于Qt Quick应用程序,则可以使用Qt Quick Designer,两者都集成到Qt Creator中。 还有这个新的工具名称Qt Design Studio,Qt Design Studio是一款UI设计和开发工具,它让设计师和开发者可以迅速设计原型,并且开发复杂的可伸缩的UI。简单概括其功能就是让UI设计转换为qml,为工程师所用,并且可以与Photoshop集成。如下图所示: 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

    嵌入式ARM QT C IDE

发布文章