分类目录:摩登3平台开户

摩登3测速登录地址_e络盟社区启动圣诞季庆祝活动,分享节日礼物创意

中国上海,2020年12月21日 – 安富利旗下全球电子元器件产品与解决方案分销商e络盟启动年度工程师与创客心愿单活动,为工程师们在圣诞季奉上美好祝福。除节日礼物创意外,e络盟还将举办三场赠礼活动来营造欢乐节日气氛。社区成员将有机会赢得电路组装、测试与测量乃至Raspberry Pi终极套装等三款奖品礼包。同时,e络盟还将举办圣诞节主题设计挑战赛,邀请社区成员分享圣诞节的重要意义。 2020年圣诞礼物指南包含深受电子设计师们青睐的所有最佳产品,既有送给年轻工程师的温馨小礼,也有送给资深设计师们的精美佳品。众人期待的e络盟年度礼物指南由工程师代表们精心挑选,罗列了工程师群体喜爱的各种好物: 送给年轻工程师的温馨小礼: · Micro:bit及附件:尽管新版micro:bit较难掌握,但备受欢迎的micro:bit 初版仍可购买,能够极好地引导年轻工程师熟悉编程技术。 组装原型设计: · 超实用放大镜:无论您是要焊接温度过高的部件,还是要夹住某一器具,这款放大镜都能派上大用场。 · Raspberry Pi组件和传感器套件:无论假期期间您想立即启动何种物联网项目,都可在此套件中找到所需组件。 · 绝缘螺丝刀套件:绝缘螺丝刀不仅可以保护工程师的安全,还可以保护设备不受损害。对于高风险环境下工作的工程师来说,绝缘螺丝刀是上好的佳礼。 · Multicomp i-20 3D打印机:这款耐用的打印机非常适合想要深入研究并独特自定义开发3D 项目的创客。 · Creality CR-20 Pro:这是一款具有手动控制功能的高品质基础版3D打印机,非常适合熟悉3D 打印的创客。 · Ultimaker S5:除ABS和PLA外,这款打印机还能处理可溶性打印材料,适用于有更大开发目标的电子设计师。 除了精心推荐数十种节日好礼,e络盟还举办三场赠礼活动,参与者有机会赢取精美奖品,活动自即日起至12月30日。活动奖品包括: · 测试与测量工具包赠礼活动:参与者有机会赢得手持式数字示波器、手持式数字万用表、湿度计等产品。 · 电路组装工具赠礼活动:参与者有机会赢得防静电腕带、跳线带、150W焊台等。 · Raspberry Pi终极礼包赠礼活动:礼包包含最新硬件和多种功能模块,包括Raspberry Pi 400 入门套件、Raspberry Pi触摸屏、1230万像素Raspberry Pi高品质摄像头等。 此外,e络盟还发起了圣诞节主题设计挑战赛,邀请创客们进行创新开发以展示圣诞节对个人的重要意义。设计作品最打动人心的创客将成为获胜者,可获得价值约500美元的工具套件,其中包括手持示波器、USB电烙铁、台式电源、剥线钳,以及价值400美元的购物券;同时还将额外获得一张价值100美元的礼品券,可赠与社区同伴以支持其项目开发。 e络盟社区是全球首个专为工程师创立的专业社区,现有逾75万名工程师、创客和企业成员。欲查看工程师节日礼物推荐单,并参与赠礼活动,敬请访问2020年e络盟工程师与创客心愿单。

摩登3平台首页_熊猫股份多个项目列入江苏省科技奖拟获奖公示名单

近日,江苏省科技厅公布了省科学技术奖综合评审拟获奖项目公示名单,熊猫股份三个项目榜上有名。其中,熊猫制造的《超高时空分辨率认知型显示关键技术及应用》拟获一等奖,熊猫股份的《5G异构无线接入网融合组网关键技术与应用》拟获二等奖,熊猫装备的《平板显示智能制造系统与维护创新项目》拟获三等奖,正式获奖通知预计于明年1月公布。此次获奖是“熊猫”继2014年获得“江苏省企业科技创新奖”综合奖项后的又一重要突破,标志着公司科研水平又获得了新提升。 《超高时空分辨率认知型显示关键技术及应用》是熊猫制造与东南大学通过产学研互动合作模式共同开发完成的,在研发过程中进一步巩固了公司基础技术建设,培养了科研人才创新意识。该项目取得了超高分辨率时空混色显示技术、全域高动态范围显示关键技术等多项技术创新,为公司创造了可观的经济效益。 《5G异构无线接入网融合组网关键技术与应用》立足世界高新技术前沿,发力新基建,突破融合组网关键技术,实现了5G异构无线多接入网络深度融合、高效组网。该项目可在运营商网络、地铁、校园、工业互联网、消防等多个领域进行大规模应用,实现了经济效益与社会效益双赢。 《平板显示智能制造系统与维护创新项目》展现出公司陆峻技能大师工作室在高世代平板显示智能制造系统装备的国产化中的技术创新,攻克了多项技术难点,确保实现高世代平板显示智能制造装备达到国际先进水平。该项目广泛应用于国内大型液晶面板制造企业建设工程,累计创造经济效益超千万元。 江苏省科学技术奖是江苏省科技领域的最高奖项,此次获奖再一次肯定了“熊猫”的创新研发能力,对公司未来进一步提升市场竞争力起到重要激励作用。技术创新是企业发展的新动能,近年来,公司不断加大科研力度,促进产业转型升级,增强以科技创新为核心的企业竞争力,为公司做大做优做强实现高质量发展发挥更加重要的作用。

摩登3测速代理_英特尔宋继强:迈向可持续的千倍速计算未来

