标签目录:摩登3平台靠谱吗

摩登3注册登录网_干货分享!嵌入式裸机编程中使用malloc、free会怎样?

在嵌入式裸机编程中,作为一名初级的CODER。经常要与CPU、内存等打交道。CPU作为系统的动力源,其重要程度不言而喻。 但是,在裸机编程中,对内存的管理也不容忽视。如果稍微不注意,轻则,可能造成内存泄漏,重则造成内存访问异常。导致系统死机。 嵌入式产品,对稳定性要求及其严格。动不动就死机,那可就麻烦大了。以下,是我本人对嵌入式系统裸机编程的内存管理的一些简介。 1、尽量不使用库自带的malloc和free。 malloc和free在PC编程中是很好用的一种内存分配手段。但是,其在嵌入式中,就未必好用了。由于嵌入式裸机编程中,无MMU,即内存管理单元。无法实现对内存进行动态映射(不明白什么叫动态映射的同学,可以参考网上的资料)。 也就是说,实际上,malloc和free并不能实现动态的内存的管理。这需要在启动阶段专门给其分配一段空闲的内存区域作为malloc的内存区。如STM32中的启动文件startup_stm32f10x_md.s中可见以下信息: Heap_Size EQU 0x00000800AREA HEAP, NOINIT, READWRITE, ALIGN=3__heap_baseHeap_Mem SPACE Heap_Size__heap_limit 其中,Heap_Size即定义一个宏定义。数值为 0x00000800。Heap_Mem则为申请一块连续的内存,大小为 Heap_Size。简化为C语言版本如下: #define Heap_Size 0x00000800unsigned char Heap_Mem[Heap_Size] = {0}; 在这里申请的这块内存,在接下来的代码中,被注册进系统中给malloc和free函数所使用: __user_initial_stackheapLDR R0, = Heap_Mem ; 返回系统中堆内存起始地址LDR R1, =(Stack_Mem + Stack_Size)LDR R2, = (Heap_Mem + Heap_Size); 返回系统中堆内存的结束地址LDR R3, = Stack_MemBX LR 就如上面分析的那样,其实,在裸机编程的时候,对堆内存的管理。并非是智能化的,并非你想申请多少就多少。而是使用一块固定的内存用作堆内存的分配。这在设计的时候,往往不是最佳的方案。这块内存,如果被多次按照不同的大小进行申请,就会造成内存碎片。最终导致无法申请到足够的内存。导致系统运行出错。这在原本内存就已经很少的嵌入式系统中,更是不能接受的。所以,建议是把那个Heap_Size设置成 0 吧。放弃其使用吧。 而更为致命的是,有些malloc,free函数,由于工程人员的偷懒。实现甚至可能如下: unsigned char mem_buffer[512];unsigned char *mem_offset = & mem_buffer;void *malloc(int size){unsigned char *tmp = mem_offset; mem_offset += size;return (void *)tmp;}void free(void *mem){ mem_offset = mem;} 2、不用malloc、free的原因 一般单片机的内存都比较小,而且没有MMU,malloc 与free的使用容易造成内存碎片。而且可能因为空间不足而分配失败,从而导致系统崩溃,因此应该慎用,或者自己实现内存管理。如: 《一个简单而强大的单片机内存管理器》 在函数中使用malloc,如果是大的内存分配,而且malloc与free的次数也不是特别频繁,使用malloc与free是比较合适的,但是如果内存分配比较小,而且次数特别频繁,那么使用malloc与free就有些不太合适了。 因为过多的malloc与free容易造成内存碎片,致使可使用的堆内存变小。尤其是在对单片机等没有MMU的芯片编程时,慎用malloc与free。如果需要对内存的频繁操作,可以自己实现一个内存管理。 使用动态内存分配,应分不同的应用场合。 对于在操作系统上运行的程序,实际的物理内存分配与释放使用操作系统来实现的,即使程序调用了 malloc和free物理内存并不会马上变化。物理内存的变化,直到系统的内存管理操作时才发生。 对于裸机跑在MCU上的程序,分配与释放内存都会造成实际物理内存的变化。因为此时物理内存的分配是由自己实现的,而内存管理我们自己并没有去做。这样,盲目的使用malloc与free恰恰并不好,反而会造成内存的不恰当使用。甚至于内存溢出。 所以,动态内存的使用前提是有一套好的内存管理方法,这样动态内存的使用才会合理使用内存。如果没有合适的内存管理代码,还是用静态内存好一些。 可能有些同学,觉得:内存池,这是什么东西? 内存池,简洁地来说,就是预先分配一块固定大小的内存。以后,要申请固定大小的内存的时候,即可从该内存池中申请。用完了,自然要放回去。注意,内存池,每次申请都只能申请固定大小的内存。这样子做,有很多好处: (1)每次动态内存申请的大小都是固定的,可以有效防止内存碎片化。(至于为什么,可以想想,每次申请的都是固定的大小,回收也是固定的大小) (2)效率高,不需要复杂的内存分配算法来实现。申请,释放的时间复杂度,可以做到O(1)。 (3)实现简单,易用。 (4)内存的申请,释放都在可控的范围之内。不会出现以后运行着,运行着,就再也申请不到内存的情况。 内存池,并非什么很厉害的技术。实现起来,其实可以做到很简单。只需要一个链表即可。在初始化的时候,把全局变量申请来的内存,一个个放入该链表中。在申请的时候,只需要取出头部并返回即可。在释放的时候,只需要把该内存插入链表。以下是一种简单的例子(使用移植来的linux内核链表,对该链表的移植,以后有时间再去分析): #define MEM_BUFFER_LEN 5 //内存块的数量#define MEM_BUFFER_SIZE 256 //每块内存的大小//内存池的描述,使用联合体,体现穷人的智慧。就如,我一同学说的:一个字节,恨不得掰成8个字节来用。typedef union mem {struct list_head list;unsigned char buffer[MEM_BUFFER_SIZE];}mem_t;static union mem gmem[MEM_BUFFER_LEN];LIST_HEAD(mem_pool);//分配内存void *mem_pop(){ union mem *ret = NULL; psr_t psr; psr = ENTER_CRITICAL();…

