• 惊!原来嵌入式软件架构存在具有这个意义

    在嵌入式软件开发,包括单片机开发中,软件架构对于开发人员是一个必须认真考虑的问题。软件架构对于系统整体的稳定性和可靠性是非常重要的,一个合适的软件架构不仅结构清晰,并且便于开发、维护。我相信在嵌入式或单片机软件开发的初期大多数开发者采用的都是简单的前后台顺序执行架构(我就是这样的)。在嵌入式软件开发中,程序架构主要分为三种,本篇文章将对这三种程序架构做出详解。软件架构存在的意义可以说一个好的程序架构,是一个有经验的工程师和一个初学者的分水岭。软件架构对于开发人员是友好的,你希望先执行什么任务后执行什么任务,或者这一个时间点执行什么任务下一个执行什么任务,又或者什么事件会同步到某个任务等等,在不同的软件架构下,解决上述问题的具体方法都是有所区别的。软件架构对开发者最大的帮助是:帮助开发者掌控整个工程的框架,当你熟练使用其中某一个程序架构后,对于系统中出现的bug你一定能够快速的定位并解决。当然,我建议要根据需要选择合适的软件架构进行开发,具体原因在文章后面会进行介绍。介绍三种不同的程序架构三种常用的软件架构有:顺序执行的前后台系统时间片轮询系统多任务操作系统为了让大家有一个更为清晰的认识,我分别用三种软件架构对一个实例进行介绍说明。这个实例如下:它有4个任务,这4个任务为按键扫描、声光报警、显示屏刷新和超声波测距。这个实例的具体功能是通过按键设置测量距离的阈值,当测距距离低于设置的阈值时,触发声光报警并且将测量距离实时显示在显示屏上(这个应用是汽车倒车雷达的具体体现)。1.顺序执行的前后台系统在顺序执行的前后台系统中,我会把键盘扫描用查询的方式放在while(1)中,而显示屏刷新和超声波测距使用中断,在中断服务函数中获取测量距离后进行显示,在主函数的循环中进行按键的检测,声光处理也放在主循环中。这样整个程序就以变量标志的同步方式在主循环和后台中断中执行,对应的程序代码如图所示:顺序执行前后台系统的主函数顺序执行前后台系统的中断服务函数这种架构的优点是使用简单易于理解,而缺点是每个任务所占的CPU时间过长的话,会导致程序的实时性能差,就比如按键的检测等。2.时间片轮询系统和多任务操作系统时间片轮询法实际上通常出现在操作系统中,也就是说他属于操作系统,但在这里所说的是基于前后台系统的时间片轮询。时间片轮询法的实质其实就是选出一个定时器,没进一次定时中断对计数值进行自加,在主循环中根据这个计数值执行任务,这个计数值也就是任务轮询的时间片。在这个实例中,如果采用时间片轮询系统的话,首先选用主控芯片的任一定时器,定时器定时时间周期由我们决定,为了保证实时性和运行效率,这个值通常取10ms、30ms、50ms等,我会将按键扫描轮值值设置为20ms,因为按键抖动的时长一般为20ms,这样处理既达到了消抖的目的,又不会漏掉按键的检测;而显示屏的刷新设置为30ms,如果你觉得刷新反应慢了也可以修改这一轮询值得到改善;而超声波测距的轮询值设置为100ms,即每隔100模式触发测距一次,这个测距频率已经能够满足大多数的情况了。程序代码如下:时间片轮询系统的主函数时间片轮询系统的定时器中断函数可以看出时间片轮询法相比顺序执行还是有很大优势的,既有顺序执行法的优点,也有操作系统的部分优点。3.多任务操作系统操作系统的本身是一个比较复杂的东西,任务的管理和调度实现的底层是很复杂和困难的。但是呢,我们一般都是把操作系统本身作为一个工具一个平台,我们的目的是使用它的功能而不是开发一个操作系统。我使用过ucos和freertos小型的实时操作系统,也使用过Linux大型的操作系统,有了操作系统,不管是对于程序的稳定性和开发的效率都会好很多。我们在使用操作系统的时候更多的需要去学习和理解它的一些调度和通信的方式。实际上真正能使用操作系统的人并不多,反而是跑裸机的占大多数,这也和产品的具体要求有关,很多简单的系统只需要裸机即可满足。在这里本我不过多的介绍操作系统本身,因为操作系统确实挺复杂的,下面图例中的代码是在freertos中创建按键控制LED亮灭的程序结构,大家可以对比一下:freertos多任务系统中主函数freertos多任务操作系统中的任务回调函数如何选择合适的软件架构我使用过多种不同MCU做项目开发,例如:STM32、STC15、新唐等,也接触过复杂的设计需求,例如:车载智能系统和智能家居,跑过操作系统ucos、freertos和Linux等等。在回到裸机开发时,就会不然而然的去思考完整系统的软件架构的设计问题,相信在读者中开发裸机的也占大多数。我认为没有最好的软件(程序)架构,而只有最合适的软件架构。因为在不同的应用场景中适合采用不同的程序设计,而单纯的去比较哪种程序架构是最好的没有什么实际的意义。那接下来我们来对具体的应用场景进行分析,在一些逻辑清晰功能单一的系统中就很适合选择顺序执行的前后台架构,这个软件架构往往能够满足我们大部分的需求,比如电饭煲、电磁炉和声控灯泡等;而在一些资源缺乏的单片机并且对系统可靠性要求较高的情况下非常适合,因为这种方法的系统耗费比较小,只是牺牲了一个定时器而已,但是选择此种程序架构需要我们对时间片进行深思熟虑的划分;最后,在一些功能复杂,逻辑控制较为困难的系统中就适合选择多任务操作系统,比如视频监控系统、无人机等等应用场景。作为一名嵌入式软件工程师,掌握这三种软件架构是非常有必要的,它们可以让我们在设计程序时拥有更多的选择和思考,而每一种不同的程序架构都具备它自己的优势与不足,这需要我们去用心实践方可体会到它的奥妙。END来源:StrongerHuang版权归原作者所有,如有侵权,请联系删除。▍

    嵌入式ARM 嵌入式软件 软件架构

  • 最好的解析:二极管的单向导电特性

    二极管是电子电路中很常用的元器件,非常常见,二极管具有正向导通,反向截止的特性。在二极管的正向端(正极)加正电压,负向端(负极)加负电压,二极管导通,有电流流过二极管。在二极管的正向端(正极)加负电压,负向端(负极)加正电压,二极管截止,没有电流流过二极管。这就是所说的二极管的单向导通特性。下面解释为什么二极管会单向导通。二极管的单向导电性二极管是由 PN 结组成的,即 P 型半导体和 N 型半导体,因此 PN 结的特性导致了二极管的单向导电特性。PN 结如图 1 所示。图 1 :PN 结示意图  在 P 型和 N 型半导体的交界面附近,由于 N 区的自由电子浓度大,于是带负电荷的自由电子会由 N 区向电子浓度低的 P 区扩散;扩散的结果使 PN 结中靠 P 区一侧带负电,靠 N 区一侧带正电,形成由 N 区指向 P 区的电场,即 PN 结内电场。内电场将阻碍多数载流子的继续扩散,又称为阻挡层。  PN 结详解二极管的单向导电特性用途很广,到底是什么原因让电子如此听话呢?它的微观机理是什么呢?这里简单形象介绍一下。  假设有一块 P 型半导体(用黄色代表空穴多)和一块 N 型半导体(用绿色代表电子多),它们自然状态下分别都是电中性的,即不带电。如图 2 所示。图 2 :P 型和 N 型半导体  把它们结合在一起,就形成 PN 结。边界处 N 型半导体的电子自然就会跑去 P 型区填补空穴,留下失去电子而显正电的原子。相应 P 型区边界的原子由于得到电子而显负电,于是就在边界形成一个空间电荷区。为什么叫“空间电荷区”?是因为这些电荷是微观空间内无法移动的原子构成的。  空间电荷区形成一个内建电场,电场方向由 N 到 P,这个电场阻止了后面的电子继续过来填补空穴,因为这时 P 型区的负空间电荷是排斥电子的。电子和空穴的结合会越来越慢,最后达到平衡,相当于载流子耗尽了,所以空间电荷区也叫耗尽层。这时 PN 结整体还呈电中性,因为空间电荷有正有负互相抵消。如图 3 所示。图 3 :PN 结形成内建电场  外加正向电压,电场方向由正到负,与内建电场相反,削弱了内建电场,所以二极管容易导通。绿色箭头表示电子流动方向,与电流定义的方向相反。如图 4 所示。图 4 :正向导通状态  外加反向电压,电场方向与内建电场相同,增强了内建电场,所以二极管不容易导通。如图 5 所示。当然,不导通也不是绝对的,一般会有很小的漏电流。随着反向电压如果继续增大,可能造成二极管击穿而急剧漏电。图 5 :反向不导通状态 图 6 是二极管的电流电压曲线供参考。图 6 :二极管电流电压曲线  图 7 形象的展示了不同方向二极管为什么能导通和不能导通,方便理解。图 7 :不同方向导通效果不同  生活中单向导通的例子也不少,比如地铁进站口的单向闸机,也相当于二极管的效果:正向导通,反向不导通,如果硬要反向通过,可能就会因为太大力“反向击穿”破坏闸机了。END来源:网络版权归原作者所有,如有侵权,请联系删除。▍

    嵌入式ARM 二极管

  • 单片机的串口通信,简单明了好理解

    零、写在前面串口是单片机重要的片上资源,通过串口搭配不同的电平转换芯片,可以实现不同的通讯协议/接口,如RS232、RS485等,通过与模组的AT指令还可以实现蓝牙、wifi等通讯,所以学会单片机的串口很重要。我是小舒,和大家分享单片机串口的基本知识。一、什么是串口通讯?串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。典型的串口通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,所以端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶的校验。对于两个需要进行串口通信的端口,这些参数必须匹配,这也是能够实现串口通讯的前提。图1:串行通讯示数据传输意图二、串口通讯的通讯协议?最初数据是模拟信号输出简单过程量,后来仪表接口出现了RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能,这就促生了RS485。我们知道串口通信的数据传输都是0和1,在单总线、I2C、UART中都是通过一根线的高低电平来判断逻辑1或者逻辑0,但这种信号线的GND再与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。所以差分通信、支持多机通信、抗干扰强的RS485就被广泛的使用了。RS485通信最大特点就是传输速度可以达到10Mb/s以上,传输距离可以达到3000米左右。大家需要注意的是虽然485最大速度和最大传输距离都很大,但是传输的速度是会随距离的增加而变慢的,所以两者是不可以兼得的。三、串口通讯的物理层串口通讯的物理层有很多标准,例如上面提到的,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。在上面的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。下图为DB9标准串口通讯接口:DB9引脚说明:上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用"直通型"的串口线连接起来即可。串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。四、波特率波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示;比如波特率为9600bps;代表的就是每秒中传输9600bit,也就是相当于每一秒中划分成了9600等份。因此,那么每1bit的时间就是1/9600秒=104.1666...us。约0.1ms。既然是9600等份,即每1bit紧接着下一个比特,不存在额外的间隔。两台设备要想实现串口通讯,这收发端设置的波特率必须相同,否则是没办法实现通讯的。收发波特率一致可以实现通讯:收发波特率不一致,导致RX端不能正常接收:五、串口通讯的数据结构起始位: 起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步。数据位: 数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定。传输数据时先传送字符的低位,后传送字符的高位。奇偶校验位: 奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。停止位: 停止位可以是是1位、1.5位或2位,可以由软件设定。它一定是逻辑1电平,标志着传输一个字符的结束。空闲位: 空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充。六、单双工通讯单工: 数据传输只支持数据在一个方向上传输;半双工: 允许数据在两个方向上传输,但某一时刻只允许数据在一个方向上传输,实际上是一种切换方向的单工通信,不需要独立的接收端和发送端,两者可合并为一个端口;全双工: 允许数据同时在两个方向上传输,因此全双工通信是两个单工方式的结合,需要独立的接收端和发送端。七、STM32中的串口通讯STM32串口通信接口有两种,分别是:UART(通用异步收发器)、USART(通用同步异步收发器),对于大容量STM32F10x系列芯片,分别由3个USART和两个UART。TXD:数据发送引脚;RXD:数据输入引脚对于两芯片的间的连接,两个芯片GND共地,同时TXD和RXD交叉连接,这样两个芯片间可进行TTL电平通信。但如果对于芯片和PC机相连,除了共地条件外,不能使用如上的直接交叉连接,虽然两者都有TXD和RXD引脚,但通常PC机使用的是RS232接口(9针),通常是TXC和RXD经过电平转换得到,故如果要使芯片与PC机的RS232接口直接通信,需要将芯片的输入输出端口也电平转换为RS232类型,再交叉连接,二者的电平标准不同:单片机的点评标准(TTL电平): 5V表示1,0V表示0;RS232电平标准: 15/ 13V表示0,-15/-13表示1。因此单片机与PC机进行串口通信应该遵循:在单片机串口与上位机给出的RS232口之间,通过电平转换电路实现TTL电平与RS232电平间的转换.如果使用USB转串口也可以实现串口通讯,USB转串口电路图如下所示STM32串口通讯代码STM32中串口通讯已经给大家建好了相应的库函数,大家在使用和配置串口的时候直接进行调用库函数和配置就行了,请大家参照一下代码:1、初始化结构体代码typedef struct { uint32_t USART_BaudRate; // 波特率 uint16_t USART_WordLength; // 字长 uint16_t USART_StopBits; // 停止位 uint16_t USART_Parity; // 校验位 uint16_t USART_Mode; // USART 模式 uint16_t USART_HardwareFlowControl; // 硬件流控制 } USART_InitTypeDef;2、NVIC配置中断优先级NVIC_Configuration(void){  NVIC_InitTypeDef NVIC_InitStructure;    /* 嵌套向量中断控制器组选择 */  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    /* 配置USART为中断源 */  NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;  /* 抢断优先级*/  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  /* 子优先级 */  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  /* 使能中断 */  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  /* 初始化配置NVIC */  NVIC_Init(

    嵌入式ARM 单片机 串口通信

  • 自学编程,看啥?

    怎么算入门,我觉得可以入手做一些项目就算入门了。需要掌握至少一门编程语言,例如,C/C 或者 Java;需要学习数据结构与算法,至少掌握常见的数据结构与算法;需要学习数据库知识,因为做项目几乎离不开数据库,数据库必须掌握;掌握一门技能,例如后端开发、web 开发、移动端开发、人工智能等;当然还需要进一步精进,可以学习操作系统,计算机网络,计算机组织原理、汇编等相关专业课程。C语言刚开始就是泡书,然后就是抄代码,上机调试,模仿修改,看 n 遍,量变引起质变就会培养出编程思维!!!书C程序设计语言第一本书《C程序设计语言》,机械工业出版社,作者Brian W. Kernighan / (美)Dennis M. Ritchie。C 语言之父写的,入门经典书籍,建议大家作为 C语言入门的第一本书。C Primer Plus《C Primer Plus》 ,人民邮电出版社,作者 Stephen Prata。可以作为 C 语言工具书,也可以作为入门,内容循序渐进,能够锻炼编程思想。C和指针《C和指针》 深入了解指针,看完以后对指针不再害怕。C陷阱与缺陷《C陷阱与缺陷》 正如书上所说,“本书所揭示的知识,至少能够帮助你减少 C 代码和初级 C 代码中 90% 的 Bug”,看完后可以避免 C 语言开发的一些坑。C语言入门视频:《郝斌C语言自学教程》郝斌C语言自学教程https://www.bilibili.com/video/BV1os411h77o?from=search

    嵌入式ARM 编程

  • 嵌入式那么大杂烩,哪些方向比较有钱途?

    关注「嵌入式大杂烩」,选择「星标公众号」一起进步!来源 | 朱老师IT充电站昨天应邀发了个内推,今天来接着前天的话题说一下,当前乃至未来5-10年,嵌入式开发者还有哪些风口。开始之前先说一下风口的本质,其实就是一段时间的人才供需不平衡。说白了就是由于行业突变,突然爆发,敏锐的资本快速进入,导致短时间内行业大量扩张,需要大量开发者。但是人才不能瞬间大量产生,要慢慢去成长和转化的。所以短时间(一般一两年,乃至三四年五六年,很难超过10年)新的风口行业对人才的需求大于供给,招不到人怎么办?加钱啊!有个词叫“猪周期”,大家可以去了解下,其实是一样的道理。所以不得不感慨马克思的厉害,供求关系真的说透了市场经济的真理!所以我们要找风口,就得瞅那些行业会爆发,资本会涌入,懂的人少,人才供不应求的行业就肯定没错。这里还得综合考虑行业面临的宏观政策(譬如最近K12在线教育就被政策打击了,风口变成了深井)还得考虑存量技术人员数量(譬如鸿蒙应用开发,从存量安卓app开发者转就很容易,量又足,新进入者就机会不大肉不多)还得考虑风口涉及技术深度和难度有没有护城河,有些风口太好学了所以很快就过去给打成破烂了(譬如前几年的UI设计,电商设计等)。最后还得考虑风口和你以前的技术积累,项目经验等的关联性,不要跨度太大。有时候风口是真风口,但是和你之前做了多年的东西没关联,你去做没优势啊!以上是一些分析原则,讲出来是希望大家能有所思考,而不是只看结论。下面来说结论,逐一讲一下我认为的作为一个嵌入式软件工程师,未来5-10年有哪些风口。(1)智能网联汽车。这个前天已经说过了,不再赘述,写出来是为了完整。我个人认为这个风口不仅够大而且会持续10年乃至更久。最基本的原因就是“自动驾驶没那么容易实现”,只要产品还没做好,还有的创新,那么行业工程师就还有用,风口就还在。什么时候遍地自动驾驶汽车了,平均每人一台还多(就像现在智能手机普及度一样了),那么风就停了。(2)音视频。这个是前天文章后留言问的最多的一个,因为这个风口我们在前几年就出了海思项目课程,所以很多同学知道,甚至已经在学或者计划学完嵌入式linux核心课程之后去学。音视频相关的风口包括音视频采集和ISP处理,音视频编解码,音视频网络传输,音视频识别等。技术栈比较长,技术比较深度,所以行业生命周期和薪资都很不错。音视频为什么会成为风口?我认为有以下几个原因: 第一,大部分人更喜欢看视频,然后是音频,然后是图片,最后才是文字。所以你看抖音真火,微信都是发语音。第二,4G和5G提供了廉价且稳定随处可得的网络,抖音等提供了方便好用的软件工具,为音视频的生产和传播提供了必要条件。第三,音视频已经有了清晰的商业逻辑,直接说就是做这个商家有钱赚,为什么不做呢?(3)端侧AI。AI的部署有三种。云端,边缘端,终端。现在云端AI已经比较成熟大量应用了(譬如小度小度,天猫精灵这类),边缘端依赖于5G还在爬坡,而终端AI是正在快速突破未来有很大用武之地的AI实现方式。所谓端侧AI,就是将训练好的AI模型经过处理(简化,剪枝,量化等)后直接运行在终端MCU或者SoC内,利用本地cpu(或本地dsp,npu)算力,来执行推理,进行工作。最典型的案例就是关键词唤醒。端侧AI是嵌入式开发者的领域,是嵌入式软件系统在智能时代的进化方向,是嵌入式软件开发者必然需要接触的新技术,是程序驱动到数据驱动的转变在嵌入式开发中的直接体现。目前已经有不少AI框架在研究和逐步支持端侧AI了,譬如google的tensorflow lite和tensorflow lite micro,以及华为的mindspore lite(将来肯定也会有micro)。在芯片厂商这里,ST和NXP也都推出了自己的部分面向端侧AI的工具和demo。朱老师也已经在端侧AI领域做了一定研究和积累,后续会陆续推出系列学习课程和项目实战,帮助大家去抓取这个风口,敬请期待!(4)国产芯片相关嵌入式开发。自从2018年华为被制裁开始,中美科技争斗就注定不可能善了。半导体是我们的软肋,也是漂亮国重点打击我们的领域(所以各种缺货涨价)。而国家战略也很清晰,投入大量资源攻坚芯片,这也注定了国产芯片会不断崛起。这个过程会诞生大量机会,产生很多高端岗位,这也是近一两年大家都觉得工资涨了,而且年薪50-100万的岗位似乎变多了,不像以前那么遥不可及了的原因。芯片行业属于IT行业上游,价值很高,其实一直薪资很高。但是以前国内芯片都靠进口,上游都在国外,所以高端岗位(譬如芯片底层库开发,编译器工具链开发,IDE开发,操作系统开发等)也都在国外,所以国内嵌入式开发者以前都是下游产品级开发层面岗位,年薪到了30万左右再想往上就很难了。现在机会来了。国产芯片的崛起过程必然带来大量高端岗位需求,大家尽可以去争,这是属于我们的时代机遇。这就是国家说的产业升级,这就是破除内卷的正确方法。顺便说一句,大家都觉得互联网比嵌入式赚钱多,至少有一个原因就是因为中国的互联网行业一直是自己把持的,BAT都在自己的领域里击败了外资,守住了国门,所以这个行业的高端岗位都在国内,所以赚钱啊。而嵌入式行业,芯片相关的开发者,未来10年要去复制互联网行业过去十年的逆袭!写在最后: (1)以上写了4个我认为未来5-10年的嵌入式开发者相关的风口。仅代表个人观点,不一定完全对,欢迎大家评论区留言讨论。(2)有人可能疑惑怎么没有物联网?其实物联网并不是一个行业,而是一揽子综合技术。以上几个风口里其实都有物联网的影子。智能网联汽车本身就是个物联网设备,音视频的摄像头也是个物联网设备,端侧AI和芯片也大多都是物联网设备。可以这么讲,物联网是更基础层面的概念,是未来电子设备的基本属性,会无痕融入,根本都不必专门强调。

    嵌入式大杂烩 嵌入式

  • 实战CRC校验 | 固件如何校验自身完整性?

    来源:公众号【鱼鹰谈单片机】作者:鱼鹰OspreyID   :emOsprey在一些比较严格的行业里面,不是说你的程序能完成必要功能就可以,还需要添加一些额外的功能,比如最常见的看门狗功能,它可以在程序死机时完成重启,但也仅仅如此而已。很多异常它是无法检查的,比如程序偶然跑飞,ram 异常、flash异常等其他问题,只有程序hardfault或者其他严重问题导致程无法喂狗时才能起作用。所以有些产品为了保障安全,会增加安规代码,保证程序能够正常运行(UL/CSA/IEC 60730-1/60335-1 B类认证)。自检内容MCU 安全检查一般包括以下几个方面:1、CPU 自测(寄存器测试)2、系统时钟频率测量(保证时钟正常工作,不快也不慢,GD 芯片在短路晶振后,程序暂停运行,无法检查,但是 ST 芯片会自动切换到内部时钟,可以由程序检查这种异常)3、RAM 自检4、FLASH 存储器完整性检查5、独立看门狗、窗口看门狗检查6、安全相关变量检查7、中断检查8、I/O 口检查9、栈检查10、程序流程控制11、AD 口检查你会发现真要完成这份安规代码,难度不是一般的大,不过一般芯片厂商会提供相关参考例程和相关文档,但不是说有了这些资料就完全没有问题了。比如 ST 提供了一个参考例子,但是它使用的 HAL 库(事实上它还有标准库,当时不知道),如果原本程序用的标准库,那么就需要进行移植,这个工作量也不是一般大(首先要能理解程序,才能进行正确移植,而里面的逻辑还是很复杂的)。如果你不想移植,还有一个办法是使用 lib 库,就是将相关功能打包成一个库,虽然程序会大一些(毕竟很多底层代码和原来的重复了),但确实是比较简单的方法(前提是 flash 够大)。鱼鹰走的是第一条路,移植,并且将相关的底层代码提供了接口,这样不管是用标准库还是 HAL 库,只要自己实现这这些特定的接口即可完成。另外,参考例子只是实现了一个最基本的功能,在真正的产品不一定能适用。比如你的程序负载大,而里面为了测量时钟频率,几百微秒时间就要进入一次中断(即使是分频后),如果刚好在中断产生时,其他程序禁用了中断,运行这些代码有可能就会出现问题,很容易错过中断而导致复位。在我一开始移植的时候就是如此,在一个简单的程序里面可以正常运行很长时间,但是移植到产品工程里面,时不时出现时钟检查不通过的时候,导致程序不停重启,最终鱼鹰通过 DMA 传输的方式解决了这个问题,再也不会因为时钟检查不通过导致重启了。另外一个难点是对 .sct (分散加载)文件的理解,这个会在后面介绍。安规相关的内容实在是太多,要写的话可以写成一个系列了,如果各位道友感兴趣的话,多多转发支持一下鱼鹰,如果效果不错,鱼鹰会考虑完成后续的其它部分。(这里有一份比较全面但简单一些的参考文章可以看看 http://news.eeworld.com.cn/mp/STM32/a80041.jspx,只介绍如何做,没怎么介绍为什么这么做)资料ST 相关资料可以查看以下内容(www.st.com,下载时需要注册邮箱才行,鱼鹰公众号后台提供了部分资料,可自行领取)《AN4435 应用笔记》中文版,《AN277》(ROM Self-Test)STM8-SafeCLASSBhttps://www.st.com/en/embedded-software/stm8-safeclassb.htmlSTM32-CLASSB-SPL(基于标准外设库)https://www.st.com/en/embedded-software/stm32-classb-spl.html#tools-softwareX-CUBE-CLASSB(基于HAL库)https://www.st.com/en/embedded-software/x-cube-classb.html(不同版本有不同芯片,比如 2.2.0 版本的是 Fx 相关的,2.3.0 是H7、G0 相关的)当然国产芯片也一般会提供例程。本篇笔记只介绍其中一个内容,即 FLASH 检查,换句话说就是程序完整性检查。FLASH 检查我们以比较复杂的 boot app rtos ,开发环境 keil 、stm32f103 为例介绍相关知识。一般 boot 和 app 部分是用不同工程管理的,所以 app 部分代码只能检查自身的完整性,而不能检查 boot 部分。并且 app 的 flash 区也不是完全检查的,有一小部分是也没法检查的,但这并不影响它的功能(既然已经跳转到 app 里面了,那么 boot 部分 flash 即使在运行时有问题也不影响功能,而如果变量初始值的flash有问题就是关键变量检查的问题了)。现在就是如何检查的问题了。如何检查 | 基本原理校验手段有很多,比如 和校验、MD5 校验、CRC 校验,这里我们使用 CRC,因为一般芯片内部会内置该外设硬件计算(如果没有,可以纯 CPU 计算)。然后我们需要了解完整性检查的基本原理。所谓程序完整性检查,就是在下载代码前,先用工具把要校验的部分通过计算公式计算出一个值,保存在某个地方(flash),然后程序在运行的时候,自己也去读取要校验的 flash 部分,通过同样的计算公式计算出一个值,然后将这个值和保存在 flash 里面的值进行比较,就可以看出代码是否存在异常了,有异常及时处理,没有异常就继续重新检查。而检查分成两个步骤:1、开机时,一次性完成所有计算,保证运行前完整。2、正常运行时,定时计算,每次计算一个小块,当计算完最后一块时才比较结果,成功就重新继续计算,失败则终止程序运行,周而往复(计算需要较长的时间,分时计算可以不影响程序正常功能),这样可以保证程序在运行时也能检查 FLASH 的完整性,防止 FLASH 运行过程中破坏掉。现在有个问题,CRC 保存在何处才是合适的?随便保存在一个地方肯定是不行的。假设这个位置在要校验代码部分的里面,那么当工具计算这个值时,又会篡改掉校验部分里面的数据(因为你把 CRC 值放到里面了),那么你的程序校验时,肯定不通过,因为你读了一个被改变的 CRC 值。所以这个值一定要放在代码的最后面才行。另外前面说过,运行时会一小块一小块,所以要保证你的 CRC 值存放位置应该在小块大小的边界位置上。比如一次计算 16 字节,那你存放的位置应该是 16 的倍数才是正常的。所以,CRC 存放位置存在这两个限制。另外,如何提前计算好 CRC 的值呢?IAR 内置该功能,而 KEIL 我们可以借助强大的开源工具 SRecord《功能强大的 HEX 开源转换工具,你值得拥有》(一转眼,这篇文章差不多鸽了四个多月了)帮助我们计算。基本知识都了解的差不多了,接下来就是如何操作的问题。实操1、固定 CRC 位置。我们可以在启动文件的最后加入以下代码(END 前)这里默认是 0x3D334398,但会在后续修改成正确的 CRC 值;*******************************************************************************; User Checksum - must be placed at the end of memory;******************************************************************************* AREA CHECKSUM, DATA, READONLY, ALIGN=6 EXPORT __Check_Sum; Alignement here must correspond to the size of tested block at FLASH run time test (16 words ~ 64 bytes)!!! ALIGN__Check_Sum DCD 0x3D334398; ; Check sum computed externaly这里保证了 __Check_Sum 的地址是 2 ^ 6 大小对齐,所以你的计算小块可以这个大小,当然也可以小一些,比如 2 ^ 5 等。这样就可以将检查部分分成固定的小块,不会多,也不会少,刚刚好(必须)。那么如何将这个地址固定在代码最后呢?这个时候就需要我们的 .sct 文件发挥作用了(ClassB_stm32F10x.sct)。ER_IROM1 0x08000000 0x10000 { ; load address = execution address *.o (RESET, First) *(InRoot$$Sections) .ANY ( RO) *.o (CHECKSUM, Last) ;放置在最后 }我们用了 Last 将其放置在代码的最后部分,你想把它放置在 bin 文件最后面?暂时鱼鹰还没想到怎么做,有知道的道友可以告诉鱼鹰(通过 sct 的方式)。2、CRC 计算脚本在 windows 叫批处理,.bat ,我们可以在参考例程中找到。crc_gen_keil.bat我们需要需改三个位置第一个是你的计算工具的路径,里面应该要有计算工具。第二个就是你的工程名字,我们通过下面位置确定(鱼鹰用的 Main):最后是工程路径。一般在 Objects 文件夹里面,而 map 文件一般在 Listings 文件夹里面。说白了,这些变量就是为了让脚本能够找到 map、hex 文件和工具。但一般默认工程,这两个文件可能不在一个文件夹里面,所以我们可以对例子中的批处理文件 crc_gen_keil.bat 进行适当修改。map 文件的作用是为了让脚本能够搜索到 __Check_Sum 的地址,然后就可以计算 CRC 并修改 HEX 里面这个值了。另外还有新增了一个变量 HEX_ADRR,当我们的计算位置不是从 0x08000000 开始时(比如 app 起始地址在 0x08009000),我们就可以修改这个变量值。还有我们希望在计算完并修改 CRC 后可以自己生成 bin 文件方便我们更新固件,还需要加入转化成 bin 的命令。其中为了下载修改(CRC)后的 HEX 文件,我们还需要简单修改一下,用于判断工具是否存在,不存在,直接删除 hex 和 axf 文件(防止下载未修改的文件)。%xxx% 类似脚本中的 $xxxif not exist %SREC_PATH% ( echo %SREC_PATH% is not exit, exit echo ----------------------------------------del %INPUT_HEX% -- %AXF_FILE% --------------- del %INPUT_HEX% %AXF_FILE% exit)这样可以保证,一定能够正确下载 HEX 文件,而不是下载默认的 axf 文件。否则,下载的默认 axf 文件会因为 CRC 未修改,程序将不断重启。完整的修改(可以自行对比官方例程文件):@echo offECHO Computing CRCECHO -------------------------------------REM Batch script for generating CRC in KEIL projectREM Must be placed at MDK-ARM folder (project folder)REM Path configurationSET SREC_PATH=C:\SRECSET MAP_NAME=STM3210C_EVALSET MAP_PATH=STM3210C_EVALSET TARGET_NAME=STM3210C_EVALSET TARGET_PATH=STM3210C_EVALSET BYTE_SWAP=1SET COMPARE_HEX=1SET CRC_ADDR_FROM_MAP=1REM Not used when CRC_ADDR_FROM_MAP=1SET CRC_ADDR=0x08007ce0REM Derived configurationSET HEX_ADRR=0x08000000SET MAP_FILE=%MAP_PATH%\%MAP_NAME%.mapSET AXF_FILE=%TARGET_PATH%\%MAP_NAME%.axfSET INPUT_HEX=%TARGET_PATH%\%TARGET_NAME%.hexSET OUTPUT_HEX=%TARGET_PATH%\%TARGET_NAME%_CRC.hexSET OUTPUT_BIN=.\%TARGET_NAME%_CRC.binSET TMP_FILE=crc_tmp_file.txtif not exist %SREC_PATH%\srec_cat.exe ( echo %SREC_PATH% is not exit, exit echo ----------------------------------------del %INPUT_HEX% -- %AXF_FILE% --------------- del %INPUT_HEX% %AXF_FILE% exit)IF NOT "%CRC_ADDR_FROM_MAP%"=="1" goto:end_of_map_extractionREM Extract CRC address from MAP fileREM -----------------------------------------------------------REM Load line with checksum location to crc_search variableECHO Extracting CRC address from MAP fileFINDSTR /R /C:"^ *CHECKSUM" %MAP_FILE%>%TMP_FILE%SET /p crc_search=

    嵌入式客栈 固件 CRC

  • QT容器很香之QList实战举例

    [导读] 大家好,我是逸珺。今天来聊一下QList,QList 是一种QT容器,如果能熟练使用它,会非常香。什么是QList QList 是QT中通用容器类,它将对象存储在一个表中,该表提供基于索引的快速访问和基于索引的插入和删除。熟悉C 标准库的话,就类似于std:list ,为什么这里描述是跟了一个呢?因为是容器类,所谓容器,就把它想象成一个能装东西的框,但是这与现实生活中的框还是有区别的,现实中的框可以随便往里面装东西,先装几个土豆,再放两颗白菜,再放一本书....,随便装,只要放的下。但是,这个容器类跟的这个,是指泛型,从字面意思上看,好像也是什么对象都可以往里面放,但是这么几层需要理解:对于特定的容器,需要指明其可装进去的对象类型对于特定的容器,只能装指定的类型那么,为什么又说是泛型呢?就是说不同的QList对象,根据所指定的T的类型,可以装各自不同类型的对象,比如:QList m_list1;QList  m_list2;m_list1可以存float型的对象,而m_list2则可以装int型对象。这是怎么做到的呢,是C 编译器在编译期根据T本身类型编译绑定的。前面说QList是基于索引插入和删除的容器类,何以见得呢?来看看QT官方文档例子:QList list = { "one", "two", "three" };这意味着这三个元素是这样放的:实战例子 假设有这么一个需求,利用一个socket接收一个设备的计算数据,每一个计算数据是这样的:typedef struct _t_measure {  qint64 addr;  qint64 Real;  qint64 Imag;  qint64 rms;}t_measure;在类中加入QList,这里T是t_measure:QList m_measure;一个报文里面有多个测量结果,QT写的应用程序,需要一边收一边显示或者存储,接收可能是一个线程,或者sokect消息回调函数,比如是UDP接收的:connect(m_MeasureUdpSocket, SIGNAL(readyRead()),        this, SLOT(readMeasurement()));接收函数:#define MAX_BUF_SIZE        (300)#define MAX_BUF_SIZE_BYTES  (MAX_BUF_SIZE*8)void Measurement::readMeasurement(){  typedef union _u_buf {    char  buf[MAX_BUF_SIZE_BYTES];    qint64 dpts[MAX_BUF_SIZE];  }u_buf;  u_buf buffer;  t_measure *pRaw=nullptr;  int len = 0;  while (m_MeasureUdpSocket->hasPendingDatagrams()) {    len = m_MeasureUdpSocket->pendingDatagramSize();    if(len>MAX_BUF_SIZE_BYTES)       len = MAX_BUF_SIZE_BYTES;          m_MeasureUdpSocket->readDatagram(buffer.buf, len);    if(buffer.dpts[0]==0x7FAAAAF7CCCCCCCC) {      pRaw = (t_measure *)

    嵌入式客栈

  • 实战 | 动手撸个简单的LCD驱动框架~

    今天看到大佬肖遥兄分享的一篇文章:【架构篇】嵌入式编程中如何给代码的结构分层提到了高内聚,低耦合,软件分层等等的概念。之前又有小伙伴在后台留言说让我分享一篇这样的文章,所以今天它来了!废话不多说,理论讲太多没啥感觉,这些条条框框本质就是基于面对对象的设计模式相关的一些理论,设计模式就是前人实践多了发现一些规律然后总结出来的那么一套好用的框架,所以咱们直接出干货,硬肝!以小熊派上的SPI OLED驱动为例,将原来开发包里的LCD驱动做一些简单的改造,然后我们根据需求设计如下的驱动模型框架,分为模型、驱动、设备三个部分,我们先不考虑太细节的东西,也不会把这个东西一开始就做得特别复杂,这样不利于理解,于是我们构建如下的框架思维导图:1、LCD驱动框架数据结构框架提供一些什么能力呢?我是这么来做的,非常简单:这里提供了将驱动框架与驱动进行对接的能力,

    嵌入式客栈 LCD驱动

  • TinyML 适合单片机的机器学习

    作者 C. J. Abate(美国)译者 君谦机器学习(ML)作为人工智能的一个子类,在各个领域(包括大气科学和计算机视觉)都得到了广泛的应用。正如哈佛大学博士Matthew Stewart所说,tinyML 是一个新兴的发展学科,它能够在资源受限的微控制器上实现低资源消耗、低功耗的机器学习算法。 C.J.Abate:让我们从您的背景开始。您是什么时候对机器学习感兴趣的? 您是因为编程或硬件设计的背景而选择该领域的吗? Matthew Stewart:我的本科专业是机械工程,这给了我一些编程和机电一体化的经验。但是,直到进入哈佛大学,我才开始学习机器学习。在博士学位研究的第一年,我参加了哈佛大学的数据科学入门课程,激起了我对机器学习的兴趣,那时我意识到了机器学习的巨大潜力,无论是一般性的应用,还是专门用于大气研究的。 Abate:是什么使您进入哈佛大学的? Stewart:显然,哈佛大学是世界上顶尖的研究机构之一,在这里学习是许多富有热情而努力的学生的目标。我的老师的研究兴趣也吸引了我,他们使用无人机研究了热带亚马逊雨林。在获得机械工程学位的过程中,我对转向环境科学产生了兴趣,因为对我来说,越来越明显的是,现代时代定义的大多数工程问题将是环境问题,即气候变化、能源安全和可持续性。根据我的兴趣和工程背景,这项关于亚马逊雨林无人机的工作似乎是理想的,是来哈佛的主要刺激因素。 Abate:作为一名环境科学家,您如何使自己了解嵌入式系统和编程? 要紧紧掌握Al领域的所有新发展以及传感器技术,嵌入式系统等方面的创新一定很困难。您是如何了解这些不同学科的? Stewart:这些领域不断地迅速发展,对许多研究生和学者来说,这是一个非常现实的问题。就个人而言,我使用了几种资源来保持学科信息的更新。首先,Twitter可以成为发现该领域其他学者发表的新研究的好平台。我也是一些Slack频道的粉丝,在该频道中,同事定期共享有关相关主题的新闻和研究文章。我还定期回顾发表在相关期刊上的新论文,以寻找任何特别引人注目和值得详细阅读的东西。幸运的是,大多数已发表的作品与我自己的研究没有什么关系,而更广泛的趋势往往是大学内各部门和兴趣小组进行的研讨会演讲的主题工作。 Abate:虽然几个月前我在一次DanielSitunayake的采访中提到了细节,但对Elektor全球社会的许多工程师来说,这仍然是一个新的主题。您如何定义tinyML? 它是否是在边缘微控制器上运行机器学习应用程序的一种最基本的方法? Stewart:是的,这实际上就是我们的目标。tinyML不是一种特定的技术或一系列的原则,确切地说,它更像是一种涉及计算机架构、性能工程和机器学习领域协同作用的重要学科。其首要目标是在资源受到限制的微控制器上实现快速、低资源和高效的机器学习算法。这还可能涉及到为特定任务开发定制的硬件,开发专门为资源约束设计的新算法或新的工具来移植算法,或是优化各种硬件架构的性能。本文提出了一个有用的指导方针,将tinyML作为机器学习的应用程序应用到小于1 MB的随机存取内存和功耗低于1 mW 的微控制器上,但这绝不是一个严格或详尽的定义。 Abate:需要明确的是,我们并非在讨论像NVIDIA 和树莓派这样的设备,而是关注受资源限制的设备(即小于1 mW 和千字节,而不是兆字节),对吗? Stewart:是的。像树莓派和NVIDIA这些设备并不是tinyML的重点,也不是与自动驾驶技术相关的应用,这些场景通常都需要较多的计算资源。我们研究的重点是“资源约束”。对于tinyML,我们必须就如何有效地优化算法的性能做出明智的决定,以便适应应用程序和硬件特定的限制。 例如,在某些应用中,必须同时具有快速推断和高精度性能,以提高推断速度,我们可以使用8位算术代替浮点算术,但这会影响算法的准确性,也将影响算法所需的内存和计算资源。这个示例有助于理解为什么我将tinyML视为一门原始工程学科,因为我们更多考虑的是必须满足需求,但往往是这些要求都存在直接竞争,因此必须进行平衡。 Abate:您能提供一些实际应用的例子吗? Stewart:实际上,已经有一些在智能手机中使用tinyML的例子。其中一个重要的例子是关键词发现,它涉及检测诸如“Hey Siri”和“Hey Google”之类的单词。如果智能手机使用CPU 连续监测麦克风并检测到这些单词,那么手机电池只能使用几个小时。相反,一个轻量级的数字信号处理器能够持续检测这些单词。当有人提及关键词时立刻唤醒CPU,并验证是否来自已知的麦克风,然后等待其他的语音输入。 还有一个例子存在于智能手机中,用于监测用户何时拿起手机。来自车载惯性测量单元和陀螺仪的数据被持续监测,当用户拿起他们的手机时,一组信号会通知设备、唤醒CPU。 另一个有用的例子是人体检测,连接到相机的微控制器可以检测个体的存在。例如,检测用户是否佩戴口罩,这在目前疫情大流行期间特别实用。异常检测可能成为工业中的一个重要用例,来自重型机器的信号可以被连续监测,实现设备的异常检测功能。 Abate:在2019 年,您发表了一篇引人入胜的文章———“科学研究中的机器学习危机”,探讨了机器学习是否会导致科学中的“可再现性危机”的问题,例如,如果科学家在实验中使用了知之甚少的ML算法,这可能意味着其他科学家无法重现这些原创性研究成果,甚至非专业人士也可以在那里发现问题。我认为机器学习与统计数据的争论在过去一年中愈演愈烈。您现在如何看待这一问题? Stewart:我认为这在学术界仍然是一个重要的问题。我在此主题上发表的文章是针对可再现性危机的,该危机首次由哈佛商学院前教授Amy Cuddy在功率主题方面所做的一些工作上的争议中引出。 Andrew Gelman撰写了一篇有影响力的论文,谴责心理学领域的不良研究实践,包括使用P图等技术进行虚假的数据分析和挑选数据来产生具有统计学意义的结果。这产生了一系列旨在再现心理学文献中的一些重要结果的实验,其中许多是不可再现的。这暴露了研究过程中的一个缺陷,即可再现性研究通常没有资金资助,因为它们被认为是不必要的并且浪费资源。从这时起,可再现性研究危机也被发现影响到其他领域,包括文学和经济学。 自然,这种对研究过程完整性的破坏导致对使用大数据集和机器学习的担忧。给定数据集中足够多的变量,最终不可避免地会出现一些具有统计意义的结果。这表明虚假数据将更容易找到,但是只有在实验被设计为专门测试该假设而不是同时进行多个假设的的情况下测试才是有效的,所以大数据可以更容易用数据进行“欺骗”。而对于机器学习呢? 机器学习的使用使它更容易“隐藏”作弊。许多机器学习算法的可解释性降低,而且许多研究社区缺乏机器学习背景,因而在发表的研究中很难发现这些问题。幸运的是,解决这个问题的方法非常简单———资助可再现性研究,并对研究人员关于实验的正确设计和机器学习在研究中的应用进行培训。 Abate:您在文章中提出了一个有趣的观点———“机器学习算法的另一个问题是算法必须做出预测,而不能说我什么也没找到”。听起来机器学习并非总是有效。 Stewart:虽然我同意机器学习不适合完成一些任务,但我不认为是由于这个原因。例如,由任务转换为二元分类问题所提出的问题之一,它们实际上可能不能被最好地总结出来,从而导致错误的二分法;在某些情况下,它可能更适合对靠近决策边界的数据进行分析,而不是让算法做出一个明确的决定。这种类型的决策有时被称为“人类循环决策”,在所做的决定有重要影响的情况下,它将最有用,比如决定是否提供贷款或是否患有癌症。 Abate:您认为在tinyML的哪些行业中会有巨大的创新机会? Stewart:总的来说,我认为在这一领域工作的许多人都在期待tinyML可以引发一场新的工业革命。出于这个原因,一些人开始将这个新设想的工业阶段称为“工业4.01阶段”。在这个阶段,任何使用大量loT设备的行业都将因使用tinyML 而受益匪浅,包括减少了与tinyML相关的功耗和网络负载。 更具体地说,某些行业可能会从tinyML提供的新功能中获得更大的好处。农业就是一个很好的例子。在农业中使用tinyML可实现智能感应功能,而无需连接到电网,这可以帮助确定某些作物何时要收获或需要额外的肥料或水。 另一个很好的例子是重工业,正如前面提到的那样,通过使用异常检测进行预测维护可以节省成本和提高效率。预先发现大型机械的运输问题可能比灾难性故障更便宜,生产力损失也更小。 Abate:那么那些对开发节能计算解决方案感兴趣的公司呢? Stewart:苹果和ARM 可能是目前最大的专注于节能计算的公司。高性能和高效架构的开发在智能手机中至关重要,不仅可以延长手机电池寿命,而且能够增强功能、提升运行速度。近年来,我们看到移动架构在性能方面功率效率大幅提高,而英特尔等竞争对手的传统架构则相对停滞不前。因此,移动体系结构现在不仅可以与更传统的体系结构相媲美,还有几个独特的优点,包括功率系统的高效率。最近,苹果公司对外宣布了最新基于ARM 的M1芯片,声称它将提供Mac电脑有史以来最长的电池寿命。苹果的这一举动被一些人视为计算行业的一个分水岭,未来几年将在社区中产生连锁效应。 Abate:请介绍一下您在无人机和化学监测系统方面的工作。tinyML在您的研究中扮演什么角色? Stewart:目前,使用tinyML进行一些微无人机应用的工作已经发布。这样做的重点是创造能够借助嵌入的强化学习方法实现智能导航的轻量级无人机。这对于室内和室外应用中检测气体泄漏或定位污染物排放源等可能非常有用。 对于更广泛的化学监测系统,tinyML可以提供创建与电网断开的远程定位传感器网络的能力,以及更智能地使用化学传感器信息。例如,该系统可以被设计为只关注异常数据,而不是连续地向云服务器传输数据。这将减少通信系统上的网络以及与执行持续监控相关的功耗。随着设备数量的指数级增长,近些年来这些方面将变得越来越重要。 Abate:您的文章和研究很可能会激励许多人更加投入地研究tinyML。专业工程师和电子爱好者或许想了解更多关于这个主题的知识。除了PeteWarden和DanielSitunay这样的书外,您还可以推荐一些其他资源吗? Stewart:不幸的是,尖端技术的一个缺点是往往只有少数可用的资源。话虽如此,我们还是开始看到同行中有人定期发布关于tinyML的文献,其中相当一部分是发表在预印服务器arXiv上的。我猜测很快就会有几家期刊专门关注这个话题。另一个资源是由TinyML基金会于2021 年3 月发布的tinyML 研究研讨会(https://www.tinyml.org/researchsymposium2021/),我们可能会看到一些令人兴奋的最新进展! 相关链接[1] Machine Learning (Elektor):www.elektormagazine.com/tags/machine-learning.[2] C. Abate,"TheFuture of Machine Learning:An Interviewwith Daniel Situnayake/", ElektorMagazine.com,8/26/2020:www.elektormagazine.com/mlsitunayake.[3] M. Stewart,"TheMachine Learning Crisis in ScientificResearch/",TowardsDataScience.com,11/18/2019:http://bit.ly/ml-crisis-stewart.[4] Cornell University,"Hardware Architecture",arXiv.org:https://arxiv.org/list/cs.AR/recent.本文授权来自本刊的合作伙伴Elektor媒体集团,如果希望免费订阅Elektor 的英文在线内容,请访问https://www.elektormagazine.com/。—— The End ——

    嵌入式客栈 机器学习

  • 介绍一些认真分享的朋友

    介绍一些认真分享的朋友,平时也经常会与他们在网上相互交流。有的专注于硬件,有的专注Linux,有的做应用多一些。有兴趣去读读他们分享的技术文章,关注一波吧txp玩Linux 参与过技术书籍的编写,一个痴迷音视频的后浪!主要分享音视频、流媒体相关知识,如果对音视频感兴趣的朋友可以关注他哦!可以领取音视频相关学习资料!同时有任何问题都可以加他个人微信交流,从 2020 至今,至少交流过 100 个以上的应届生毕业生 offer 选择问题,同时还有关于如何转行、书籍推荐、学习路线、面试、租房、相关音视频技术等话题!下面是他的个人微信:tu18879499804相关音视频文章:流媒体面试被问到的一些问题汇总!音视频学习路线!记得诚 学电子,且看记得诚,号主诚哥,CSDN博客专家,博客之星TOP30,就职于某知名大厂,资深硬件工程师,乐于分享电路设计、PCB设计、电子元器件、电子电路等知识。    写了一些还不错的专栏,值得关注:「专辑」电子元器件「专辑」电路设计「专辑」PCB设计「专辑」通信总线关注记得诚,查看更多精彩内容,一起学电子,不枯燥。IOT物联网小镇 号主:道哥,十多年的嵌入式开发老兵,专注于嵌入式 Linux 领域,玩过单片机、搞过智能家居、研究过 PLC 和 工业机器人,项目开发经验非常丰富。    他的文章主要包括 C/C 、Linux操作系统、物联网、单片机和嵌入式这几个方面。厚积薄发、换位思考,以读者的角度来总结文章。每一篇输出,不仅仅是干货的呈现,更是引导你一步一步的深入思考,从底层逻辑来提升自己。文章汇总:【1】C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻【2】原来gdb的底层调试原理这么简单【3】内联汇编很可怕吗?看完这篇文章,终结它!其他系列专辑:精选文章、Linux操作系统、应用程序设计、物联网、C语言  点击下方名片关注公众号,一起共同进步! 嵌入式与Linux那些事 公众号【嵌入式与Linux那些事】,号主,CSDN博客专家,爱好跑步和打篮球。在2020年秋招中顺利拿下oppo,小米,兆易创新,全志科技,海康威视等十余家公司的Offer。从简历书写到笔试面试,详细总结了14W字 的内容分享给大家,在公众号回复【offer】即可获得。  公众号主要分享计算机基础,操作系统,数据结构与算法,C/C ,Linux驱动,单片机等相关内容。每周坚持推送高质量原创文章。欢迎大家关注我的公众号,一起学习交流!  文章汇总:  计算机基础文章汇总  笔试面试文章汇总工程师进阶笔记 公众号:工程师进阶笔记,号主温工,从事嵌入式物联网技术开发多年,会画板子,能拿烙铁,专业写代码,热衷于技术分享和职场提升。从大学毕业到现在,待过民企、外企、上市公司,从刚毕业实习进工厂画板子拿烙铁,再到敲键盘复制粘贴写代码,再到现在逐渐摆脱技术思维学习各种管理知识。从业经历:聊一聊我自己的从业经历和感悟致力成为一名终身学习者,有一点技术强迫症,在分享技术的同时,也分享自己对生活和职场的思考和见解!工程师进阶笔记 | 原创技术专辑汇总,可供下载。▼点击下方名片关注公众号▼

    嵌入式客栈

  • 图解USB标准之架构概览

    关注、星标嵌入式客栈,精彩及时送达[导读] 大家好,我是逸珺。前面写了一些SPI/I2C/RS-485之类的文章,有朋友留言希望能分享一些USB方面的梳理总结,今天就从系统标准层面先来梳理一下。看看有没有朋友喜欢。先从系统层面来梳理。个人学习,习惯于先从整体上摸个大概,然后再对感兴趣的细节逐渐深入。USB是比较复杂的协议栈,如果发现文章中有错误,请帮忙指正。注:本文主要参考USB2.0规范第4章,将标准中个人认为比较重要的一些点尽量条理清晰的总结出来。我感觉很多朋友可能对于阅读英文标准有点轻度抗拒,所以整理此文这也是一个起因,希望对朋友们有所帮助。总线拓扑 说到总线拓扑,这张图大家一定都见过:USB标准上说USB总线拓扑是一种分层星形结构,这张拓扑图延申出来的一些要点:所谓星型是针对Hub而言的,一个Hub下面可以挂Hub或者设备,最顶层就是USB主机控制器USB主机控制器一般都伴随有一个根集线器Root Hub。Hub级联最多5层总线上理论最大允许连接127个设备。Hub级联遵循向下兼容,USB2.0主机或者高速Hub可以连接USB1.1Hub。一个USB分层星型结构有且仅有一个USB主机控制器线缆最长不超过5米这个最大7层星形结构,代表的是一条USB总线,一个USB分层星型结构有且仅有一个USB主机控制器,但并不是说一台计算机就只有一个USB总线,比如我的计算机内部就是2个USB主控制器 Root Hub,从Windows设备管理器可以看到:7层拓扑图中的第2层只画了一个Hub,并不意味真正的第2层就只能有一个Hub,但这个图无法显示出更为详细的总线连接关系,用USBTrace软件来看看:第1条总线有4个端口,第2条总线的根集线器具有18个端口,其中8、9、10为计算机内部的USB设备占用了。我这台笔记本对外有两个USB接口,通过分别将U盘插入这两个端口,再利用USBTrace探测可以推断出这两个端口都属于第2条总线的Port 3以及Port 4:那么Hub长什么样呢?比如下面是一个7口的USB Hub示意图,来源于USB2.0标准:物理接口 电气概览USB 通过四线电缆传输信号和电源。信令发生在每个点对点网段上的两条线上。VBUS/GND:供电D /D-:USB差分信号线。具有三种数据速率:高速模式 high-speed:480 Mb/s,常缩写为HS模式全速模式 full-speed:12 Mb/s,常缩写为FS模式低速模式 low-speed:1.5 Mb/s,常缩写为LS模式至于数据编码模式,这里先不管它。机械概览机械部分主要定义USB采用什么尺寸的接插件,线缆的颜色定义、线号。线缆的抗拉强度等。主要从以下几个方面去标准化:主要连接器类型规范,主要分A、B系列。定义了公头、母头。线缆规范。高速/全速电缆由信号双绞线、VBUS、GND 和整体屏蔽组成。当高速/全速电缆与低速设备一起使用时,电缆必须满足所有低速设备要求。低速设备可以不使用双绞线。双绞线可有效抵抗共模噪声。连接器机械尺寸及材料要求。连接器脚号信号名线芯颜色1VBUS红色2D-白色3D 绿色4GND黑色外壳屏蔽屏蔽层A/B系列插座规范A/B系列插头规范电缆尺寸材料规范,这里就不罗列了,知道在哪里查就可以了。电气、机械和环境合规性标准接地规范,屏蔽层一定要焊接在插头的外壳接地点。插座PCB尺寸规范。所以对于有绘制接插件需要的,可以参考6.9节的尺寸。Logo位置线芯颜色规范。USB Logo尺寸规范。协议概述 USB采用主从通讯模式,是一种轮询总线。所有数据传输都由主机控制器发起。这是USB标准中最难啃的部分,这里先不总结。健壮设计 标准关于协议健壮性,又称鲁棒性,做了这几个方面的设计:从信号完整性角度:使用差分驱动器、差分接收器和以及对信号线缆的屏蔽处理。差分收发策略主要在抵抗共模干扰方面效果显著,而屏蔽层则有两方面的作用:其一,有效降低USB线通过无线电波对外界干扰;其二、能有效隔断外界无线干扰对USB信号线、电源线的干扰。CRC报文校验。报文中数据如果出错,可以检测出来,可以做相应的处置。热插拔检测及对相应硬件设备的系统配置管理。这个设计有助于提升用户体验,用户随用随插,而无需关机插拔。利用对数据丢失或数据损坏超时检测实现通讯自恢复机制,以增强协议的健壮性。对流数据的进行流量控制以确保同步以及底层收发硬件缓冲区管理。数据管道和控制管道分离配置管理 USB支持热插拔,所谓热插拔就是,设备插入,系统需要正确识别设备加载驱动程序,断开后,系统需要从软件层面识别到设备已经从总线上移除了。这里所谓的系统,有可能是带操作系统的计算机,也有可能是不带操作系统的嵌入式设备。比如下面这个U盘插入移除的过程:连接检测所有的USB设备都必须经过集线器上的USB端口连接到总线。从总线拓扑图可以看出,总线上有一个主控制器,位于金字塔的顶端。上面动图中也可以看出,即便是计算机内部USB设备也是经由Hub的端口连接到总线的,现在的计算机内部很多设备也会采用USB总线进行互联,比如内置的蓝牙设备。主机控制器位于顶端,设备是经过集线器的端口连接到总线,那么主控制器怎么知道设备插入呢?这是由于集线器具有用于报告USB设备在其端口之一上的连接或移除的状态位。主控制器查询集线器检索这些状态位。在设备插入时,主控制器启用端口并通过设备的控制管道在默认地址对USB设备进行寻址。主机为设备分配一个唯一的USB地址,然后确定新连接的USB设备是集线器还是功能设备。主机使用分配的USB地址和端点编号0为USB设备建立其控制管道的端点。如果新连接的USB设备是集线器,如果这个新连接的集线器的端口上有USB 设备,则对每个连接的USB设备执行上述识别操作。如果连接的USB设备是一个功能设备,则连接通知将由适用于该功能的主机软件处理。如果是基于通用操作系统的计算机系统,则由一般驱动程序处理,如果主机控制器是单片机类嵌入式设备,则由单片机程序负责处理。断开检测同样移除时,从标准设计角度来看,也需要考虑两种情况。如果是设备从集线器移除,集线器会禁用该端口并向主机提供设备移除的指示。然后主机控制器从软件层面做相应的移除处理。如果是集线器移除,需要从软件层面移除该集线器所有端口的USB设备或级联集线器,当然如果集线器又连集线器,则有点递归的意思。总线枚举总线枚举是主控制器识别连接到总线的设备并为该设备分配唯一地址的活动。由于USB允许USB设备随时连接到USB总线或从USB总线断开,因此总线枚举是 USB系统软件的持续进行的过程。USB总线枚举还包括移除的检测和处理。传输模式 USB利用单向或双向管道在USB主机控制器和USB设备之间进行应用数据和功能数据传输。管道Pipe是一个底层软件及硬件逻辑概念,数据就像水一样从管道中的一侧流向另一侧,就对应着主机控制器与设备的两个端点endpoint。endpoint就像管道的两头,也是软件逻辑概念。将主机与设备侧的端点逻辑关联起来,就是所谓的管道了。当然这管道之所以能传输数据,是因为主端、设备端两侧相应的代码配合芯片内部硬件实现的。数据流经由一侧的端点通过逻辑管道传输到另一侧端点,USB架构包含四种基本类型的数据传输:控制传输批量传输中断传输同步传输下表是这四类传输在不同速度模式下支持的最大包长度,放在这里有一个整体概念:速度模式低速全速高速控制传输88/16/32/6464同步传输不支持10231024中断传输0~80~640~1024批量传输不支持8/16/32/64512控制传输控制传输,主要用于在设备首次连接时配置设备;并可用于其他设备自定义的传输目的,比如控制设备上的其他管道。USB系统软件在设备首次连接时使用控制传输进行设备配置。其他驱动程序软件也可以选择以自定义方式使用控制传输。控制传输主要使用管道0,数据传输是无损的。每个USB设备都必须有控制端点,支持控制传输来进行命令和状态的传输。此外,控制传输是双向传输。批量传输批量传输Bulk Transfer就像其名字一样,数据量相对较大,具有突发性。这种突发性可能来源于用户对USB设备的操作,比如对U盘的读写操作就会触发批量传输。批量传输这种突发性也就意味着是非周期性的,一般用于没有实时性要求、数据量比较大设备。比如用于打印机或扫描仪的数据。批量传输数据是连续的。通过在硬件中使用错误检测并采用前面所说的错误重传机制,可以在硬件级别确保可靠的数据交换。此外,大量数据占用的带宽可能会有所不同,具体取决于其他总线活动,这是由主机控制器动态仲裁管理的。批量传输是单向的,使用单向大容量端点来实现。中断传输一般用于需要实时可靠的传输场景。此类数据可随时由设备传输,并以不低于设备指定的速率进行传输。中断数据通常由一个或多个字节的事件通知、字符或坐标组成。比如USB鼠标就是一个采用中断传输的实例。同步传输占用预先约定好的USB带宽以及传输延迟,也称为流式实时传输。所需要的带宽以及延迟要求,与特定设备的相关数据吞吐率以及端点的缓冲管理有关,比如用于音频会议USB耳麦,对于音频的采样率是有参数要求的。带宽分配USB标准定义了如何允许每种传输类型访问总线的规则。带宽分配主要在从两个方面进行规定:带宽在管道之间分配。当管道建立时,USB会为一些管道分配带宽。USB底层软硬件需要提供数据缓冲,带宽需求大的场景需要提供更大的缓冲区。带宽可以在许多不同的数据流之间分配。从而能实现将各种设备连接到USB总线。此外,可以同时支持具有宽动态范围的不同设备比特率需求。所谓宽动态范围是指其带宽需求是随着使用场景在动态变化的。好了,先总结这么多,继续慢慢啃~。—— The End ——

    嵌入式客栈 USB

  • 看完这篇你还能不懂C语言/C 内存管理?

    C 语言内存管理指对系统内存的分配、创建、使用这一系列操作。在内存管理中,由于是操作系统内存,使用不当会造成毕竟麻烦的结果。本文将从系统内存的分配、创建出发,并且使用例子来举例说明内存管理不当会出现的情况及解决办法。一、内存 在计算机中,每个应用程序之间的内存是相互独立的,通常情况下应用程序 A 并不能访问应用程序 B,当然一些特殊技巧可以访问,但此文并不详细进行说明。例如在计算机中,一个视频播放程序与一个浏览器程序,它们的内存并不能访问,每个程序所拥有的内存是分区进行管理的。在计算机系统中,运行程序 A 将会在内存中开辟程序 A 的内存区域 1,运行程序 B 将会在内存中开辟程序 B 的内存区域 2,内存区域 1 与内存区域 2 之间逻辑分隔。1.1 内存四区在程序 A 开辟的内存区域 1 会被分为几个区域,这就是内存四区,内存四区分为栈区、堆区、数据区与代码区。栈区指的是存储一些临时变量的区域,临时变量包括了局部变量、返回值、参数、返回地址等,当这些变量超出了当前作用域时将会自动弹出。该栈的最大存储是有大小的,该值固定,超过该大小将会造成栈溢出。堆区指的是一个比较大的内存空间,主要用于对动态内存的分配;在程序开发中一般是开发人员进行分配与释放,若在程序结束时都未释放,系统将会自动进行回收。数据区指的是主要存放全局变量、常量和静态变量的区域,数据区又可以进行划分,分为全局区与静态区。全局变量与静态变量将会存放至该区域。代码区就比较好理解了,主要是存储可执行代码,该区域的属性是只读的。1.2 使用代码证实内存四区的底层结构由于栈区与堆区的底层结构比较直观的表现,在此使用代码只演示这两个概念。首先查看代码观察栈区的内存地址分配情况:#includeint main(){ int a = 0; int b = 0; char c='0'; printf("变量a的地址是:%d\n变量b的地址是:%d\n变量c的地址是:%d\n", 

    嵌入式客栈 内存管理

  • 深度!一位十年老电子工程师想对后辈说的深心话!

    当电子工程师也是十余年了,不算有出息,环顾四周,也没有看见几个有出息的!回顾工程师生涯,感慨万千,愿意讲几句掏心窝子的话,也算给咱们师弟师妹们提个醒,希望他们比咱们强!1、电子新手“没事做,没人教,工作没有技术含量”的矛盾心态电子新手往往心浮气躁,拒绝进步,拒绝沉淀,害怕丢脸。我不怕丢脸时刻:记住每一个让你丢脸的人,他们是你的贵人。我感激那些给他难堪的人;我感激那些给他启发的老师;我感激当面给他扔臭鸡蛋的人;我时刻反省并不断地提高自己。电子研发工作上的时忙时闲,是很正常的事情。缺乏对电子行业的整体认识让新手觉得没有事情做;缺乏与同事的良好沟通让新手没有人去教;缺乏对工作的深入分析让新手觉得没有事情做。学会找事情做,虚心诚恳地去观察,去问问题,就可以摆脱“没事做,没人教”矛盾心态。我就是这么一步步过来的。2、大城市与小城市的电子工程师那个更好北上广深是四个电子行业最集中的城市,工作机会很多,不少跨国公司的研发中心或总部大部分在这四个城市。大城市房价贵,交通费用高,工作节奏快,压力大,但选择的余地也大。小城市除了工作外,则更适合生活。我早期在一个小城市,能够走路15分钟上班,坚持每天早上去晨泳,春夏秋冬从不间断,2006年阴差阳错的来到了上海的市中心上班一直到现在。总体来说,大小城市各有各的好处,都是一种活法。如果你看中工作,看中事业,大城市机会多,可能更适合你;如果想找更适合生活的地方,可以选择去小城市发展。3、大公司与小公司的电子工程师那个更好电子新手在刚开始工作的时候尽量选择大公司。大公司稳定,里面积淀的电子高手很多,有更多机会去学习技术,同时学习他们的为人处世之道。如果能进入外企待3到5年更好,完整的工作流程及鲜明的企业文化可以塑造你的好习惯,让你一辈子受益无穷。在珠三角,我在一家大公司工作,里面有50多位电子研发工程师;到上海则是进入一家国际性的大公司,里面的硬件、软件系统的高手更多,不少是从IBM、GE等跳槽过来的,海龟、博士也一大把。不过,个人能力到了一定的程度也许可以去小公司,那将会是另外一片天空。4、偏硬件与偏软件的电子工程师那个更好一般来说,同样长的工作年份,偏软件工作的工资比偏硬件的稍微高一些;在数量上,偏软件的职位会比偏硬件的职位多;偏软件的职位在行业经验上的积累会影响职位的跃迁;偏硬件的长远来讲更有发展前途,更方便以后转行,而且可以寻找到更多乐趣;真正的高手是软硬兼通的。我在一度在偏硬偏软中徘徊,艰难的勉强的选择了偏硬,发现还真适合自己。5、电子技术学习该Focus深度还是Focus广度纯粹的高深技术,并不能够给你带来财富。有不少电子新手,总以为学会了ARM、FPGA,会绘制10层或更多层电路板,就一定可以带来高薪,其实不然。技术是相通的,全身心的投入聚焦去学单个的技术都很容易。把握当下和行业特点,结合实际的去钻研技术才最稳妥。上周在上海金桥陪一位前同事吃饭,在聊到技术是应该专注于深度,还是广度的时候,他说“太多的高深技术在睡觉。深度不一定有用,广度也不一定有用,能够商业化并市场化的技术最有用。”6、与人沟通与技术精通,对电子工程师那个更重要不少工程师一味的专注技术,忽视了与人沟通的重要性,长时间得不到公司的重用;更多的工程师以为掌握了热门了技术,如智能手机,无线通信等,就一定能够改变他们的生活,让他们活的更有成就感。其实,结合自身的实际去专注在自身的行业核心技术的掌握,不断更新自我观念,提高自身修养水平,反省与人打交道的方式方法,这样一个电子工程师才有更好的前景。很多时候,与人沟通比技术精通对一个电子工程师更重要。7、如何成为电子工程师高手电子工程师的工作就是将一堆器件搭在一起,注入思想(程序),完成这些器件分离时无法完成的功能,做出一个能够商业化的成品。技术高手需要持续的积累。学习态度重要,学习的方法重要,学习的环境及好师傅带更重要,自行总结自行去悟最重要——也就是在掌握一定的基础知识后,不断领悟。专注在一个行业,准备好奋斗十年,或至少3~5年来掌握该行业的核心技术;勤于思考,要常常有灵机一动感觉;勤于动手,干什么像什么,能发现并对粗制滥造深恶痛绝,对精致严谨一往情深,相信数年之后你一定成为电子高手。8、什么样的电子工程师最吃香电子工程师的综合素质在普通提升。精通英语或者其他的第二外语,计算机操作非常熟练,善于与人沟通,在一个领域有所建树,对电子行业系统有比较充分的了解,并能持续不断学习的电子工程师最吃香。也就是说,“多面手电子工程师”最吃香。做合适的项目,遇到合适的上司,从技术走向高层,往往是可欲不可求的。能否进入到心仪的公司除了自身的努力之外,缘分是很重要的。9、技术深度发展转行的途径是什么从硬件或者软件,升级为做固件工程师;从固件工程师,升级为系统架构工程师;从硬件转为软件,从软件转为测试;电子工程师根据实际的情况和个人的兴趣爱好,看中时机转行说不定发现另一个天空。我身边就有不少同事,转行很成功。一位同事从嵌入式软件工程师转去做测试,并成为这个嵌入式软件测试领域的高手,在公司得到重用。10、放弃技术转行的途径是什么试着想想电子产业生态系统的每一个环节,想想是否有合适自己的位置?从电子工程师转行做市场,从电子工程师转行做管理,从电子工程师转行做生产、质量管理……,这些都是路。高中同学从市场转到做海外市场的有几个,遨游在孟加拉,俄罗斯,有一个还当上了区域市场经理。转行做管理是一条最容易想到的路,但往往可遇不可求,僧多粥少。从电子工程师转行的途径还有很多,需要根据自身和行业的情况进行选择。11、电子行业的趋势是什么电脑、汽车、家电、通信、工业、交通、航空、多媒体音频视频、医疗、电源、微电子,每个行业都在智能化、网络化、无线化、微型化。在每一个行业都有不少高端具有核心竞争力并极度挣钱的杰出公司。在一个行业专注几年,掌握该行业的核心技术,你的未来的前途将会更广阔。12、电子技术的趋势是什么电子技术的五个时代已经来临:Wireless时代、FPGA时代、Linux时代、Smartphone时代、Audio-Video时代。在任何热门领域的一个技术点有所精通,你都是了不起的。在未来的很多年,你就不怕担心被淘汰。我的一个大学同学,毕业以后一直专注做音频,现在已经是小有成就了。13、杯具的电子工程师深层次的原因是什么杯具人生,鸡肋生活的真正原因是:除遗传外,脾气太坏、懒、方向错、方法错,没坚持,害怕变化。脾气来了、福气没了,想想是否具有癌症性格?每个人都需要建立一个社会支持系统,有两三个可以让你倾诉的好友或家人;追求完美的人,学会了欣赏自己,宽容别人,把标准降低,生活中的开心就会多很多;容易消极的人如果学会了得失的转换,就会开朗很多。生活累,少数人为了生存,多数人为了攀比。没有一个人的生命是完整无缺的,每个人多少少了一些东西。有人夫妻恩爱、月入数十万,却没有儿女;有人才貌双全、能干多财,情路上却是坎坷难行;有人家财万贯,却是子孙不孝;有人看似好命,却是一辈子脑袋空空。每个人的生命,都被上苍划上了一道缺口,你不想要它,它却如影随形。以前我也痛恨我人生中的缺失,但现在却能宽心接受。因为,我体认到生命中的缺口,彷若背上的一根刺,时时提醒我们谦卑,要懂得怜恤,拥有一颗朴素的心。14、如何获取更多的财富,渠道是什么在规则中犯规地寻找夹缝。一般来说,有一定技术背景,良好的综合能力,跳槽是涨薪水的最快的方式;有了一定原始积累后,开源节流,省钱秘籍,卖服务,卖产品,卖创意,以钱生钱搞投资;在电子行业的夹缝中,寻找挣钱的机会。人一出生就沦陷了,沦陷在了各种各样的规则当中,情场的、职场的、商场的、官场的……面对生命的幻境,每个人在清醒的时候都想挣脱,每用力挣扎一下,反而是陷得越深!无形的,有形的,看得见的,看不见的,尽是规则!电子行业的机会很多,就看你能否在规则中犯规地寻找夹缝;随着对社会的深入了解,你会发现获取财富的通道很多。我们可以失败十次一百次,我们只需要成功一次,这辈子也许就够了,我们需要坚持到能够成功的那一刻。END来源:小麦大叔版权归原作者所有,如有侵权,请联系删除。▍

    嵌入式ARM 电子工程师

  • Python如何链接MySQL?

    在python程序里,如何链接MySQL数据库?连接MYSQL需要3步1、安装必须先安装MySQL驱动。和PHP不一样,Python只默认安装了SQLite的驱动。最常用的包是MySQLdb但是用easy_install安装很困难。对于Window用户,你可以获取MySQLdb的exe。对于Linux,可以下载python-mysqldb(可以用sudo apt-get install python-mysqldb命令直接在命令行下载)对于Mac用户,可以用Macport下载MySQLdb2、使用装完之后重启。这样做可以减少问题。然后就像用其他包一样:#!/usr/bin/pythonimportMySQLdbdb =MySQLdb.connect(host="localhost",# your host, usually localhost user="john",# your username passwd="megajonhy",# your password db="jonhydb")# name of the data base# you must create a Cursor object. It will let# you execute all the queries you needcur = db.cursor()# Use all the SQL you likecur.execute("SELECT * FROM YOUR_TABLE_NAME")# print all the first cell of all the rowsfor row in cur.fetchall():print row[0]还有很多用法和选项,这里只举了一个基本的例子。3、高级用法一旦你知道它是如何工作的,你可能想用ORM来避免手动写入SQL,来把表变成Python对象。Python中最有名的ORM叫做SQLAlchemy(强烈推荐)最近又在Python里发现了一个好东西:peewee。它是个非常轻巧的ORM,非常容易安装和使用。一些小项目和独立app都可以使用它,像SQLLAlchemy或者Django用在这里有点小题大做了:import peeweefrom peewee import*db =MySQLDatabase('jonhydb', user='john',passwd='megajonhy')classBook(peewee.Model): author = peewee.CharField() title = peewee.TextField()classMeta: database = dbBook.create_table()book =Book(author="me", title='Peewee is cool')book.save()for book inBook.filter(author="me"):print book.titlePeeweeis cool按上边操作即可运行,除了peewee(pip install peewee)不需要别的的操作。安装非常简单。END来源:Python编程学习圈版权归原作者所有,如有侵权,请联系删除。▍

    嵌入式ARM

  • 知乎:电脑长时间不关机会缩短寿命吗?

    电脑长时间不关机,会缩短电脑寿命吗?答案是不会!5万多台电脑维修经验告诉我,长期开着的电脑,寿命比更少使用的电脑更长久、更稳定。其实大家平时生活中也都可以观察到类似的情况,只要是电器,一直开着的损耗绝对比偶尔开一下对电子产品带来的伤害更小。比如电视机,冰箱,哪怕是汽车。读大学的时候你们应该都有体会,偶尔回家玩一下电脑,机器就开不起来了。放在学校的电脑,一个暑假没用,回去就开不起来了。这种情况很常见。而我们每次寒暑假后开学的那第一周,就特别忙。因为学校里放假回家,很多电脑停用了个把月,故障率就会提高。并且这种现象南方比北方更严重。为什么?因为电脑在开机运行时会提高内部温度,温度会蒸发掉附着在元器件以及金属触点上的湿气。从而让元器件的金属部位氧化更少。而一直不开机的电脑,内存条,显卡的金手指氧化会更严重一些。南方湿度大,所以这个现象比北方突出一些。还有一个原因就是温差,开机工作的时候其实很多元器件的温度很高。关机以后降低到室温。具体导致故障的原理我不懂,但很多故障客户不理解,用好关机的时候还好好的,下一次开机就开不起来了。所以,频繁的开关机,会导致更高的故障率是确定的。所以我自己的电脑基本上是一直开着的,除非晚上睡觉才关机。偶尔出去一下,预计一个小时内能回来,也不会关机。那么电脑一直开着,确实也存在损耗,但是电脑用坏的在维修中真的很少见,唯一影响寿命的部件只有电容。而现在大多数主板都选用了寿命更长久的固态电容。也就更不需要担心了。哪怕是普通电容的也不用担心,因为电容的设计寿命一般达到 7-10 年以上的寿命。而工作中发现,在用和不用对于电脑寿命影响以外,还有另一个杀手,就是休眠待机。这种情况发生在 windows 笔记本上比较多,很多用户下班,携带,喜欢直接合上笔记本就拿着走了。接着就唤不醒了。强行关机以后就无法开机,然后就主板坏掉了。原因是什么?我们关机的时候是先中断所有后台程序,如果有进程无法关闭,操作系统会提示你有程序无法关闭,是立即结束还是取消。然后我们点立即结束,然后电脑关机。最后断开显示。而休眠待机正好相反,是先断开显示,进入黑屏状态,电脑把你现在所有打开的后台,运行的程序都放到内存,或者硬盘上。只要有一个程序无法中断,处理器就会反复操作这个命令。一直无法正确的进入休眠待机状态。然后放在包里的笔记本由于散热不好。温度就开始升高。最后导致有可能存在的无法开机情况。很多时候我们强行关机后能正常恢复。但有时候主板就这样坏掉了。macOS 的笔记本台式机,IOS 手机平板,Android 手机平板,确实不会存在这样的情况。而由于 windows 操作系统的复杂关系,驱动匹配,硬件兼容,以及国内外那么多软件厂商,无法准确做到其他操作系统一样那么稳定。既然现在大家都用固态硬盘了,来关机也挺快的,能不用休眠待机的情况下,建议就尽量少用吧。END作者:saili原文链接:www.zhihu.com/question/300500895/answer/621611941版权归原作者所有,如有侵权,请联系删除。▍

    嵌入式ARM 电脑

发布文章