回顾2020年,我们的工作和生活模式发生了重大变化,除疫情之外,有一项技术也将在潜移默化中改变我们的生活,即5G。2020年是5G商用元年,中国的5G技术部署在这一年取得了突飞猛进的进展。5G是由技术驱动的创新,早在近10年之前,5G技术就开始研发。而之所以要大力拓展5G技术,并不是为了要迎合当时的需求,而是看到了未来对于带宽和网速的需求,是为当时的未来做出的技术布局。 5G技术的进展让我想到了近期英特尔研究院开放日的主题,即“追求计算的千倍提升”。类似于5G,要满足未来的计算需求,即超高带宽、超低时延、超大规模连接的需求,我们也需要一种“超前”思维。因此产业现在就需要开始提前布局,追求计算的千倍提升,而在目前智能化、数字化的大背景下,这种“超前”思维非常有必要。 数字化、智能化已经成为不可阻挡的趋势,受到今年新冠疫情的影响,这一趋势正在以更快的速度席卷而来。如今,已有超过100亿台设备与云中的超级计算机实现了互联,未来这一数字将增长到1000亿。拥抱数字化不是选择题,而是必选题。在全民数字化的浪潮之下,数据量正在呈爆发式增长,数据形式也更加多元化,可以毫不犹豫的说,未来的计算需要千倍速的提升。英特尔追求计算的千倍提升,就是从计算的供给侧出发,为未来的计算需求构建坚实基石。 除了“超前”思维之外,要想实现计算的千倍提升,还需要“超常”思维,即要打破常规。随着数据越来越呈现多元化,新的计算范式不再是锦上添花,而是雪中送炭。常规和传统的单一架构已经不能满足越来越复杂的计算需求,需要更快、更灵活、更低功耗的“新计算”来破题。 这种“超常”思维将在以下几个领域得到体现。首先在硬件方面,需要打破单一架构,多架构融合的XPU架构将会成为主流。XPU架构不仅能够大幅提升算力,同时还能够根据需求进行快速组合,降低成本,灵活性高。英特尔是目前全球唯一一家已经覆盖这四种主流芯片的厂商,得益于先进的封装技术,英特尔在异构计算领域正突飞猛进。 除此之外,面向未来,也需要对架构本身践行“超常”思维。举例来说,颠覆传统冯·诺伊曼架构,模仿人脑神经元结构的神经拟态计算芯片就是一个很好的例证。这种芯片的优势在于可以在提升性能的同时大幅降低能耗。英特尔及其合作伙伴发现,英特尔神经拟态计算芯片Loihi解决优化和搜索问题的能效比传统CPU高1000倍、速度快100倍,已经实现计算的千倍提升。 图注:英特尔神经拟态计算芯片Loihi 另一大领域是在软件。XPU架构的诞生,为软件提出了更高的要求,因为能够同时掌握多种架构编程语言的开发人员凤毛麟角,而软件是释放硬件性能的关键一环,能够跨架构编程的软件模型以及可以提升编程效率的工具就显得极为重要。为此,英特尔也提前布局,跨架构编程统一模型oneAPI Glod版本已在本月正式发布,将在很大程度上解决跨架构编程难题。 图注:英特尔统一的跨架构编程模型oneAPI 另外,英特尔的机器编程工具也有了很大进展,最新的系统已经可以检测代码中的bug。最让我期待的是英特尔机器编程正在向一个更宏大的目标前进,即让所有领域的非专业编程人士都能通过自然语言的方式向机器表达意图,从而完成编程,极大地扩充了软件的“用武之地”。 最后,要实现计算的千倍提升,还需要坚持可持续原则。千倍速提升不能以千倍的功耗为代价,可持续发展是实现千倍提升的必要条件。 目前,计算对于能源的需求巨大。有研究报告显示,训练一个大型AI模型,所产生的碳排放量相当于5辆美式轿车整个生命周期所消耗的碳排放量。因此面向未来计算的千倍提升,只有坚持可持续,才是真正符合人类利益的技术进步。 英特尔在技术发展一直坚持可持续原则。已经有结果显示,作为下一代AI芯片,英特尔神经拟态计算芯片Loihi在处理语音命令识别时,不仅达到了和GPU类似的精度,并且能效提高1000倍以上。除此之外,英特尔最新的集成光电技术将光子技术与硅芯片紧密集成,可以最大限度地缩小硅光子设备的体积,从而降低成本,将对数据中心进行彻底革新。诸如此类的例子在英特尔还有很多。 英特尔的宏旨是“创造改变世界的科技,造福地球上的每一个人”,通过我们的“超前”思维、“超常”思维以及可持续发展的原则,英特尔正引领产业迈向千倍速的计算未来。对这一天的到来,我充满期待。

摩登3测速代理_对标骁龙888?三星Exynos 2100即将发布,S21首发

日前,三星Exynos在其官方微博发布消息暗示,三星Exynos全新旗舰芯片将在2021年1月12日发布,搭载该芯片的 根据三星Exynos微博透露,Exynos 2100采用5nm工艺八核设计,包括一枚2.91 Ghz的Cortex X1超大核心,三枚2.81GHz主频Cortex A78大核心与四枚 2.21GHz 主频小核心。 数码博主爆料,三星Exynos2100跑分预计会达到4000分,已与骁龙888相近,若后期优化得当,三星Exynos2100的跑分能做到骁龙888一样的水平。

摩登3平台开户_突发!58家中国企业被列入“军事最终用户”清单

当地时间21日,美国商务部工业和安全局(BIS)宣布将修改出口管理条例(EAR),并且增加新的“军事最终用户”(MEU)清单,同时公布了最新被加入MEU清单的103个实体,其中包括58家中国公司和45家俄罗斯公司。 美国政府已将这些公司确定为EAR中的“军事最终用户”控制目的的“军事最终用户”,该控制适用于对中国、俄罗斯、委内瑞拉和此类物品运往禁止的“军事最终用户”。 美国商务部长威尔伯·罗斯说:“此举建立了一种新的程序,可以在MEU名单上指定军事最终用户,以协助出口商筛选其军事最终用户的客户。” “ MEU清单将通知美国出口商,再出口商和转让人,将指定的项目出口,再出口或转让(在国内)到所列实体之前,将需要先申请获得许可证。美国政府表示,在中国,俄罗斯或委内瑞拉,这些被列入MEU名单的实体构成在“军事最终用途”或“军事最终用户”中使用或转移到“军事最终用途”或“军事最终用户”的风险,这是不可接受的。 58家将被添加到MEU清单中的中国公司如下: 1、Academy of Aerospace Solid Propulsion Technology (AASPT)(航天动力技术研究院); 2、中国航空发动机集团有限公司(AECC)及下属的八个机构: AECC Aero Science & Technology Co. Ltd.(中国航发航空科技股份有限公司);  AECC Aviation Power Co. Ltd.(中国航发动力股份有限公司);  AECC Beijing Institute of Aeronautical. Materials(北京航空材料研究院); AECC China Gas Turbine Establishment(中国航发燃气轮机有限公司);  AECC Commercial Aircraft Engine Co. Ltd.(中国航发商用航空发动机有限责任公司);  AECC Harbin Dongan Engine Co., Ltd.(中国航发哈尔滨东安发动机有限公司); AECC Shenyang Liming Aero Engine Co., Ltd.(中国航发沈阳黎明航空科技有限公司);  AECC South Industry Company Limited(中国航发湖南南方宇航工业有限公司); 3、Anhui Yingliu Hangyuan Power(安徽应流航源动力科技有限公司); 4、 中国航空工业集团有限公司(Aviation Industry Corporation of China)及下属七个机构: AVIC Aircraft Co. Ltd.(中航飞机股份有限公司);  AVIC Chengdu Aircraft Industrial (GROUP) Co., Ltd.(成都飞机工业(集团)有限责任公司);  AVIC Flight Automatic Control Research Institute (FACRI)(中国航空工业集团公司西安飞行自动控制研究所);  AVIC General Aircraft Huanan Industry Co. Ltd.(中航通飞华南飞机工业有限公司);  AVIC General Aircraft Zhejiang Institute Co., Ltd.(浙江中航通飞研究院有限公司);  AVIC International Holding Corporation(中航国际控股有限公司);  AVIC Leihua Electronic Technology Research Institute (LETRI)(中国航空工业集团公司雷华电子技术研究所); 5、Baimtec Material Co., Ltd.(北京百慕航材高科技股份有限公司); 6、Beijing Ander Tech.…