摩登3注册网址_如何优雅地解决STM32的Flash写保护的问题?

本文介绍了如何解决STM32芯片Flash写保护导致无法下载程序,无法在线调试的问题;如果您遇到相同的问题,希望本文可以带来一些帮助; 1 FLASH的写保护 如果对Flash设置了写保护,那就无法对Flash进行编程和擦除。 在开发STM32的时候,如果出现这种情况,通常仿真器都支持对Flash进行解锁,像jlink,stlink等仿真器都支持这个功能。 2 错误提示 在使用MDK进行调试的时候,出现报错 ==Flash Timeout.Reset Target and try it again==,具体如下图所示; 折腾了一番之后,并没有解决问题,因为使用的仿真器是stlink,因此下载了stlink utility尝试解决问题; 3 stlink utility 3.1 基本功能 stlink utility是ST官方提供的免费软件,支持STM32 ST-LINK的程序包括带有命令行界面(CLI)的图形用户界面(GUI)。该工具还提供了较多的其他功能,具体如下; 可以对STM32 内部存储器 (Flash,RAM,OTP和其他存储器), 外部存储器进行编程; 验证程序内容(校验和,在编程期间和之后进行校验,与文件进行比较等) 还能实现 STM32编程自动化; 另外还提供其他的功能; 3.2 解锁Flash 在stlink连接目标板的情况下,打开stlink utility,在菜单栏的Target下选择connect,因为这时候Flash已经被锁住了,所以同样地也看到相应的错误提示 Can not read memory Disable Read Out Protection and retry,具体如下图所示; OK,下面只需要接触写保护就行了,所以在菜单栏target里打开Option Bytes…选项,或者直接通过快捷键ctrl+B打开,请确保当前已经正确连接了stlink和目标板,否则会出现报错; 正确连接的情况下,打开Option Bytes…,发现在这里Read Out Protection选项是enable,这个表示无法通过swd读取STM32内部Flash的程序。 关键点:将Read Out Protection选项设置为disable,点击Apply,这时候Flash已经成功解锁了。但是同时发现,内部Flash已经被擦除了; 这可能STM32的保护机制有关,防止程序被拷机,然后进行反编译破解,这样也可以提高破解的门槛。具体显示如下图所示; 完成以上步骤之后,在菜单栏Target下选择Disconnect,或者通过快捷键ctrl+D断开和目标板的连接;重新进入MDK,就能正常对目标板进行调试,仿真,以及程序的烧写。 3.3 写保护 在菜单栏target里打开Option Bytes…选项,我们还看到下面有Flash sector protection选项;选择Select all之后,发现所有Page都已经写保护了,只要选择apply选项就可以对Flash进行写保护;具体如下所示; 4 总结 对于Flash写保护的问题可以结合STM32参考手册进行相应的学习,其内部Flash提供相应的保护机制,本文只是结合ST官方工具stlink utility解决一下常见的这个简单的问题。 笔者能力和水平有限,文中难免有错误和纰漏之处,请大佬们不吝赐教; – END – 推荐好文   点击蓝色字体即可跳转  全网最通俗易懂SPWM入门教程,快来白嫖  天哪!原来PWM这么简单  PID微分器与滤波器的爱恨情仇  简易PID算法的快速扫盲 增量式PID到底是什么? 三面大疆惨败,因为不懂PID的积分抗饱和 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3平台首页_行业唯一!海信新风空调企业标准入选2020“领跑者”名单