摩登3登录_Fastems芬发自动化 2021新年寄语

2020年,对于Fastems中国 – 芬发自动化来说,是跌宕起伏且值得铭记的一年。全球疫情冲击下,我们既感受到了项目实施的挑战,也充满了被需要、被认可的自豪;自动化市场蓬勃浪潮中,既开拓了新行业应用领域,又夯实了本地化发展根基。 疫情加速了数字化的进程,数字化已经成为了制造业企业的必选项。这对Fastems来说是个挑战,更是好消息。一方面,此次国外供应链的危机加速了Fastems本土化战略的快速落地。在过去一年,我们在国内广纳新鲜血液,培养了本土化的技术团队,以保障最及时有效的市场响应与服务品质。新的一年,Fastems中国还会继续扩充团队规模,为更贴近用户、更顺应市场做好充足准备。另一方面,本土化硬件替代方案也已开始布局,在充分发挥Fastems作为柔性制造系统全球领先者技术优势的同时,期望能用更具竞争力的成本优势,助力更多中国制造企业步入智能化生产快车道。 此外,疫情冲击下人员缺失造成的停产或供应不及时,以及当前个性化趋势带来的“多品种、小批量”的生产挑战,都是对企业能否快速完成产线上产品切换、能否及时满足不断变化的客户需求的考验,而这也给了“柔性生产技术”以巨大机遇。2020年,Fastems中国的业绩可谓逆势而上,我们不仅连续签署了多个柔性线合作项目,还在多个行业领域取得了里程碑式跨越,例如与中航国际航空工程能力提升中心携手为航空工业西飞建立的高端机加柔性生产线项目,其所具备的深度集成化、高度定制化特性成为了Fastems深耕中国乃至全球航空市场的一次标志性应用。 与此同时,我们也深刻感受到了更多来自中国民营制造企业的前瞻思维与实干魄力,在与国内装备制造领军企业 – 华辰精密装备的合作中,其领导团队清晰且果决的智能制造战略局部,与建立全数字化智能工厂的愿景目标,都给了我们很大的震撼。在2020年底,Fastems中国也与华辰精密装备联合举办了柔性制造技术体验日活动,真实应用于华辰工厂、现场高效运作的柔性生产线展示吸引了数十家潜在用户企业的交流参与,他们对于柔性技术的高度认可也再次给我们扎根中国市场、助推中国智能制造发展以坚定信心。今后,Fastems中国还会继续举行更多类似的技术交流、体验活动,为更多中国企业的自动化升级战略带来启发。 数字化转型,已经被按下了快进键,我们需要快速迭代认知、持续学习,去从未知中寻找可把握的确定。2021年,Fastems将助力更多企业拥有数字能力,迈向智能制造!

摩登3注册登录网_线程间到底共享了哪些进程资源?

进程和线程这两个话题是程序员绕不开的,操作系统提供的这两个抽象概念实在是太重要了。 关于进程和线程有一个极其经典的问题,那就是进程和线程的区别是什么?相信很多同学对答案似懂非懂。 记住了不一定真懂 关于这个问题有的同学可能已经“背得”滚瓜烂熟了:“进程是操作系统分配资源的单位,线程是调度的基本单位,线程之间共享进程资源”。 可是你真的理解了上面最后一句话吗?到底线程之间共享了哪些进程资源,共享资源意味着什么?共享资源这种机制是如何实现的?对此如果你没有答案的话,那么这意味着你几乎很难写出能正确工作的多线程程序,同时也意味着这篇文章就是为你准备的。 逆向思考 查理芒格经常说这样一句话:“反过来想,总是反过来想”,如果你对线程之间共享了哪些进程资源这个问题想不清楚的话那么也可以反过来思考,那就是有哪些资源是线程私有的。   线程私有资源 线程运行的本质其实就是函数的执行,函数的执行总会有一个源头,这个源头就是所谓的入口函数,CPU从入口函数开始执行从而形成一个执行流,只不过我们人为的给执行流起一个名字,这个名字就叫线程。 既然线程运行的本质就是函数的执行,那么函数执行都有哪些信息呢? 在《函数运行时在内存中是什么样子》这篇文章中我们说过,函数运行时的信息保存在栈帧中,栈帧中保存了函数的返回值、调用其它函数的参数、该函数使用的局部变量以及该函数使用的寄存器信息,如图所示,假设函数A调用函数B: 此外,CPU执行指令的信息保存在一个叫做程序计数器的寄存器中,通过这个寄存器我们就知道接下来要执行哪一条指令。由于操作系统随时可以暂停线程的运行,因此我们保存以及恢复程序计数器中的值就能知道线程是从哪里暂停的以及该从哪里继续运行了。 由于线程运行的本质就是函数运行,函数运行时信息是保存在栈帧中的,因此每个线程都有自己独立的、私有的栈区。 同时函数运行时需要额外的寄存器来保存一些信息,像部分局部变量之类,这些寄存器也是线程私有的,一个线程不可能访问到另一个线程的这类寄存器信息。 从上面的讨论中我们知道,到目前为止,所属线程的栈区、程序计数器、栈指针以及函数运行使用的寄存器是线程私有的。 以上这些信息有一个统一的名字,就是线程上下文,thread context。 我们也说过操作系统调度线程需要随时中断线程的运行并且需要线程被暂停后可以继续运行,操作系统之所以能实现这一点,依靠的就是线程上下文信息。 现在你应该知道哪些是线程私有的了吧。 除此之外,剩下的都是线程间共享资源。 那么剩下的还有什么呢?还有图中的这些。 这其实就是进程地址空间的样子,也就是说线程共享进程地址空间中除线程上下文信息中的所有内容,意思就是说线程可以直接读取这些内容。 接下来我们分别来看一下这些区域。   代码区 进程地址空间中的代码区,这里保存的是什么呢?从名字中有的同学可能已经猜到了,没错,这里保存的就是我们写的代码,更准确的是编译后的可执行机器指令。 那么这些机器指令又是从哪里来的呢?答案是从可执行文件中加载到内存的,可执行程序中的代码区就是用来初始化进程地址空间中的代码区的。 线程之间共享代码区,这就意味着程序中的任何一个函数都可以放到线程中去执行,不存在某个函数只能被特定线程执行的情况。    数据区 进程地址空间中的数据区,这里存放的就是所谓的全局变量。 什么是全局变量?所谓全局变量就是那些你定义在函数之外的变量,在C语言中就像这样: char c; // 全局变量 void func() { } 其中字符c就是全局变量,存放在进程地址空间中的数据区。 在程序员运行期间,也就是run time,数据区中的全局变量有且仅有一个实例,所有的线程都可以访问到该全局变量。 值得注意的是,在C语言中还有一类特殊的“全局变量”,那就是用static关键词修饰过的变量,就像这样: void func(){ static int a = 10; } 注意到, 虽然变量a定义在函数内部,但变量a依然具有全局变量的特性 ,也就是说变量a放在了进程地址空间的数据区域, 即使函数执行完后该变量依然存在 ,而普通的局部变量随着函数调用结束和函数栈帧一起被回收掉了,但这里的变量a不会被回收,因为其被放到了数据区。 这样的变量对每个线程来说也是可见的,也就是说每个线程都可以访问到该变量。   堆区 堆区是程序员比较熟悉的,我们在C/C++中用malloc或者new出来的数据就存放在这个区域,很显然,只要知道变量的地址,也就是指针,任何一个线程都可以访问指针指向的数据,因此堆区也是线程共享的属于进程的资源。   栈区 唉,等等!刚不是说栈区是线程私有资源吗,怎么这会儿又说起栈区了? 确实,从线程这个抽象的概念上来说,栈区是线程私有的,然而从实际的实现上看,栈区属于线程私有这一规则并没有严格遵守,这句话是什么意思? 通常来说,注意这里的用词是通常,通常来说栈区是线程私有,既然有通常就有不通常的时候。 不通常是因为不像进程地址空间之间的严格隔离,线程的栈区没有严格的隔离机制来保护,因此如果一个线程能拿到来自另一个线程栈帧上的指针,那么该线程就可以改变另一个线程的栈区,也就是说这些线程可以任意修改本属于另一个线程栈区中的变量。 这从某种程度上给了程序员极大的便利,但同时,这也会导致极其难以排查到的bug。 试想一下你的程序运行的好好的,结果某个时刻突然出问题,定位到出问题代码行后根本就排查不到原因,你当然是排查不到问题原因的,因为你的程序本来就没有任何问题,是别人的问题导致你的函数栈帧数据被写坏从而产生bug,这样的问题通常很难排查到原因,需要对整体的项目代码非常熟悉,常用的一些debug工具这时可能已经没有多大作用了。 说了这么多,那么同学可能会问,一个线程是怎样修改本属于其它线程的数据呢? 接下来我们用一个代码示例讲解一下。   修改线程私有数据 不要担心,以下代码足够简单: void thread(void* var) { int* p = (int*)var; *p = 2;}int main() {    int a = 1; pthread_t tid; pthread_create(&tid, NULL, thread, (void*)&a); return 0;} 这段代码是什么意思呢? 首先我们在主线程的栈区定义了一个局部变量,也就是 int a= 1这行代码,现在我们已经知道了,局部变量a属于主线程私有数据,但是,接下来我们创建了另外一个线程。 在新创建的这个线程中,我们将变量a的地址以参数的形式传给了新创建的线程,然后我来看一下thread函数。 在新创建的线程中,我们获取到了变量a的指针,然后将其修改为了2,也就是这行代码,我们在新创建的线程中修改了本属于主线程的私有数据。 现在你应该看明白了吧,尽管栈区是线程的私有数据,但由于栈区没有添加任何保护机制,一个线程的栈区对其它线程是可以见的,也就是说我们可以修改属于任何一个线程的栈区。 就像我们上文说得到的,这给程序员带来了极大便利的同时也带来了无尽的麻烦,试想上面这段代码,如果确实是项目需要那么这样写代码无可厚非,但如果上述新创建线程是因bug修改了属于其它线程的私有数据的话,那么产生问题就很难定位了,因为bug可能距离问题暴露的这行代码已经很远了,这样的问题通常难以排查。   动态链接库 进程地址空间中除了以上讨论的这些实际上还有其它内容,还有什么呢? 这就要从可执行程序说起了。 什么是可执行程序呢?在Windows中就是我们熟悉的exe文件,在Linux世界中就是ELF文件,这些可以被操作系统直接运行的程序就是我们所说的可执行程序。 那么可执行程序是怎么来的呢? 有的同学可能会说,废话,不就是编译器生成的吗? 实际上这个答案只答对了一半。 假设我们的项目比较简单只有几个源码文件,编译器是怎么把这几个源代码文件转换为最终的一个可执行程序呢? 原来,编译器在将可执行程序翻译成机器指令后,接下来还有一个重要的步骤,这就是链接,链接完成后生成的才是可执行程序。 完成链接这一过程的就是链接器。 其中链接器可以有两种链接方式,这就是静态链接和动态链接。 静态链接的意思是说把所有的机器指令一股脑全部打包到可执行程序中,动态链接的意思是我们不把动态链接的部分打包到可执行程序,而是在可执行程序运行起来后去内存中找动态链接的那部分代码,这就是所谓的静态链接和动态链接。 动态链接一个显而易见的好处就是可执行程序的大小会很小,就像我们在Windows下看一个exe文件可能很小,那么该exe很可能是动态链接的方式生成的。 而动态链接的部分生成的库就是我们熟悉的动态链接库,在Windows下是以DLL结尾的文件,在Linux下是以so结尾的文件。…