12月19日,在京举办的2020年企业标准“领跑者”大会上,海信空调2项企业标准入选2020企业标准“领跑者”名单。其中,Q/0202RSR 683-2020《转速可控型新风房间空气调节器》为行业唯一入围的新风空调企业标准,也再次印证了海信在新风领域的领先实力。 相比于国家或团体标准,入选“领跑者”名单的企业标准更为苛刻。2020企业标准“领跑者”名单显示:海信空调共2项企业标准入选,涵盖33款新能效产品。其中,企业标准Q/0202RSR 683-2020《转速可控型新风房间空气调节器》为行业唯一入围的新风空调企业标准,其在新风量、噪声值、能效比等核心指标上,均在业内处于领先。 一流的企业做标准。事实上,今年3月由海信空调牵头制定了中国首个新风空调团标,规定了“新风空调器”的定义、产品分类、技术要求等。如今,海信再次用标准提高对新风空调的要求,引领行业回归到品质和价值追求的正确赛道上来。 今年以来,契合消费者健康需求,新风空调成大势所趋。中怡康线下监测数据显示:2020年1-50周,新风空调市场零售量、零售额同比增幅分别为186.6%,176.5%。而海信新风空调(第43-50周)零售额占比近3成,稳居行业TOP2,是标准和市场的双料领跑者。

摩登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内部554258_全球首款华为手机已经升级到鸿蒙了,先睹为快!!

华为在 2020-12-16 号发布了鸿蒙 beta 版,该版本支持手机。华为的大多数机型都可以升级到鸿蒙。 正好我手头有几部华为 P40 的手机,而且都收到了鸿蒙的推送,现在就来先睹为快吧。 首先进入到设置页面,点击“系统和更新”→ “软件更新”,系统会自动检测鸿蒙的最小版本,目前最新的版本是 2.0.0 Developer Beta1,然后可以点击开始刷机按钮(会弹出一个对话框)。 鸿蒙升级版有 4 个多 G,建议用快递的宽带,例如,我家里的是 500G 宽带,下载完大概 10 分钟左右,速度还是比较快的。开始安装后就会重启,然后速度还是很快滴。 如下图,很快就会到 100%: 接下来就会重启手机: 重启后,一切就搞定了。先上图。这就是鸿蒙桌面的首页,看着还很清爽的。速度也很快。 下面来看一下鸿蒙的版本,妥妥滴 HarmonyOS。这是真正的鸿蒙系统。 再看看内核版本,HarmonyOS,看图: 最后,来试试最新的鸿蒙系统是否可以运行我们开发的程序,打开最新版的 DevEco Studio,创建一个 Phone 工程。 按下图选择: 然后选择的 API 版是 4,如下图: 最后点击 Finish 创建工程。别忙,要想在手机上运行,还需要签名,点击 Project Structure 菜单项,进入到 Modules 的签名页面,如下图。 由于这里只进行调试,所以只设置 debug 签名即可,这里面涉及到 3 类文件:p12、p7b 和 cer。这些文件如何获得,后期我会单独制作完整的鸿蒙开发视频课程来讲解。 配置完签名后,直接运行,就会在鸿蒙手机上安装并自动运行了,如下图: ok,剩下的时间就交给各位了,尽情滴享受鸿蒙吧(前提是要有华为手机,而且收到了鸿蒙的推送,good luck)! END 来源:鸿蒙技术社区 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登三1960_中国移动内蒙古公司联合中兴通讯完成SSB1+X立体覆盖方案验证

近日,中国移动内蒙古公司联合中兴通讯在内蒙古通辽完成SSB1+X立体覆盖方案验证。该方案能够有效改善现阶段高层楼宇深度覆盖不足的问题。通过验证,在20层以上的高楼用户平均信号强度增加了5.8dB,下载速率平均提升了106Mbps,提升效果显著,为高层楼宇室内覆盖难点提供了全新的解决方案。 随着内蒙古移动5G建设的不断发力,目前已实现各地市城区道路的基本覆盖。但是如何利用现有宏站加强室内用户的5G渗透率,提升室内5G用户感知是目前面临的一个重要问题。尤其是针对高楼层用户,在室分系统暂未建设的情况下显得尤为重要。 针对当前所面临的问题,内蒙古移动联合中兴通讯在通辽开展了SSB1+X立体覆盖方案的验证,通过1个SSB水平增强型宽波束+X个SSB垂直可变波束来达到高层楼宇的立体覆盖效果,增强高层楼宇的深度覆盖。验证结果显示,20层以上测试SSB-RSRP平均增加5.8dB,SSB-SINR平均增加8dB,用户下载速率平均提升106Mbps,网络质量提升效果显著。该方案具有:增益大、省资源、降能耗、易演进、部署简单等优势。通过对场景的简单分析即可完成部署,加强了网络立体覆盖能力。 在5G加速发展的大时代下,内蒙古移动将继续联合中兴通讯等设备厂商,不断探索、应用最前沿的科学技术,为广大用户提供优质、稳定、可靠的5G网络服务。

摩登三1960_你们也疲惫过吗?