摩登3官网注册_你知道吗?MCU与MPU之间的界限正在消失

曾经微控制器(MCU)与微处理器(MPU)是截然不同的两种器件,微控制器完成“控制”相关的任务,根据外界信号刺激产生反应,微处理器主要执行处理功能,对数据处理和计算能力的要求较高。 但如今由于内存架构的变化,两者之间的界限正在变得模糊。像大家熟悉的ST、NXP都推出了MPU,通过对比大家也能发现MCU和MPU之间有很多共性。 事实上,可以通过多种方式区分微处理器和微控制器,只是业界尚未对他们的区分标准达成共识。不过目前两者之间的准确区分都已经不再重要了。 近年来,MCU和MPU之间的区别变得越来越模糊。最初,MCU在一个芯片上集成了CPU、内存和外围设备,如今大多数MCU依然如此,但因为MCU具有足够强大的功能来支持更复杂的应用程序,附加外部存储器的MCU也变得常见。 计算芯片的两个市场 曾经有一段时间,计算芯片分为两个截然不同的市场,大部分芯片设备主要针对主流计算,性能是最主要的考虑因素,这些单片微型计算机被称之为“微处理器”,为个人计算机和更大的系统提供动力。 如今我们可以在各种类型的笔记本电脑、台式机和服务器中看到它们,值得注意的是,它们是通用引擎,旨在运行事先未知的任何数量的程序,主内存是DRAM,非易失性存储是硬盘驱动器或固态硬盘。 在不那么主流的嵌入式计算世界里,需要适度计算能力和专门用途,设计好的程序可能在固件中运行,以便让整个系统(包括程序和所有系统)在出货之前得以验证,内存需求将受到更多限制,可以将用于存储代码的SRAM和非易失性内存与CPU集成到同一块芯片上,关键一点,实时响应通常很重要。 嵌入式计算机也倾向于在有特殊I/O需求的环境中使用,一些可能是在驱动电动机,另一些可能是在处理声音或读取传感器。将专用外围设备接口硬件集成到同CPU和内存相同的芯片上十分有效,这会产生具有不同特性的各种芯片。 总的来说,CPU与SRAM、非易失性存储器和专用外设集成在一起的被称之为“微控制器”。 微处理器发展至今已经多达64位,而微控制器依然是8位居多,但在这中间发生了一些变化,使得两者之间的区别更加模糊。 集成式闪存是MCU的重要特征,不过这类闪存尚未在拥有最先进节点的微控制器上使用,因此许多以微控制器形式销售的设备都使用外部闪存而不是嵌入式闪存,此外还使用外部DRAM。 实际上,一个称之为“shadowing”的过程可以从外部闪存中获取代码,并将其复制到DRAM中,然后从中执行代码,而且为了提高性能,缓存也可以包括在内。这使得CPU/内存子系统与MPU几乎没有区别。 那么现在的MCU就是MPU吗?不再有区别了吗? 区分MCU与MPU的因素 如今的MCU和MPU十分相似,但依然在很多方面有一些细微的区别,这包括CPU功能、位数、操作系统、时序要求、核心数量等方面。 在CPU功能方面,如果CPU具有复杂的流水线,具有预测执行和其他超标量功能,则可以将其视为MPU,但是转变的确切位置并没有明确界定。 在位数上,8位设备更有可能被视为MCU,64位设备很可能被视为MPU。不过最早的却是MPU是4位,这更像是历史问题,而不是决定性的特征。 也可以根据计算机可运行的操作系统进行分类,如果它运行Linux,则可以将其称为MPU。如果它仅允许较小的实时操作系统,甚至只运行裸机,则可以将其称为MCU,这为能够运行的Linux的设备留出了许多中间地带。在时序方面,MCU通常用于需要硬或软实时响应的应用程序,MPU通常不能用于这一目的。 一般也将多核处理器视为MPU,尤其是在内核相同且管理对称的情况下。不过专用设备可能具有多个处理器,有些专用于诸如数字信号之类特定任务的处理器也会被认为是MCU,因此通过核心数目判断是MPU还是MCU并不是一个准确的依据。 从使用目的来看,可以认为通用设备是MPU,单用途设备是MCU,但这实际上只关乎设备的使用方式,如果在不明确使用目的的情况下使用任何设备,那时候如何称呼这一设备呢? 通常全功能MPU不会具有专用外围设备,这在很大程度上是因为它们是通用的,而不是面向特定应用,因此你可能会认为只要有这样的外围设备,就是MCU,但是事实并非如此,缺少外围设备也并不意味着就是MPU。 从上面的分析来看,每个特征因素都会存在缺陷,结果无法令人满意,那么行业专家又是怎么认为的呢? MCU和MPU已成“过时”的术语 Cadence IP集团产品行销总监Marc Greenberg对此表示:“我不知道MCU与MPU之间的区别是否存在某些官方的定义,经过简单的检索似乎表明,裸片上存在NVM的为MCU,但各种MPU上都有NVM的某些位,MPU也可能在同一片裸片上具有MCU,那又是什么呢?最小的无缓存处理器可能仍具有一些寄存器和SRAM,用RTL编码的定序器与从ROM执行的通用处理器真的有区别吗?显然MCU和MPU之间的区别有些随意,这意味着这一界限并不明确甚至可以随心所欲。当我想到MPU时,我想到的是用于控制通用计算机的设备,例如台式机、服务器、平板电脑等。” Cadence高级工程师Grant Martin认为:“根据维基百科的解释,MCU是在单个金属氧化物半导体集成电路芯片上的小型计算机,MPU是一种计算机处理器,在MOSFET结构的单个或多个集成电路上结合了中央处理单元的功能。” “如果深入研究,MPU具有CPU的功能,因此它是计算机处理器,而MCU则是更完整的计算机,这意味着MCU内包含MPU,这与常识相反。具有多个处理器核心的16路服务器处理器是否不再是MPU?而是一种多核异构SoC?” “例如,一部手机可能包括多个应用程序处理内核,用于音频、视频、图像处理的多个DSP,一个或两个用于在屏幕上呈现图像的GPU以及一个仅用于娱乐目的的神经网络处理单元——MCU。从我的角度来看,行业应该放弃这些过时的术语,使用更精确更具描述性的术语。”Grant Martin继续说。 西门子业务部门Mentor的高级产品经理Jeff Hancock则认为:“从系统软件的角度来看,MCU有望适用于直接解释和控制硬件传感器和执行器的应用。这种访问通常涉及一致且可靠的指令时序,这与通用MPU的需求相矛盾。通用MPU旨在优化吞吐量,而MCU通常会优化延迟。因此,如果是需要处理大型数据库,MPU更合适,如果是要精细的机电控制,那么MCU更合适。 Jeff Hancock还说:“外部存储器和缓存肯定让MCU的标准有所变化,但这距离将MCU等同于MPU还有很长的路要走。特别是并不是所有MCU中的所有处理单元都专门使用外部存储器,也可以使用隔离的子系统构建系统,这些子系统允许关键的工作负载和不太关键的应用程序级系统并行继续。” “从软件工程师的角度看,这是一个有趣的挑战,在不连续的地方可能有两个内存区域,集成式内存虽小,但速度更快,因此最好留给对速度有高要求的代码,例如实时操作系统。这意味着开发工具必须足够灵活以将代码正确地映射到存储器上,而RTOS必须足够小适合片上存储器。”西门子业务部门的嵌入式软件技术专家Walls补充到。 Tortuga Logic的高级硬件安全工程师Nicole Fern表示:“过去,MCU与嵌入式系统相关联。在嵌入式系统中,低成本和低功耗的要求比性能更为重要。但是随着移动计算和IoT边缘计算的出现,许多嵌入式系统现在需要复杂的处理,这样就产生了面向嵌入式领域看起来更像MPU的MCU产品,为带有外部存储器和高速缓存的器件提供了更高的性能和可配置性。这种情况下,术语MCU和MPU之间的差异仅取决于是否集成CPU系统。” Arm的低功耗IoT业务高级总监Thomas Ensergueix也认为:近年来,MCU和MPU之间的界限已经模糊。MCU和MPU之间的主要区别之一是软件和开发。MPU将支持丰富的OS,如Linux和相关的软件堆栈,而MCU通常将专注于裸机和RTOS。在决定哪种硬件平台、MCU或MPU最有效之前,由软件开发人员决定哪个软件环境和生态系统最适合他们的应用。 随着现在MCU已经过渡到32位,我们还看到了性能的急剧提高,这有助于缩小MCU和MPU之间的差距。例如:许多基于Arm Cortex-M7的MCU可提供100多个Dhrystone MIPS,或在CoreMark中提供2,000多个点。这些设备中的许多设备还具有非常大的内置存储器,或者提供快速接口来连接外部存储器。这确保了性能和内存不再是MCU的瓶颈,并使它们更接近低端MPU。 小结 如今MPU与MCU之间是否有明确的界限真的重要吗?可能不重要了。因为无论我们将其称之为什么,应用程序都有附带要求,这些要求将决定使用哪个设备。 END 直接来源:strongerHuang 来源:https://semiengineering.com/mpu-vs-mcu/ 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册网址_图解FreeRTOS原理系列之任务管理器基本框架