大家好,我是小林 之前有不少读者说,小林我变短,当然这个短的意思,是指文章的长度,能说这句话的读者,肯定是老读者了,在此也感谢这些一直不离不弃,并持续关注小林的读者。 这里可能让最近刚关注的新读者会疑惑,难道小林以前很长吗?是的,以前的文章相比现在的文章确实很长,当时精力确实盘满钵满,每一篇都是万字长文,并且还配 30 张图,当初也靠这份认真吸引了很多读者。 但是随着关注的读者越来越多,发现事情也越来越多,时间也因此被这些事情一点点消磨了,每天都会有人加好友、加群,其实加群这事挺费劲的,群超过了 200 后,就要一个一个邀请对方进群,而我就这么一个一个邀请,至今也有 6 个满 500 人的技术交流群。有了群,那必然还要维护,这有又要牺牲一些时间,每天监督 6 个群,有没人违反群规,或者提问之类的事情。 小林微信快接近 5000 人了,每天的微信都有很多各种各样的信息,时不时也会有读者问一些问题,我能当场回答基本都是秒回的,没有回复的话,可能是我当时没有想法,但是又由于信息过于多,后面可能遗漏回答了,所以没有回复到你们,这真不是小林高冷,是真的当信息一多后,真的很容易就忘记一些事情。 在我还没做公众号的时候,也加过一些号主,向他们提问,大概率也是没有答复的,当时对于没有回复的号主,还是挺生气的,也觉得他们有什么高冷的。但是当自己也成了号主后,我真的深深刻刻理解到这份处境了,不是高冷,而是信息过于多,如果每一个问题都一个一个去说明白的话,自己的工作都不用做了。 以前能专注写长文的时间,就是这么被一件件小事给消磨了,但为了保持更新频率,小林只能选择短一些题材的文章,但是短并不代表内容不好。 而且,到年底了,最近工作项目开发任务也非常的多,加班的时间也随之变长,留给写文章的时间那更是少了,以前写文章都是实打实的一个周末的时间,而现在写文章变成了每天下班的晚上,经常为了赶文,在这寒冷多冬天里,瑟瑟发抖地码字到 2 点多,重点是每天我还得 7 点起床赶公司的班车。 这一个月的平均睡眠时间,也只有 6 个小时多。 这样的节奏持续了一个月后,我发现身心开始慢慢变得很疲惫,做事的效率也大幅度下降,而且感到很焦虑,上班时间被项目压着,下班时间被文章压着。 小林也是一个人,并不是一个肝货输出机,即使我真的能做到,那这样也太没有人情味了。我并不想让大家只是觉得「小林coding」只是一个只写图解技术的公众号,所以我想在没有太多时间写图解技术文章的时候,我也想跑出来,跟大家聊聊一些杂事,聊聊人暖长情,或是拍拍猫片。 最后,送点福利。 最近图灵出版社送了 5 本书给小林,其中我把 2 本送给了之前一直帮我勘误文章的两位读者,他们真多很细心,发现了小林特别多的错别字,或者语句不顺的地方,帮助过小林的读者我都会铭记于心的,一有机会都会回馈给他们。 上次抽奖送 labulaodng 算法书的时候,有一位读者一直没有过来领奖,已经逾期了。 所以,这次将送出「 3 本图灵出版社 + 1 本 labulaodng 算法书」共 4 本书,其中图灵出版社的书是可以任选图灵出版社中的书。 这次送书的规则,在评论区留言,「」,我将会从评论区选择 4 位读者,给每人送出一本书。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3登录网站_人生开始成熟的3个标志:承认父母普通,承认自己普通,承认孩子普通

中国有句古话,“龙生龙,凤生凤,老鼠的儿子会打洞”。意思就是说,如果父母牛逼,那么孩子大概率也会躺着牛逼。 真的是这样吗?英国著名生物学家高尔顿,对此提出了质疑。 高尔顿的研究表明:父母身高非常高,孩子的身高大概率会倾向于正常值,小概率还像父母那样高。而到了孙子辈,会更倾向于正常值。 在个人成就方面也是一样的道理。父母成就高,那么孩子成就高的概率是36%,孙子辈是9%,尽管还是比普通成就家庭高一些,但也是呈现回归正常值的态势。 也就是说,这个世界上绝大多数人都是普通人,极少数牛逼的人下一代也会向普通跌落。 承认自己是个普通人,人生开始变好 老K以前总是不愿意承认自己又庸俗又正常,总觉得自己骨骼清奇,是个做大事的人,甚至宁可做个神经病也不愿做个普通人。 后来发现很多身边的朋友也有这个困扰。 科学家研究表明,整个人类社会中的普通人占比68%,比较聪明的占比13.6%。 据我观察,很多人一事无成,就是因为自己对自己的定位有问题。 邓亚萍是乒乓球历史上最伟大的女子选手,她5岁起就随父亲学打球,1988年进入国家队,先后获得14次世界冠军头衔,在乒坛世界排名连续8年保持第一。 你一定以为她是万中无一的运动奇才。恰恰相反,她个子矮,手脚粗短,根本不是个当运动员的料。甚至都不符合体校的要求,体校也将她拒之门外。 幸运的是,邓亚萍和她的父亲很早明白了这个道理:资质普通、身体条件不突出,一样也可以通过合适的训练方法进行提升,达到很高的水平。 邓亚萍在父亲的指导下,开始刻苦练习。她每天在练完体能课后,必须还要做100个发球接球的动作。当时,邓亚萍虽然只有七八岁,但为了能使自己的球技更加熟练,基本功更加扎实,便在自己的腿上绑上了沙袋,而且把木球拍换成了铁球拍。 10岁的她,一鸣惊人,在全国少年乒乓球比赛中获得团体和单打两项冠军。进入了国家队后,她并没有松懈。因为知道自己资质普通,她更加刻苦的练习基础训练,每天比队友多练习4小时以上。 邓亚萍的出色成就,改变了世界乒坛只在高个子中选拔运动员的传统观念。国际奥委会主席萨马兰奇也为邓亚萍的球风和球艺所倾倒,亲自为她颁奖。 老K之前讲过,这辈子最豁然开朗的时刻,就是意识到自己是个普通人。于是那段时间里,静下心来学习和练习,就是在那时,读了这辈子最多的书。当机会来临的时候,才有了抓住机会的能力,实现了职场生涯的跃迁,成为别人眼中的牛人。 因为不会表达,所以抓住任何一次分享表达的机会。 因为智商一般,所以拼命做笔记、思考,将基本理念和方法烂熟于心。 因为阅读不快,所以静下心来慢慢看,日积月累,从量变到质变。 认识到人生唯一可靠的路就是下苦工重复练习,反而踏实了很多。虽然也曾经痛恨自己不是天才,不能过目不忘,不过好在后来发现我并不需要那个技能。 承认普通,就是自我放纵吗? 许多人都误解了承认普通的意义,承认并接受普通,并不意味着放弃自我、破罐破摔。 恰恰相反,。 一个人努力的区域有三个:舒适区、训练区、挑战区。 长按订阅更多精彩▼ 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3注册开户_BittWare 发布采用英特尔® Agilex™ FPGA,并支持 oneAPI™ 统一软件编程环境的 IA-840F