[导读] 学习梳理一下FreeRTOS任务管理单元实现思路,代码分析基于V10.4.3。从本文开始计划写个图解freeRTOS内核系列笔记分享给朋友们,希望大家喜欢。文章中或有错误,也请留言交流指正,或加本人微信进行交流~ 本文主要学习梳理FreeRTOS任务管理器的基本原理,大体框架。 内核任务管理器需求 先来对比一下裸奔系统与RTOS应用系统的编程模型,看看两种编程的不同画风。 裸奔系统 在不用RTOS的单片机应用开发时,编程模型大概是这样的画风: 程序的主体是一个死循环,该应用程序由一系列协同工作的函数片段组成,相互实现逻辑配合,实现用户业务需求。该应用程序独占单片机,常规的单片机系统都仅有有一个计算单元核。 普通外设I/O,这里所说I/O是指广义的I/O,比如GPIO、PWM、ADC、DAC、LCD显示(当然这里并不严谨,比如ADC,DAC、LCD等也可以产生中断)等。中断函数将异步事件接收成或报文或标志或数值,在与主循环发生逻辑关联。 中断外设,比如UART、USB、I2C、定时器、DMA等根据应用需求而使用的中断。这些中断都需要相应的中断函数进行处理异步中断事件。对于输出可能采样主动输出,一般由主循环某一个动作执行;对于输入设备或许采用轮询方式,在与主循环进行耦合。 RTOS应用系统 在一个基于RTOS应用系统中,其编程模型大致是下面这样一个画风,有多个并行的任务在相对长的宏观时间维度看起来,多个任务是并行运行的,但对于常规单片机而言(一般都是单核),任一时刻只有一个任务或中断函数在独占CPU核。 常见的RTOS没有设备驱动模型,没有对外设设备进行抽象,中断函数将会由用户或调用RTOS 机制,比如event/signal等与任务进行通信 任务间还有可能需要通信,或传递消息,或完成某项需求相互间需要同步等 同样任务需要与硬件普通IO外设进行打交道,或入或出。但有可能是这个任务实现,也有可能是哪个任务执行。完全取决于开发人员如何设计。 RTOS实现任务的切入切出,切入使某任务运行;切出使某任务挂起,出让CPU,暂停运行。 RTOS充当底层支持功能,RTOS还提供丰富的时间管理,队列、邮箱等机制供应用开发使用。 …… 对于单片机而言,一般只有一个核,所有RTOS为了方便理解,可以看成是最最主要的目就是通过软件方法将硬件CPU核程序运行环境抽象为每一个应用任务虚拟出一个软核。这样从时间维度上看起来多任务是并行的,而事实上这种并行是伪并行。 上图仅仅为理解RTOS作用方便,这种虚拟核本质上并不存在,只是将硬件CPU核的运行时上下文(PC指针、状态寄存器等寄存器组、任务运行时临时变量等)通过快照保存切入切出而实现多任务的伪并行运行。 FreeRTOS任务管理器需求 从前文看出,任务管理要实现任务的切入、切出,则首先需要对任务进行抽象描述,以实现在CPU上能够实现切换。根据阅读代码以及文献加上自己的理解,将内核任务管理器的主要功能需求大致梳理成下面这样一张用例图Use case Diagram,仅仅为理解方便,或许并不严谨。 从上图,大致可以看出FreeRTOS任务调度器需要以下一些功能需求: 任务抽象描述,一个任务一般本质上是一个死循环程序片段(当然也有任务运行着会退出被杀掉的可能)。对于任务的抽象: 一般会有任务的执行主体,利用函数主体函数指针进行抽象 RTOS常规都是的基于优先级抢占调度算法,因此需要抽象出哪个任务具有更高概率能被执行,用优先级进行描述 任务需要得以切换,就需要将任务在切换间的临时状态进行保存,栈机制就能很好的满足这样的需求,因此每个任务都有一个或大或小的任务栈。其本质上是一片连续的FILO(先入后出)内存。 ….. 任务创建、删除等API接口,供应用开发使用。 任务调度器控制接口,启动调度器、停止调度器、挂起所有任务、恢复运行等调度器接口。 任务杂项信息接口,比如获取任务状态、tick信息、调试、获取任务名等API接口 任务调度算法,基于调度策略对运行时的任务进行调度,或挂起、或运行、或就绪等,主要根据调度策略管理任务的切入切出。这里主要涉及到任务间上下文切换、任务与中断函数间的上下文切换两种场景。 抽象C运行时环境,现代RTOS应用系统一般基于C语言,抽象C运行时环境,这里主要指栈,当然很多RTOS内核也内核堆,freeRTOS也不例外。熟悉C编程的朋友都知道,堆内存由malloc/free函数操作集提供用户接口,既然C堆已有,为何RTOS内核重新造轮子?为啥内核额外需要实现自己的堆管理器呢?这大体是基于下面些缘由: 编译器C堆实现,在小型嵌入式系统上有时候并不能直接使用。 C堆的实现可能相对较大,占用了较大代码空间。比较浪费有限的代码存储空间。 C堆很少是线程安全的。 C堆申请执行时间不是确定的, 执行功能所需的时间因调用而异。 C堆会在单片机有限的内存资源引发内存碎片问题。 C堆会使链接器配置复杂化。 C堆如引发未知错误,不便于调试。 FreeRTOS任务描述抽象 对于其中几项必须的关键数据域描述一下其抽象作用: pxTopOfStack:指向任务栈栈顶指针 xStateListItem:任务状态链表描述节点,用于动态将该任务添加、删除到就绪或阻塞任务对列链表中 xEventListItem:事件链表描述节点,描述本任务相关事件,用于将本任务添加到事件链表中。 uxPriority:任务优先级,用于描述本任务的优先级。 pxStack:任务栈指针,指向本任务的任务栈。 pcTaskName:任务名字符串存储区,长度可配。默认为16字节 其他的数据域,可裁剪实现一些更丰富的功能,比如主要用于防治优先级反转的优先级继承机制,trace追踪功能等。限于篇幅,也主要梳理任务管理器的主要原理,就不展开了。 任务创建删除管理 FreeRTOS为用户提供一组函数集用于任务的创建、删除等管理,先看任务的创建API: BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,      const char * const pcName,           const configSTACK_DEPTH_TYPE usStackDepth,      void * const pvParameters,      UBaseType_t uxPriority,      TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,        const char * const pcName,            const uint32_t ulStackDepth,        void * const pvParameters,        UBaseType_t uxPriority,        StackType_t * const puxStackBuffer,        StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION;BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,          TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition,          TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION; xTaskCreate/xTaskCreateStatic 都是用于创建任务而用,其区别在于: xTaskCreate 申请任务控制块以及栈从内核堆申请 xTaskCreateStatic 创建的任务,其任务控制块内存以及任务栈内存由用户传入。或许有朋友会问StaticTask_t这不是任务控制块嘛,仔细看看其结构定义其内存对齐及大小刚好是前面说的任务控制块的定义。 xTaskCreateRestricted() /xTaskCreateRestrictedStatic(),主要用于在有或使能MPU单元的芯片中创建任务。这里的MPU是指Memory Protection Unit (MPU),不是微处理器的意思。这两者的区别与上面两个API类似,主要在于其内存分配方式不同,xTaskCreateRestricted是从内核堆动态申请,xTaskCreateRestrictedStatic用户传入。 PRIVILEGED_FUNCTION 这个宏是用于存储保护单元芯片的。 这几个任务创建函数都是用于任务创建,任务一旦创建就会被插入任务就绪链表中,当调度器调度启动后就按任务状态机根据调度策略以及外部输入事件进行调度接管。这里以xTaskCreate绘制一下其内在干了些啥: 再看看另外两个函数: void vTaskAllocateMPURegions( TaskHandle_t xTask,        const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION;void vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION; vTaskAllocateMPURegions: 定义一组内存保护单元(MPU)区域,供MPU受限任务使用. vTaskDelete: 删除用使用xTaskCreate()或xTaskCreateStatic()创建的任务。 任务控制管理接口 void vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION;BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,                            const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION;BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;void vTaskGetInfo( TaskHandle_t xTask,                   TaskStatus_t * pxTaskStatus,                   BaseType_t xGetFreeStackSpace,                   eTaskState eState ) PRIVILEGED_FUNCTION;void vTaskPrioritySet( TaskHandle_t xTask,                       UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION;void vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION;void vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION; 这一系列的API接口操作集主要用于对任务进行挂起延时、获取优先级、自中断函数获取优先级、挂起、恢复运行等操作。基本从其函数名就可以看出其作用。比如: vTaskDelay调用,会使调用该函数的任务进入阻塞状态一段时间,时间为传入的tick数。 这里需要注意的是有的函数在中断函数体里面不可以调用,需要使用专用版本,具体可以看看手册或注释。 调度器控制接口 void vTaskStartScheduler( void ) PRIVILEGED_FUNCTION;void vTaskEndScheduler( void ) PRIVILEGED_FUNCTION;void vTaskSuspendAll( void ) PRIVILEGED_FUNCTION;BaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION; 这一组函数API集主要用于调度器的启动、停止控制: vTaskStartScheduler,主要用于待用户任务创建好后,硬件初始化后,启动内核调度器 vTaskEndScheduler,可用于停止内核调度器,一般很少用到,在一些安全相关的应用可能会在出故障时主动停止调度器。 vTaskSuspendAll,挂起所有任务,可以用用户逻辑主动挂起所有的任务 xTaskResumeAll,恢复所有任务为就绪态。 任务杂项API集 我根据代码及注释及自己理解,将这些API归类到杂项API集合: TickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION;UBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION;char * pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION;     TaskHandle_t xTaskGetHandle( const char * pcNameToQuery ) PRIVILEGED_FUNCTION;   UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;void vTaskSetApplicationTaskTag( TaskHandle_t xTask,         TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION;TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet,          BaseType_t xIndex,          void * pvValue ) PRIVILEGED_FUNCTION;void * pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery,void vApplicationStackOverflowHook( TaskHandle_t xTask,           char * pcTaskName );void vApplicationTickHook( void ); ......BaseType_t xTaskGenericNotifyStateClear( TaskHandle_t xTask,                                         UBaseType_t uxIndexToClear ) PRIVILEGED_FUNCTION;uint32_t ulTaskGenericNotifyValueClear( TaskHandle_t xTask,                                        UBaseType_t uxIndexToClear,                                        uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION;void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION;BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,                                 TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION;BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) PRIVILEGED_FUNCTION; 这些函数具体作用就不赘述,这里仅仅梳理分类,用到时候查手册即可。 跨平台移植接口 BaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION;void vTaskPlaceOnEventList( List_t * const pxEventList,                            const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;void vTaskPlaceOnUnorderedEventList( List_t * pxEventList,                                     const TickType_t xItemValue,                                     const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;void vTaskPlaceOnEventListRestricted( List_t * const pxEventList,                                      TickType_t xTicksToWait,                                      const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION;BaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION;void vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem,                                        const TickType_t xItemValue ) PRIVILEGED_FUNCTION;portDONT_DISCARD void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION;TickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION;TaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION;void vTaskMissedYield( void ) PRIVILEGED_FUNCTION;BaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION;BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION;BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION;void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder,UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;void vTaskSetTaskNumber( TaskHandle_t xTask,                         const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION;void vTaskStepTick( const TickType_t xTicksToJump ) PRIVILEGED_FUNCTION;eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION;TaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION;void vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION; 这些接口不同硬件平台需要做具化的移植,做差异化的处理,但是对于FreeRTOS统一了内部调用的接口。这样的思路在应用开发时也可以考虑使用,对于公共部分可以抽象出统一的接口,这样在不同平台上可以很方便的进行移植。对于这些接口后面有机会学习整理分享。 对于用例图中的其他部分,核心调度部分以及上下文切换,篇幅所限留在后面学习整理分享。 总结一下 本文基本学习梳理了一下对于FreeRTOS任务调度器外部接口、以及大体作用,基本组成情况,水平所限,文章中错误难免,欢迎交流指正。 END 来源:嵌入式客栈,作者:逸珺 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册网站_男朋友是程序员是一种什么感受?

经常听到调侃我们程序员男生情商低, 但其实这么抽象的说法, 我们完全不知道问题出在哪里呀~ 今天大雄收集了一些 女生们关于程序员男友的一些相处感受 为了以后的幸福 “直男们”对号入座一下,扬长避短 。 ▼ 他不会讨我欢心话极少。 电话里,经常就只有我一个人的声音。 ▼ 跟他在一起就感觉不到他的温暖, 那种对你在乎的温暖, 感觉他花在你身上的心思不多。 ▼ 我会担心, 当某一天我对QQ,对电脑没什么兴趣后, 他对电脑越来越依赖的时候, 我怎么说服自己不去跟电脑争风吃醋。 如果以后他宁愿陪电脑也不陪我, 那我不是很没价值? ▼ 程序员怎么会有女朋友呢? 所以不用担心对方… 基本是没有恋爱经历, 感觉也不会有别人喜欢。 因此很有安全感… 虽然很多时候不会看女友脸色, 你都生气半天了对方还没发现。 ▼ 从来不哄我, 连“多喝水!”都不会说。 ▼ 说到喊吃饭的问题, 这个还好。 永远不要相信对方说的, “我还剩一点bug改一下就好了”。 或者 “我马上做完,就差一点了”, “我今晚肯定不会弄到那么晚,肯定能搞定”。 某次对方连续三四天解决服务器挂掉的问题, 基本上就顾不上陪你了。 ▼ 今晚一定不会弄到那么晚, 这个bug我一会就弄好了, 哈哈哈 ▼ 这么谈恋爱挺累的, 但是很踏实。 ▼ 男朋友一吵架就毫无逻辑, 情商巨低,他说我很无聊, 整天浪费他的时间, 他说他还是一个人搞技术比较好。 ▼ 特别老实,在公司, 老板让加班就加班。 在家里,老婆说啥都听。 ▼ 方向感特别好, 另一半完全不需要知道东西南北, 很有安全感。 ▼ 社交网站资料极少,也不会讲太多话。 社交网站只是浏览看别人说, 默默点赞或骂娘。 ▼ 基本不发朋友圈,屏蔽很多人。 ▼ 下班后, 喜欢打游戏, 一玩起来你就是光着躺在床上他也不会看你一眼。 还喜欢自己抱着游戏视频看。 ▼ 但是喜欢拼模型, 各种模型都喜欢钻研。 ▼ 偶尔看看综艺节目, 从来不看电视剧, 喜欢追美剧、日漫看。 ▼ 他们不懂浪漫,只懂逻辑思维。 ▼ 除了宅就是呆,一点都不体贴…… 根本不懂女生, 所以我不开心了会直接说, 然后眼睛汪汪地对着他哭。 而不是自己生闷气让他猜。 因为我知道, 如果我不说, 他永远也猜不明白 ▼ 给他分享一个黄段子或者笑话, 人家根本没感觉。 还会纠正错别字。 ▼ 十分讨厌我化妆, 有一天要出门, 他突然说你不“画画”了?! 【总结一下】 其实女生们对于程序员男友的 踏实靠谱还是非常认可的, 只是敏感细心的女孩子们 更需要体贴和关心呐。 大家努力工作的同时, 也要注意多关心另一半哦~ END 来源:老九学堂 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!