美国新罕布什尔州康科德 – 2021年 1月 5 日 – Molex莫仕旗下的 BittWare 公司推出 IA-840F,这是公司第一种基于英特尔® Agilex™ 的 FPGA 卡,该卡的设计在每千瓦性能方面实现了重大的改进,适合下一代的数据中心、网络及边缘计算工作量使用。Agilex 的 FPGA 性能高出 40%,或者在功率方面至多可降低 40%,具体则与应用需求有关。BittWare 利用了 Agilex 芯片独一无二的瓦式架构,针对形形色色的应用提供了双 QSFP-DD (4×100G)、PCIe Gen4x16 及三个 MCIO 扩展端口,将 I/O 功能提升至最大程度。BittWare 还宣布为英特尔的 oneAPI™ 提供支持,从而实现抽象的开发流程,在多个架构之间极大的简化代码的重用。 BittWare 公司市场副总裁 Craig Petrie 表示:“现代数据中心的工作量呈令人难以置信的多样化趋势,这就需要客户去实施一系列多种标量、矢量、矩阵及空间上的架构。IA-840F 确保客户可以快速而又方便的利用英特尔 Agilex FPGA 的各种高级功能。对于倾向于在抽象的层次上从事 FPGA 应用开发的客户,我们也在其中包含了对 oneAPI 的支持。这种新的统一软件编程环境使客户可以利用单一的代码库来为 Agilex FPGA 编程,在多个架构上都达到原生高级语言的性能。” 新型的 IA-840F 提供各种企业级的功能特点与性能,包括: § 对英特尔 oneAPI 统一软件编程环境的支持 § HDL 开发者工具包:API、PCIe 驱动、应用实例设计与自我故障诊断 § 精密的基板管理控制器 (BMC) § 热冷却选项:无源、有源或液体 § 为附加的 PCIe、存储或网络 I/O 提供多个扩展端口 为了简化跨架构的开发工作,oneAPI 中包含了数据并行 C++ (Data Parallel C++) 这种直接编程语言,以及一系列适合基于 API 的编程的库。数据并行 C++ 以 C++ 为基础,整合了来自科纳斯组织 (Khronos Group) 的 SYCL。这样在多个架构之间可极大的简化代码的重用,与此同时还为加速器的定制调谐提供了便利。 英特尔可编程解决方案集团的产品副总裁 Patrick Dorsey 表示:“英特尔的 Agilex FPGA 以及包括 oneAPI 工具包在内的跨平台工具起到了示范的作用,使得这些最新的 FPGA 及其强大的功能操作起来更加方便 – 包括 eASIC 集成、HBM 集成、BFLOAT16、优化张量计算块、Compute Express Link (CXL),以及 112 Gbps 的收发器数据速率,适合高速 1Ghz 计算解决方案及 400Gbps+ 连接解决方案使用。Agilex 平台和 oneAPI 工具可高度定制并采取了异构的设计,使 BittWare 的新型 IA-840F…

摩登3注册平台官网_LeddarTech宣布任命Carl-Peter Forster为董事

魁北克市, Jan. 06, 2021 (GLOBE NEWSWIRE) — 1-5级ADAS和AD传感技术领域全球领先企业LeddarTech®很高兴地宣布任命Carl-Peter Forster为董事,进一步增强董事会成员的多元化和经验水平。 Carl-Peter Forster持有波恩大学经济学学位和德国慕尼黑工业大学航空和空间技术学位。 Carl-Peter在汽车行业拥有丰富的高级管理背景,曾任职多家品牌企业,包括在位于慕尼黑的BMW AG担任包括副总裁在内的多个职位。他还曾担任BMW南非公司董事总经理及负责全球制造的BMW AG董事,直至2000年。2001年至2009年期间,Carl-Peter任Adam Opel AG董事总经理,2006起担任General Motors Europe总裁兼首席执行官以及GM汽车全球汽车战略委员会成员。2010年至2011年,他曾担任Tata Motors(Jaguar Land Rover的母公司)首席执行官。 Carl-Peter自2013年以来担任吉利集团董事长特别顾问,同时在多家公司担任董事职务,包括位于瑞典哥德堡的Volvo Cars Group、吉利汽车控股有限公司、吉利-沃尔沃联合技术研发中心(哥德堡),此外还担任The London Electric Vehicle Company(前称The London Taxi Company)董事长直至2019年。除担任LeddarTech董事之外,Carl-Peter目前还任Chemring Plc的的时候主席、Hella KGaA股东大会主席,并在多家公司担任董事职务,包括IMI Plc, Babcock Plc、The Mobility House AG、Gordon Murray Design Ltd.、Kinexon GmbH、Clear Motion Ltd.和Envisics Ltd。 “LeddarTech董事会十分高兴地欢迎Carl-Peter Forster加入LeddarTech团队”,LeddarTech董事会主席Michel Brûlé先生表示。“Carl-Peter曾在多家世界最大的汽车企业担任领导职位,为我们带来了丰富的行业经验。Carl-Peter在汽车行业以及ADAS和AD技术企业的丰富经验将成为LeddarTech的一项重大资产”,Brûlé先生总结道。