• 黑客最简单的软件破解方法,反汇编nop指令覆盖

    1. 背景群里有个小伙伴学习设计加密方法,如同某商用软件输入注册码后就能使用扩展功能。设计时他很自然的想着所写的加密措施是否足够健壮安全,是否有什么方法可以绕过加密检查,也就是破解。权限管理仅在启动后检查一次注册码是否有效——一个 if 判断,他也认定,若反汇编软件只要 欺骗过这条判断加密措施荡然无存。群里我给他一个破解设计思想:“利用NOP指令覆盖相关代码绕开鉴权”。2. 演示下面是我做的一个例子演示运用NOP指令破解:软件a.out在破解前不是vip,直接修改二进制文件后拥有了vip权限。它是怎么实现的呢?先看看源码,源码逻辑很简单,仅仅判断用户有没有money,没有钱当然没权限。为了便于阐述原理,我编译源码带上调试选项:-g,生成的可执行文件a.out反汇编后就能同时看到源码和汇编内容。void main(){ int money = 0; int vip = 1; asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); // 无效指令 if (money == 0) { vip = 0; } printf("money %d vip %d\r\n", money, vip); if (vip == 1) { printf("授权成功\r\n"); } else { printf("未授权\r\n"); }}a.dis 是反汇编文件,138行是vip=0的汇编代码 “movl $0x0,-0x4(%rbp)”, 对应机器码为 “c7 45 fc 00 00 00 00” , 左侧窗口内容是a.out二进制文件,文件第1168字节位置找到相应机器码。3. 开始破解接下来这么修改呢?轮到主角nop指令登场。据我所知,每种处理器都会有一条瞎忙活的空指令nop(No Operation)。CPU遇到nop指令仅空转,浪费你的电费,不干实际有意义的事情(其实空转也是为了更有意义的发挥效能,上班摸鱼是不是能更有活力!), 那么想办法把“vip=0”这条语句生成7字节机器码 “c7 45 fc 00 00 00 00”,替换成nop指令的机器码,是不是就破解了呢?如果nop机器码是2字节,我的还需考虑指令完整性对齐,覆盖机器码长度必须是nop机器码整数倍。问题来了:x86的nop指令对应的机器码是什么呢?习惯性百度搜索 “x86 nop 机器码”。我这里介绍更简洁直接的方法,需要查询什么反汇编指令,问问反汇编工具objdump。有没有注意到源码里我写了若干行指令 ‘asm(“nop”)’,c语言可以嵌入汇编,查看反汇编文件a.dis告诉我nop指令最终编译得到的机器码是什么。反汇编后nop的机器码是 0x90。谢天谢地,芯片工程师设计指令操作码时只给它一个字符。任何正整数都是1的整数倍,不用考虑指令完整性对齐。顺带留给读者一个思考题:对于x86这种 CISC 复杂指令集,把nop指令的机器码设计成只有一个字节,有什么好处?替换后的源码 “vip = 0” 这行如同被注释掉一样。保存修改,再次执行,看到了吗!已经得到了VIP权限。

    Linux阅码场 指令 汇编 软件

  • 自拍杆里面都有啥?拆拆看

    曾几何时,自拍杆风靡世界,火当然是有原因的,这么一个小装备,极大的满足了人们爱拍照的需求,方便好用、经济实惠。恰巧我手上也有一个,收起来时很小、不占地方打开后可随意调节拍照同时它有个隐藏式三脚架功能,可用来直播、录视频,设计的很周到。杆子里藏了一个小东西:蓝牙遥控器,就是通过它来控制手机进行拍照的。使用时先长按按键3s、指示灯闪烁,然后手机蓝牙就可以搜索到它,连接之后就可以打开手机相机使用了,按一次按键实现一次拍照。打开,看看它的内部:电路板超级简单,元器件非常少,蓝牙芯片用的是ST17H56,深圳伦茨科技的芯片,第一次听说这个公司和这个芯片,再一次感叹深圳电子行业的发达。来源于:https://www.lenzetech.com/stProduct/ST17H56这是一款专门给自拍杆用的芯片,程序是出厂内置的。该芯片系统框图如下:功耗参数如下:作为一款纽扣电池供电(CR1632标称容量120mAh)的产品,自然要关注低功耗。遥控器上的那个按键我分析,在正常工作状态(BLE处于广播或者连接状态)下,长按3s就会进去到Deep Sleep模式,在Deep Sleep模式下,按下按键被唤醒,如果按键持续按下3s则进入到广播状态。我们来估算一下工作时长:之前测试过Nordic的NRF52832功耗,3V供电,DC-DC 使能,广播间隔1000ms,payload 37字节,平均功耗为15.447uA连接状态下,连接间隔为500ms 时,平均功耗为10.217uA连接间隔为200ms 时,平均功耗为22uA;连接间隔为100ms 时,平均功耗为41uA。这个芯片比NRF52832的TX和RX电流略高,按照蓝牙工作状态下平均电流50uA、电池利用率按照85%,那么可以使用120mAh*0.85/50uA=2040h实际中一天按照使用1小时的话,那么可以使用5年多,足够满足使用需求了。实际使用过程中,为了省电,用完的话最好就长按按键关闭蓝牙。我同时测试过,在没有被任何设备连接的情况下,5分钟之后,遥控器也会自动关闭蓝牙。自拍杆工作原理是这样:遥控器相当于是一个只有一个按键的蓝牙键盘,这个按键对应手机上的音量增大键(位于手机侧面)。每按一次按键,就相当于在手机上按了一次音量增大键。你可以这么去验证,手机连接上自拍杆的蓝牙遥控器,但是不打开手机相机,按一次遥控器按键,手机的音量就会被增加。或者打开手机相机,直接按一下手机的音量增大键,就可以拍照。如果使用电脑的蓝牙去连接,会看的更加直观:连接之后在设备管理器里就可以看到多了一个键盘设备。按下那个按键,就会增加音量除了蓝牙自拍杆,还有一种线控自拍杆,它是通过自拍杆自带的耳机接口线和手机的音频孔相连接,插上之后,相当于是一个线控耳机,按按钮就相当于增加音量,从而达到拍照的功能。了解完自拍杆工作原理之后,笔者忍不住自己也想动手来实现该功能。下一篇,我们介绍如何在一款蓝牙SOC上用代码实现该功能。欢迎关注我们:扫码加入嵌入式交流群:

    嵌入式大杂烩

  • 带你快速对比SPI、UART、I2C通信的区别与应用!

    关注「嵌入式大杂烩」,选择「星标公众号」一起进步!电子设备之间的通信就像人类之间的交流,双方都需要说相同的语言。在电子产品中,这些语言称为通信协议。之前有单独地分享了SPI、UART、I2C通信的文章,这篇对它们做一些对比。串行 VS 并行电子设备通过发送数据位从而实现相互交谈。位是二进制的,只能是1或0。通过电压的快速变化,位从一个设备传输到另一个设备。在以5V工作的系统中,“0”通过0V的短脉冲进行通信,而“1”通过5V的短脉冲进行通信。 数据位可以通过并行或串行的形式进行传输。 在并行通信中,数据位在导线上同时传输。下图显示了二进制(01000011)中字母“C”的并行传输:在串行通信中,位通过单根线一一发送。下图显示了二进制(01000011)中字母“C”的串行传输:SPI通信SPI是一种常见的设备通用通信协议。它有一个独特优势就是可以无中断传输数据,可以连续地发送或接收任意数量的位。而在I2C和UART中,数据以数据包的形式发送,有着限定位数。在SPI设备中,设备分为主机与从机系统。主机是控制设备(通常是微控制器),而从机(通常是传感器,显示器或存储芯片)从主机那获取指令。一套SPI通讯共包含四种信号线:MOSI (Master Output/Slave Input) – 信号线,主机输出,从机输入。MISO (Master Input/Slave Output) – 信号线,主机输入,从机输出。SCLK (Clock) – 时钟信号。SS/CS (Slave Select/Chip Select) – 片选信号。SPI协议特点实际上,从机的数量受系统负载电容的限制,它会降低主机在电压电平之间准确切换的能力。工作原理时钟信号每个时钟周期传输一位数据,因此数据传输的速度取决于时钟信号的频率。 时钟信号由于是主机配置生成的,因此SPI通信始终由主机启动。 设备共享时钟信号的任何通信协议都称为同步。SPI是一种同步通信协议,还有一些异步通信不使用时钟信号。 例如在UART通信中,双方都设置为预先配置的波特率,该波特率决定了数据传输的速度和时序。片选信号主机通过拉低从机的CS/SS来使能通信。 在空闲/非传输状态下,片选线保持高电平。在主机上可以存在多个CS/SS引脚,允许主机与多个不同的从机进行通讯。如果主机只有一个片选引脚可用,则可以通过以下方式连接这些从器件:MOSI和MISO主机通过MOSI以串行方式将数据发送给从机,从机也可以通过MISO将数据发送给主机,两者可以同时进行。所以理论上,SPI是一种全双工的通讯协议。传输步骤1. 主机输出时钟信号2. 主机拉低SS / CS引脚,激活从机3. 主机通过MOSI将数据发送给从机4. 如果需要响应,则从机通过MISO将数据返回给主机 使用SPI有一些优点和缺点,如果在不同的通信协议之间进行选择,则应根据项目要求进行充分考量。优劣优点SPI通讯无起始位和停止位,因此数据可以连续流传输而不会中断;没有像I2C这样的复杂的从站寻址系统,数据传输速率比I2C更高(几乎快两倍)。独立的MISO和MOSI线路,可以同时发送和接收数据。缺点SPI使用四根线(I2C和UART使用两根线),没有信号接收成功的确认(I2C拥有此功能),没有任何形式的错误检查(如UART中的奇偶校验位等)。UART代表通用异步接收器/发送器也称为串口通讯,它不像SPI和I2C这样的通信协议,而是微控制器中的物理电路或独立的IC。UART的主要目的是发送和接收串行数据,其最好的优点是它仅使用两条线在设备之间传输数据。UART的原理很容易理解,但是如果您还没有阅读SPI 通讯协议,那可能是一个不错的起点。UART通信在UART通信中,两个UART直接相互通信。 发送UART将控制设备(如CPU)的并行数据转换为串行形式,以串行方式将其发送到接收UART。只需要两条线即可在两个UART之间传输数据,数据从发送UART的Tx引脚流到接收UART的Rx引脚:UART属于异步通讯,这意味着没有时钟信号,取而代之的是在数据包中添加开始和停止位。这些位定义了数据包的开始和结束,因此接收UART知道何时读取这些数据。 当接收UART检测到起始位时,它将以特定波特率的频率读取。波特率是数据传输速度的度量,以每秒比特数(bps)表示。两个UART必须以大约相同的波特率工作,发送和接收UART之间的波特率只能相差约10%。工作原理发送UART从数据总线获取并行数据后,它会添加一个起始位,一个奇偶校验位和一个停止位来组成数据包并从Tx引脚上逐位串行输出,接收UART在其Rx引脚上逐位读取数据包。UART数据包含有1个起始位,5至9个数据位(取决于UART),一个可选的奇偶校验位以及1个或2个停止位:起始位:UART数据传输线通常在不传输数据时保持在高电压电平。开始传输时发送UART在一个时钟周期内将传输线从高电平拉低到低电平,当接收UART检测到高电压到低电压转换时,它开始以波特率的频率读取数据帧中的位。数据帧:数据帧内包含正在传输的实际数据。如果使用奇偶校验位,则可以是5位,最多8位。如果不使用奇偶校验位,则数据帧的长度可以为9位。 校验位:奇偶校验位是接收UART判断传输期间是否有任何数据更改的方式。接收UART读取数据帧后,它将对值为1的位数进行计数,并检查总数是偶数还是奇数,是否与数据相匹配。停止位:为了向数据包的结尾发出信号,发送UART将数据传输线从低电压驱动到高电压至少持续两位时间。传输步骤发送UART从数据总线并行接收数据: 2.发送UART将起始位,奇偶校验位和停止位添加到数据帧:3.整个数据包从发送UART串行发送到接收UART。接收UART以预先配置的波特率对数据线进行采样:4.接收UART丢弃数据帧中的起始位,奇偶校验位和停止位:5.接收UART将串行数据转换回并行数据,并将其传输到接收端的数据总线:优劣没有任何通信协议是完美的,但是UART非常擅长于其工作。以下是一些利弊,可帮助您确定它们是否适合您的项目需求:优点仅使用两根电线无需时钟信号具有奇偶校验位以允许进行错误检查只要双方都设置好数据包的结构有据可查并得到广泛使用的方法缺点数据帧的大小最大为9位不支持多个从属系统或多个主系统每个UART的波特率必须在彼此的10%之内I2C通信I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可传送信息。它结合了 SPI 和 UART 的优点,您可以将多个从机连接到单个主机(如SPI那样),也可以使用多个主机控制一个或多个从机。当您想让多个微控制器将数据记录到单个存储卡或将文本显示到单个LCD时,这将非常有用。SDA (Serial Data) – 数据线。SCL (Serial Clock) – 时钟线。I2C是串行通信协议,因此数据沿着SDA一点一点地传输。与SPI一样,I2C也需要时钟同步信号且时钟始终由主机控制。工作原理I2C的数据传输是以多个msg的形式进行,每个msg都包含从机的二进制地址帧,以及一个或多个数据帧,还包括开始条件和停止条件,读/写位和数据帧之间的ACK / NACK位:启动条件:当SCL是高电平时,SDA从高电平向低电平切换。停止条件:当SCL是高电平时,SDA由低电平向高电平切换。地址帧:每个从属设备唯一的7位或10位序列,用于主从设备之间的地址识别。读/写位:一位,如果主机是向从机发送数据则为低电平,请求数据则为高电平。ACK/NACK:消息中的每个帧后均带有一个ACK/NACK位。如果成功接收到地址帧或数据帧,接收设备会返回一个ACK位用于表示确认。寻址由于I2C没有像SPI那样的片选线,因此它需要使用另一种方式来确认某一个从设备,而这个方式就是 —— 寻址 。主机将要通信的从机地址发送给每个从机,然后每个从机将其与自己的地址进行比较。如果地址匹配,它将向主机发送一个低电平ACK位。如果不匹配,则不执行任何操作,SDA线保持高电平。读/写位 地址帧的末尾包含一个读/写位。如果主机要向从机发送数据,则为低电平。如果是主机向从机请求数据,则为高电平。数据帧当主机检测到从机的ACK位后,就可以发送第一个数据帧了。数据帧始终为8位,每个数据帧后紧跟一个ACK / NACK位,来验证接收状态。当发送完所有数据帧后,主机可以向从机发送停止条件来终止通信。传输步骤1. 在SCL线为高电平时,主机通过将SDA线从高电平切换到低电平来启动总线通信。2. 主机向总线发送要与之通信的从机的7位或10位地址,以及读/写位:3. 每个从机将主机发送的地址与其自己的地址进行比较。如果地址匹配,则从机通过将SDA线拉低一位返回一个ACK位。如果主机的地址与从机的地址不匹配,则从机将SDA线拉高。4. 主机发送或接收数据帧:5. 传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧:6. 随后主机将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件。单个主机VS多个从机由于I2C使用寻址功能,可以通过一个主机控制多个从机。使用7位地址时,最多可以使用128(27)个唯一地址。使用10位地址并不常见,但可以提供1,024(210)个唯一地址。如果要将多个从机连接到单个主机时,请使用4.7K欧的上拉电阻将它们连接,例如将SDA和SCL线连接到Vcc:多个主机VS多个从机I2C支持多个主机同时与多个从机相连,当两个主机试图通过SDA线路同时发送或接收数据时,就会出现问题。因此每个主机都需要在发送消息之前检测SDA线是低电平还是高电平。如果SDA线为低电平,则意味着另一个主机正在控制总线。如果SDA线高,则可以安全地发送数据。如果要将多个主机连接到多个从机,请使用4.7K欧的上拉电阻将SDA和SCL线连接到Vcc:优劣与其他协议相比,I2C可能听起来很复杂。以下是一些利弊,可帮助您确定它们是否适合您的项目需求:优点仅使用两根电线支持多个主机和多个从机每个UART的波特率必须在彼此的10%之内硬件比UART更简单众所周知且被广泛使用的协议缺点数据传输速率比SPI慢数据帧的大小限制为8位本文来源网络,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。往期干货:往期推荐嵌入式项目生成器,了解一下!小知识 | 嵌入式C中#pragma once的作用是什么?一个清晰的LCD驱动编写思路(附代码分析)高效的、省内存的、任意格式的队列

    嵌入式大杂烩 UART I2C通信

  • 开发者们,来拆开发板盲盒啦! ——涂鸦开发者中秋专属惊喜

    嗨! 嫦娥让我给你捎个话:今年中秋除了明明圆月更为你派送了一份惊喜大礼包~欢度金秋,涂鸦智能#免费抽盲盒活动来啦#~先瞅瞅惊喜盲盒包含什么?盲盒 A :随机一款涂鸦三明治开发板       盲盒 B :随机通信板 or 主控板 功能板 电源板各一块8 大音箱语音免费接入权限盲盒-非你莫属☞ 初级开发者 -- 抱走盲盒,闭关修炼,悄悄“惊艳”所有人☞ 专业硬件开发人员 -- 扛回盲盒,快速打造智能产品原型,降本提效!涂鸦三明治开发板涂鸦三明治开发套件像三明治一样,层层组合,你可以通过它,快速组合成一个完整的 IoT 产品原型,方便快捷,不仅能缩短产品研发周期,更能使产品快速达到量产状态。依托于 Arduino 开源生态,任何开放性的设备可通过 Zigbee、Bluetooth LE、Wi-Fi、NB-IoT 等丰富接入类型的涂鸦云模组,连接到涂鸦 IoT PaaS,为开发者在 IoT 领域带来极大的发挥空间。通过涂鸦三明治开发出的产品总体架构如下图所示:》》左右滑动查看更多开发板《《赢盲盒-必读秘籍活动规则1、新注册涂鸦 IoT 开发平台账号的开发者,可以领取涂鸦联网模组 30 元无门槛券,下单之后即可获得三明治开发板A款“盲盒” 1 个。2、正确填写企业信息即可以领取升级版三明治开发板套件 B 款“盲盒”1个(随机通信板 or 主控板 功能板 电源板各一块),附赠 8 大智能音箱免费接入,领取方式同盲盒 A。3、盲盒内开发板具体型号表,和活动奖励领取规则,可报名后联系小助手获取。活动时间9月7日-9月30日参与对象本次活动限涂鸦 IoT 开发平台新用户哦~ ▼扫码下方二维码▼报名进群

    嵌入式大杂烩 开发者 开发板

  • Cortex-M中断向量表原理及其重定向方法

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是Cortex-M中断向量表原理及其重定向方法。接着前文 《嵌入式Cortex-M裸机环境下临界区保护的三种实现》 继续聊,嵌入式代码设计里有时候一些特殊操作(比如 XIP 下 Flash 擦写、低功耗模式切换)不能被随意打断,或者一些共享数据区不能被无序访问(A 任务正在读,B 任务却要写),这时候我们可以利用系统全局中断开关控制来实现所谓的临界区保护。但有些场景下开关系统全局中断这种方法并不总是很凑效,比如 XIP 下 Flash 擦写这种情况,如果项目里还有一个后台定时器(比如SysTick)在实时运行,擦除 Flash 期间(这个时间可能会很长)我们直接关闭系统全局中断,会导致定时器中断无法响应,系统计时会出偏差,对于这种情况,我们显然不能关闭系统全局中断。为了在 Flash 擦写期间系统还能够及时响应定时器中断(执行中断响应函数),我们需要将定时器中断响应函数及其相关代码像 Flash IAP 操作代码一样都链接到 RAM 里执行,此外还需要将中断向量表也重定向到 RAM 里才行。今天痞子衡就来聊一聊重定向中断向量表的方法:一、Cortex-M中断向量表简介熟悉 ARM Cortex-M 处理器的朋友应该都对下面这张表有所了解,这就是中断向量表,表中每个向量大小都是 4 字节,除了第 0 个向量外,其余向量都是函数地址,这个表集中保存了系统全部的中断处理函数(xxxIRQHandler)地址。对于内嵌 Flash 的 MCU 来说,初始中断向量表一般会被要求固定链接到 Flash 起始地址处,因为系统启动总是从 Flash 起始地址获取第 0(初始栈)、1个向量(初始PC,复位函数ResetHandler)来开始应用程序代码的执行。对于一些包含 BootROM 或者没有内部 Flash 的 MCU,初始中断向量表也许可以放到 Flash 中的其他地址处,这要取决于具体芯片设计。当应用程序执行起来后,如果发生了中断,系统会根据发出请求的外设中断号来中断向量表里找到对应的外设中断响应函数并去执行。Cortex-M 内核(除了CM0)模块 SCB 里有个专门的 VTOR 寄存器用来控制中断向量表首地址(注意,地址需要 128 字节对齐),程序运行起来后用户可以配置 SCB->VTOR 寄存器来重设中断向量表地址。二、重定向中断向量表的方法现在我们以恩智浦 i.MXRT1170 型号为例介绍重定向中断向量表的方法,在 \SDK_2.9.1_MIMXRT1170-EVK\boards\evkmimxrt1170\demo_apps\led_blinky\cm7\iar 工程上示例。2.1 与中断向量表相关的文件这个 led_blinky 工程里跟中断向量表有关的一共两个文件,一是 startup_MIMXRT1176_cm7.s 启动文件,这里面存放了中断向量表实体定义,以及复位函数 ResetHandler(),从复位函数里你可以看到上来就先重置了一遍 SCB->VTOR 寄存器。 THUMB PUBWEAK Reset_Handler SECTION .text:CODE:REORDER:NOROOT(2)Reset_Handler CPSID I ; Mask interrupts LDR R0, =0xE000ED08 ; 即 SCB->VTOR LDR R1, =__vector_table ; section .intvec 段首地址 STR R1, [R0] LDR R2, [R1] MSR MSP, R2 LDR R0, =SystemInit BLX R0 CPSIE I ; Unmask interrupts LDR R0, =__iar_program_start BX R0复位函数里用到的 __vector_table 值取决于 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 链接文件里如下语句设置。由于 i.MXRT1170 没有内部 Flash,分配给外部 NOR Flash (挂在 FlexSPI1 外设上)的系统映射起始地址是 0x30000000,而 0x30002000 是 BootROM 能支持的应用程序初始中断向量表地址之一(在 IVT 启动头里指示)。define symbol m_interrupts_start = 0x30002000;define symbol m_interrupts_end = 0x300023FF;define exported symbol __VECTOR_TABLE = m_interrupts_start;place at address mem: m_interrupts_start { readonly section .intvec };编译工程后在对应生成的 iled_blinky_cm7.map 映射文件里可以找到初始中断向量表最终链接地址。为了便于后续分析问题,我们将定时器中断响应函数地址也一并列出来:********************************************************************************** PLACEMENT SUMMARY***"A0": place at address 0x3000'2000 { ro section .intvec }; Section Kind Address Size Object ------- ---- ------- ---- ------"A0": 0x400 .intvec ro code 0x3000'2000 0x400 startup_MIMXRT1176_cm7.o [1] - 0x3000'2400 0x400********************************************************************************** ENTRY LIST***Entry Address Size Type Object ----- ------- ---- ---- ------SysTick_Handler 0x3000'5767 0x10 Code Gb led_blinky.o [1]__VECTOR_TABLE {Abs} 0x3000'2000 Data Gb __Vectors 0x3000'2000 -- Gb startup_MIMXRT1176_cm7.o [1]__Vectors_End 0x3000'2400 Data Gb startup_MIMXRT1176_cm7.o [1]__Vectors_Size {Abs} 0x400 -- Gb startup_MIMXRT1176_cm7.o [1]__vector_table 0x3000'2000 Data Gb startup_MIMXRT1176_cm7.o [1]2.2 中断重定向函数示例定时器中断响应函数 SysTick_Handler() 链接在 Flash 里显然是不行的,我们利用 IDE 特性(对于IAR,是 __ramfunc 修饰符)将其链接到 RAM 里(MIMXRT1176xxxxx_cm7_flexspi_nor.icf 里定义了 TEXT2_region: 0x0 - 0x3FFFF 空间存放 section .textrw 段), 重新编译工程,查看映射文件可以看到新分配的地址是 0x1。__ramfunc void SysTick_Handler(void){    if (g_systickCounter != 0U)    {        g_systickCounter--;    }}********************************************************************************** ENTRY LIST***Entry Address Size Type Object ----- ------- ---- ---- ------SysTick_Handler 0x1 0x14 Code Gb led_blinky.o [1]现在我们尝试在代码里纯手工搬移中断向量表,找一块空闲的 RAM 区域(比如 0x20000000 - 0x200003FF),将中断向量表内容直接手工拷贝过去即可,示例代码如下。主函数里一开始就调用一下这个 relocate_vector_table() 函数即可,修改后的工程下载进板卡运行一切正常,表明中断向量表重定向操作成功了。extern uint32_t __VECTOR_TABLE[];void relocate_vector_table(void){    __disable_irq();    // 将 0x30002000 处的初始中断向量表拷贝到新地址 0x20000000    memcpy((void *)0x20000000, (void *)__VECTOR_TABLE, 0x400);    // 将 VTOR 指向 0x20000000    SCB->VTOR = 0x20000000;    __enable_irq();}int main(void){    relocate_vector_table();    // 其余代码}至此,Cortex-M中断向量表原理及其重定向方法痞子衡便介绍完毕了,掌声在哪里~~~

    嵌入式客栈 中断向量 Cortex-M

  • 我们计划招收500名工程师,免费系统学习傅立叶变换

    对于我们大部分的工程师在工作中,不管接触是是嵌入式,单片机,还是信号处理,图像图形处理各方面来说,傅里叶变换对现在通信的重要性还是不言而语。当我们已经习惯用频域去描述一个信号的时候,你可曾思考过其真实的样子到底是什么?但不幸的是,傅立叶变换的公式看起来太复杂了,所以很多人来说就很懵圈并对它深恶痛绝。甚至在数学界、工程界有这么一句传说:有一种运算,把微积分变成加减乘除,它叫傅立叶变换。为了感谢大家对我们长期关注和喜爱,我们联系了央视公开课曾推荐的 万门好课,为大家免费赠送一份傅立叶变换、拉普拉斯变换与小波变换课程。扫描下方二维码即可领取课程这个课程我们已经了解过,是个可以重复观看的录播课程,课程非常系统完善。干货非常丰富,从细小的知识点到完整的知识框架,带你用新的视角感受傅立叶变换,学完后你将发现数学竟能如此有趣!最最重要的是,不用花一分钱便可观看全部的课程。补充一些课程内容和老师介绍 童哲万门创始人物理竞赛第一名保送北京大学巴黎高师本科 巴黎高师硕士M1学位今天,这节价值588元的课程,可免费学习, 再次重申:这门课程,今天完全免费。(扫文末下方二维码即可领取课程)下面是课程内容介绍很多人都知道傅立叶变换在图像处理、声波信号中很重要,但它的公式很复杂,很多人一看就蒙圈了。比如你看到下面这个,你难道不会云里雾里吗?因为傅立叶变换有趣的简化方式,使得傅立叶变换成为工程和物理领域里最重要的数学公式之一。这次童哲校长还特地开设了《傅立叶变换、拉普拉斯变换与小波变换》,帮助大家迅速掌握傅立叶变换。关于傅立叶变换,无论是书本还是在网上可以很容易找到关于傅立叶变换的描述,但是大都是些故弄玄虚的文章,太过抽象,尽是一些让人看了就望而生畏的公式的罗列。而童哲的课程则不同,他会把内容由浅入深、全方位掰开料揉碎了慢慢地注入你的脑子,让你在不知不觉当中就已经去接受、了解、掌握这个知识点。【您将掌握】:✔️变换的性质、快速傅立叶变换的证明✔️器件函数的定义。卷积的性质等基础内容和例题讲解✔️傅立叶变换、拉普拉斯变换、小波变换的规律和高分答题方法与技巧听课方式:通过识别二维码听课  

    嵌入式客栈 工程师 傅立叶变换

  • STM32CubeMX-实时时钟(RTC)

    RTC简介实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。RTC 提供具有可编程闹钟中断功能的日历时钟 /日历。RTC 还包含具有中断功能的周期性可编程唤醒标志。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。只要芯片的备用电源一直供电,RTC上的时间会一直走。新建工程本章程序在串口printf工程的基础上修改,复制串口printf的工程,修改文件夹名。点击STM32F746I.ioc打开STM32cubeMX的工程文件重新配置。RTC选择内部唤醒(Internal WakeUp)开启RTC。开启外部低速晶振,PC14,PC15配置。RTC时钟选择为外部低速晶振(LSE),频率为32.768。在RTC配置中,设置时间和日期,其他为默认设置。此处设置时间为2016/04/16 16:25:49。生成报告以及代码,编译程序。添加应用程序在rtc.c文件中可以看到ADC初始化函数。在stm32f7xx_hal_rtc.h头文件中可以看到rtc时间和日期读写操作函数。从操作函数中可以看到,时间和日期是以结构体的形式读写的。所以在main.c文件前面申明两个结构体变量存储读取的时间和日期数据。/* USER CODE BEGIN PV *//* Private variables --------*/RTC_DateTypeDef sdatestructure;RTC_TimeTypeDef stimestructure;/* USER CODE END PV */在stm32f7xx_hal_rtc.h头文件中,可以找到RTC_TimeTypeDef,RTC_DateTypeDef这两个结构体的成员变量。在while循环中添加应用程序,读取当前的时间和日期,并通过串口发送到电脑上显示。/* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */ /* Get the RTC current Time ,must get time first*/ HAL_RTC_GetTime(

    嵌入式ARM 实时时钟 RTC

  • 使用uptimed命令监视Linux系统正常运行时间

    大家好,我是良许。作为一名合格的 Linux 运维人员,监视系统的正常运行时间可以说是一门基本功了。今天这篇文章就为大家分享一个用于记录和跟踪系统的运行时间的实用命令行工具,它的名字叫做 uptimed。之所以推荐 uptimed,主要是因为它能在记录和跟踪系统的运行时间之余,还能将这些历史记录以摘要的形式直截了当地展示给用户,比如你的系统已经运行多长时间了?最长的运行时间记录是多少?系统又是何时重启的?等等,而且它也比较容易上手。下面就简单来了解一下 uptimed 的安装和使用吧。安装uptimed工具目前主流的 Linux 发行版的官方存软件库中已经提供了 uptimed 。在 Arch Linux 上安装:$ sudo pacman -S uptimed在 Debian,Ubuntu,Linux Mint 上安装:$ sudo apt-get install uptimed在 Ubuntu 及其衍生版本上安装前请确保添加了 universe 存储库,没有的话请运行以下命令添加:$ sudo add-apt-repository universe在 Fedora 上安装:$ sudo dnf install uptimed在 CentOS 7 上安装:因为 CentOS 7 的默认存储库中没有 uptimed,所以要先添加 EPEL 存储库:$ sudo yum install epel-release然后运行以下命令安装:$ sudo yum install uptimed手动安装:对于其他 Linux 系统,或者上述方法安装失败的,可以从发行版页面下载源码,然后手动编译安装:# wget https://github.com/rpodgorny/uptimed/archive/v0.4.2.zip -O uptimed.zip# unzip uptimed.zip# cd uptimed-0.4.2/# ./configure# make# make install安装完成后,启用并启动服务:# systemctl enable uptimed# systemctl start uptimed检查服务的启动状态:# systemctl status uptimed● uptimed.service - Uptime record tracking daemon   Loaded: loaded (/usr/lib/systemd/system/uptimed.service; disabled; vendor preset: disabled)   Active: active (running) since Tue 2020-02-11 14:21:12 IST; 1s ago     Docs: man:uptimed(8)           man:uprecords(1) Main PID: 1435 (uptimed)   Status: "Next milestone (five days) at Sun Feb 16 14:13:59 2020"   CGroup: /system.slice/uptimed.service           └─1435 /usr/sbin/uptimed -fFeb 11 14:21:12 server.ostechnix.local systemd[1]: Starting Uptime record tracking daemon...Feb 11 14:21:12 server.ostechnix.local systemd[1]: Started Uptime record tracking daemon.这样,前期的安装工作就算完成了。使用uptimed工具安装完成 uptimed 工具之后,运行 uprecords 命令就能显示系统运行时间的历史摘要了:# uprecords输出的摘要结果:    #               Uptime | System                                     Boot up---------------------------- ---------------------------------------------------     1     0 days, 02:35:51 | Linux 3.10.0-1062.1.1.el  Tue Feb 11 14:22:33 2020     2     0 days, 00:07:27 | Linux 3.10.0-1062.1.1.el  Tue Feb 11 14:13:59 2020->   3     0 days, 00:02:11 | Linux 3.10.0-1062.1.1.el  Tue Feb 11 17:02:29 2020---------------------------- ---------------------------------------------------1up in     0 days, 00:05:17 | at                        Tue Feb 11 17:09:56 2020no1 in     0 days, 02:33:41 | at                        Tue Feb 11 19:38:20 2020    up     0 days, 02:45:29 | since                     Tue Feb 11 14:13:59 2020  down     0 days, 00:05:12 | since                     Tue Feb 11 14:13:59 2020   %up               96.953 | since                     Tue Feb 11 14:13:59 2020这里的 -> 符号表示定位到了系统最近的一次启动时间。使用 -b 按启动时间正序输出:# uprecords -b     #               Uptime | System                                     Boot up---------------------------- ---------------------------------------------------     1     0 days, 00:07:27 | Linux 3.10.0-1062.1.1.el  Tue Feb 11 14:13:59 2020     2     0 days, 02:35:51 | Linux 3.10.0-1062.1.1.el  Tue Feb 11 14:22:33 2020->   3     0 days, 00:30:14 | Linux 3.10.0-1062.1.1.el  Tue Feb 11 17:02:29 2020使用 -B 按启动时间倒序输出:# uprecords -B     #               Uptime | System                                     Boot up---------------------------- ---------------------------------------------------->   1     0 days, 00:14:51 | Linux 3.10.0-1062.1.1.el  Tue Feb 11 17:02:29 2020     2     0 days, 02:35:51 | Linux 3.10.0-1062.1.1.el  Tue Feb 11 14:22:33 2020     3     0 days, 00:07:27 | Linux 3.10.0-1062.1.1.el  Tue Feb 11 14:13:59 2020使用 -m 自定义输出记录数:不加参数的话结果默认输出前 10 条记录,想要输出前 20 条记录,请运行:# uprecords -m 20使用 -w 输出完整信息:上面的结果中关于 Linux 的内核信息是被省略了部分内容的,想要输出完整的内核信息请用 -w 进行宽输出:# uprecords -w     #               Uptime | System                                     Boot up---------------------------- ---------------------------------------------------     1     0 days, 02:35:51 | Linux 3.10.0-1062.1.1.el7.x86_64  Tue Feb 11 14:22:33 2020->   2     0 days, 00:16:35 | Linux 3.10.0-1062.1.1.el7.x86_64  Tue Feb 11 17:02:29 2020     3     0 days, 00:07:27 | Linux 3.10.0-1062.1.1.el7.x86_64  Tue Feb 11 14:13:59 2020---------------------------- ---------------------------------------------------no1 in     0 days, 02:19:17 | at                        Tue Feb 11 19:38:21 2020    up     0 days, 02:59:53 | since                     Tue Feb 11 14:13:59 2020  down     0 days, 00:05:12 | since                     Tue Feb 11 14:13:59 2020   %up               97.190 | since                     Tue Feb 11 14:13:59 2020使用 -d 显示关机时间:-d 可以将上面的内核信息替换为关机时间信息:# uprecords -d     #               Uptime |        Last downtime                       Boot up---------------------------- ---------------------------------------------------     1     0 days, 02:35:51 |     0 days, 00:01:07      Tue Feb 11 14:22:33 2020->   2     0 days, 00:13:02 |     0 days, 00:04:05      Tue Feb 11 17:02:29 2020     3     0 days, 00:07:27 |     0 days, 00:00:00      Tue Feb 11 14:13:59 2020---------------------------- ---------------------------------------------------no1 in     0 days, 02:22:50 | at                        Tue Feb 11 19:38:21 2020    up     0 days, 02:56:20 | since                     Tue Feb 11 14:13:59 2020  down     0 days, 00:05:12 | since                     Tue Feb 11 14:13:59 2020   %up               97.136 | since                     Tue Feb 11 14:13:59 2020查看更多的命令选项:# uprecords -?usage: uprecords [OPTION]...  -?             this help  -a             do not print ansi codes  -b             sort by boottime  -B             reverse sort by boottime  -k             sort by sysinfo  -K             reverse sort by sysinfo  -d             print downtime seen before every uptimes instead of system  -c             do not show current entry if not in top entries  -f             run continously in a loop  -s             do not print extra statistics  -w             wide output (more than 80 cols per line)  -i INTERVAL    use INTERVAL seconds for loop instead of 5, implies -f  -m COUNT       show a maximum of top COUNT entries instead of 10  -M             show next milestone  -v             version information好了,这次的分享就到这里了,上面所举的例子都是日常使用中十分常见的,如果你想要了解更多关于 uptimed 的用法,可以参考它的帮助手册。$ man uprecords希望本文对你有所帮助!

    Linux阅码场

  • 十分钟学会如何用Python处理CSV文件

    ▼点击下方名片,关注公众号▼一切的开始在前几年,如果你和嵌入式开发人员推荐Python,大概会是这样一种场景:A:”诶,老王,你看Python开发这么方便,以后会不会用到嵌入式设备?“B:“别做梦了,那玩意儿速度贼慢,肯定满足不了性能要求......”但近几年,随着半导体行业的迅猛发展,嵌入式处理器的性能有了很大幅度的提高。与此同时,Python语言本身也在不断优化。因此,在嵌入式领域引入Python已经成为了必然趋势。今天,作者就来总结一下使用Python处理物联网行业中一种常见的文件格式:csv文件。Python库:csvPython中集成了专用于处理csv文件的库,名为:csv。csv 库中有4个常用的对象:csv.reader:以列表的形式返回读取的数据。csv.writer:以列表的形式写入数据。csv.DictReader:以字典的形式返回读取的数据。csv.DictWriter:以字典的形式写入数据。读取CSV文件假设现在要读取的csv文件内容如下:可以看到,该文件的第一行表明数据类型,我们暂且称之为header。从第2行开始,保存的是设备采集到的数据。使用csv.reader读取文件# 导入 csv 库import csv# 以读方式打开文件with open关于写入,需要注意:"data.csv", mode="r", encoding="utf-8-sig") as f:        # 基于打开的文件,创建csv.reader实例    reader = csv.reader(f)    # 获取第一行的header    # header[0] = "设备编号"    # header[1] = "温度"    # header[2] = "湿度"    # header[3] = "转速"    header = next(reader)    # 逐行获取数据,并输出    for row in reader:        print("{}{}: {}={}, {}={}, {}={}".format(header[0], row[0],                                                 header[1], row[1],                                                 header[2], row[2],                                                 header[3], row[3]))程序运行结果如下:设备编号0: 温度=31, 湿度=20, 转速=1000设备编号1: 温度=30, 湿度=22, 转速=998设备编号2: 温度=32, 湿度=23, 转速=1005使用csv.DictReader读取文件# 导入 csv 库import csv# 打开文件with open("data.csv", encoding="utf-8-sig", mode="r") as f:    # 基于打开的文件,创建csv.DictReader实例    reader = csv.DictReader(f)    # 输出信息    for row in reader:        print("设备编号{}: 温度={}, 湿度={}, 转速={}".format(row["设备编号"],                                                   row["温度"],                                                   row["湿度"],                                                   row["转速"]))程序运行结果如下:设备编号0: 温度=31, 湿度=20, 转速=1000设备编号1: 温度=30, 湿度=22, 转速=998设备编号2: 温度=32, 湿度=23, 转速=1005写入CSV文件假设我们现在要创建一个csv文件,将数据保存为如下形式:使用csv.writer写入文件# 导入 csv 库import csv# 创建列表,保存header内容header_list = ["设备编号", "温度", "湿度", "转速"]# 创建列表,保存数据data_list = [    [0, 31, 20, 1000],    [1, 30, 22, 998],    [2, 32, 33, 1005]]# 以写方式打开文件。注意添加 newline="",否则会在两行数据之间都插入一行空白。with open("new_data.csv", mode="w", encoding="utf-8-sig", newline="") as f:        # 基于打开的文件,创建 csv.writer 实例    writer = csv.writer(f)    # 写入 header。    # writerow() 一次只能写入一行。    writer.writerow(header_list)    # 写入数据。    # writerows() 一次写入多行。    writer.writerows(data_list)使用csv.DictWriter写入文件# 导入 csv 库import csv# 创建 header 列表header_list = ["设备编号", "温度", "湿度", "转速"]# 创建数据列表,列表的每个元素都是字典data_list = [    {"设备编号": "0", "温度": 31, "湿度": 20, "转速": 1000},    {"设备编号": "1", "温度": 30, "湿度": 22, "转速": 998},    {"设备编号": "2", "温度": 32, "湿度": 23, "转速": 1005},]# 以写方式打开文件。注意添加 newline="",否则会在两行数据之间都插入一行空白。with open("new_data.csv", mode="w", encoding="utf-8-sig", newline="") as f:        # 基于打开的文件,创建 csv.DictWriter 实例,将 header 列表作为参数传入。    writer = csv.DictWriter(f, header_list)    # 写入 header    writer.writeheader()    # 写入数据    writer.writerows(data_list)关于写入,需要主语:在打开文件时,需要添加newline = ""。否则,会在每2行有效内容之间添加一行空白。如果要保存的内容有中文,而且之后需要用Excel打开文件,那么需要选用utf-8-sig编码。如果使用utf-8编码,会导致使用Excel查看文件时中文乱码。end微信公众号后台回复关键字“加群”,添加小编微信,拉你入技术群。

    8号线攻城狮

  • 实测自恢复保险丝(PPTC)的I-R特性

    ▼点击下方名片,关注公众号▼自恢复保险丝(PPTC)是一款常用的电路保护元器件,之前有篇文章讲到了其基本工作原理和选型要点,可参考:PPTC的技术参数理解与选型。那么今天实测一下自恢复保险丝(PPTC)的一个重要特性:PPTC不同负载电流下对应的电阻值大小。测试动机:为什么要测试这个玩意呢?一来是当做是对之前文章的补充,二来,最近对PPTC的实际动作电流值有些困惑,想亲自测试一下到底是datasheet中哪个参数起决定作用。测试方法:室温23℃下,将PPTC与电路固定负载,大概60mA串联在电路中,,并在固定负载后面加可调负载模拟负载变化。测量不同负载下的F1两端电压间求出其I-R特性曲线。测试简图如下图 1 所示。注:测试电流在2.2A的时候,PPTC经过大概100s启动保护,断开后级电路图 1 测试简图简单分析:根据测试PPTC不同负载电流下的阻值的大小绘制出如下图 2 曲线,这张图在之前文章中有提过。这张图很重要,透过这张图我们可以看出PPTC的冷态电阻(零电流时候的阻值),保持电流和动作电流。动作电流即图中PPTC的电阻值开始出现明显增大的时刻对应的电流。其电流值的一半通常我们定义为保持电流。图 2 负载电流与其电阻的关系曲线图根据实际测试数据可知,PPTC在室温23℃下通过2.2A左右负载电流时,经过100s左右启动保护,断开后级电路。动作过程可参考如下视频,透过视频我们可以发现:PPTC动作过程中刚开始的时候热量在积累比较慢,此时对应的电阻变化也比较慢,后面随着热量的积累,速度会比较快。一些对保护时间有及时性要求的产品不建议用PPTC,整个动作过程比较慢。实验结论:如上测试数据中2.2A对应datasheet中的动作电流IT,这对我们设计选型时很有帮助。图 3 测试型号PPTC的部分数据end微信公众号后台回复关键字“加群”,添加小编微信,拉你入技术群。

    8号线攻城狮 自恢复保险丝 PTC

  • EEPROM和flash这样讲,早就懂了!

    ▼点击下方名片,关注公众号▼存储器分为两大类:RAM和ROM。RAM就不讲了,主要讨论ROM。ROM最初不能编程,出厂什么内容就永远什么内容,不灵活。后来出现了PROM,可以自己写入一次,要是写错了,只能换一片,自认倒霉。人类文明不断进步,终于出现了可多次擦除写入的EPROM,每次擦除要把芯片拿到紫外线上照一下;想一下你往单片机上下了一个程序之后发现有个地方需要加一句话,为此你要把单片机放紫外灯下照半小时,然后才能再下一次,这么折腾一天也改不了几次。历史的车轮不断前进,伟大的EEPROM出现了,拯救了一大批程序员,终于可以随意的修改ROM中的内容了。EEPROM的全称是“电可擦除可编程只读存储器”,即Electrically Erasable Programmable Read-Only Memory。是相对于紫外擦除的ROM来讲的。但是今天已经存在多种EEPROM的变种,变成了一类存储器的统称。狭义的EEPROM这种ROM的特点是可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。这是最传统的一种EEPROM,掉电后数据不丢失,可以保存100年,可以擦写100w次。具有较高的可靠性,但是电路复杂/成本也高。因此目前的EEPROM都是几十千字节到几百千字节的,绝少有超过512K的。例如常见的24C02:广义的EEPROMflash属于广义的EEPROM,因为它也是电擦除的ROM。但是为了区别于一般的按字节为单位的擦写的EEPROM,我们都叫它flash。flash做的改进就是擦除时,不再以字节为单位,而是以块为单位,一次简化了电路,数据密度更高,降低了成本。MB存量的ROM一般都是flash。如W25Q128JVSIQ:flash又分为nor flash和nand flash。(1)nor flash:nor flash数据线和地址线分开,可以实现ram一样的随机寻址功能,可以读取任何一个字节。但是擦除仍要按块来擦。(2)nand flash:nand flash同样是按块擦除,但是数据线和地址线复用,不能利用地址线随机寻址。读取只能按页来读取。(nandflash按块来擦除,按页来读,nor flash没有页),例如:W29N01HVSINA。由于nand flash引脚上复用,因此读取速度比nor flash慢一点,但是擦除和写入速度比nor flash快很多。nand  flash内部电路更简单,因此数据密度大,体积小,成本也低。因此大容量的flash都是nand型的。小容量的2~12M的flash多是nor型的。使用寿命上,nor flash的擦除次数是nand的数倍。而且nand flash可以标记坏块,从而使软件跳过坏块。nor flash 一旦损坏便无法再用。因为nor flash可以进行字节寻址,所以程序可以在nor flash中运行。嵌入式系统多用一个小容量的nor flash存储引导代码,用一个大容量的nand flash存放文件系统和内核。*本文系网络转载,版权归原作者所有,如有侵权请联系删除end微信公众号后台回复关键字“加群”,添加小编微信,拉你入技术群。

    8号线攻城狮 Flash EEPROM

  • 这个问题困惑我很久了!!!

    ▼点击下方名片,关注公众号▼                 图 1 某LDO电路图 2 部分 LDO 内部框图有时候我们会看到LDO稳压输出电路中输出与输入之间会加一下二极管,如上图 1,那么这个二极管是干什么的呢?当输入端断开时,LDO的输入端的电压会降低,如果输出端有容性大负载或并联有大电容则可能导致输出端的电压比输入端的电压下降慢,这将导致LDO的输出电压高于输入电压。如果不加该保护二极管D1,压差过高时对于LDO的伤害是巨大的,从如上图 2 可以看出LDO的输入和输出,分别是三极管的集电极和发射极,对于NPN型晶体管而言,发射极和集电极之间的反向耐压值比较低,加上该保护二极管D1后,由于二极管的钳位作用,使得输出电压最大高于输入电压0.7V。二极管选择需要注意事项:1、当输出端并联有大电容时,需要考虑加上该二极管;2、该二极管的选用普通二极管即可,反向耐压要大于LDO输入电压;end微信公众号后台回复关键字“加群”,添加小编微信,拉你入技术群。

    8号线攻城狮

  • “996”,“超时加班”:违法!

    ▼点击下方名片,关注公众号▼今日下午,21ic获悉,一篇名为《“996”?违法!》的文章引发网友广泛讨论。文章中描述介绍,近日人社部、最高人民法院联合发布《第二批劳动人事争议典型案例的通知》,其中一案“996”工作制被认定为无效,为企业敲响了警钟。21ic家也查阅人社部相关通知,该通知中包含10个具体案例,围绕加班、加班费等关键问题进行了说明,并针对案例分析,明确相关法律意义。其中,最典型的便是员工拒绝“996”被解除合同后获赔的一案。案情显示,张某于2020年6月入职某快递公司,双方订立的劳动合同约定试用期为3个月,试用期月工资为8000元。公司规章制度规定,工作时间为早9时至晚9时,每周工作6天。2个月后,张某以工作时间严重超过法律规定上限为由拒绝超时加班安排,某快递公司即以张某在试用期间被证明不符合录用条件为由与其解除劳动合同。张某向劳动人事争议仲裁委员会申请仲裁,请求裁决某快递公司支付违法解除劳动合同赔偿金8000元。最终,仲裁委员会裁决某快递公司支付张某违法解除劳动合同赔偿金8000元,并将案件情况通报劳动保障监察机构,劳动保障监察机构对某快递公司规章制度违反法律、法规规定的情形责令其改正,给予警告。通知中分析表示,本案的争议焦点是张某拒绝违法超时加班安排,某快递公司能否与其解除劳动合同。《中华人民共和国劳动法》第四十一条规定:“用人单位由于生产经营需要,经与工会和劳动者协商后可以延长工作时间,一般每日不得超过一小时,因特殊原因需要延长工作时间的,在保障劳动者身体健康的条件下延长工作时间每日不得超过三小时,但是每月不得超过三十六小时。”第四十三条规定:“用人单位不得违反本法规定延长劳动者的工作时间。”《中华人民共和国劳动合同法》第二十六条规定:“下列劳动合同无效或者部分无效:……(三)违反法律、行政法规强制性规定的。”案例分析指出,为确保劳动者休息权的实现,我国法律对延长工作时间的上限予以明确规定。用人单位制定违反法律规定的加班制度,在劳动合同中与劳动者约定违反法律规定的加班条款,均应认定为无效。本案中,某快递公司规章制度中“工作时间为早9时至晚9时,每周工作6天”的内容,严重违反法律关于延长工作时间上限的规定,应认定为无效。张某拒绝违法超时加班安排,系维护自己合法权益,不能据此认定其在试用期间被证明不符合录用条件。故仲裁委员会依法裁决某快递公司支付张某违法解除劳动合同赔偿金。典型案例指出,法律在支持用人单位依法行使管理职权的同时,也明确其必须履行保障劳动者权利的义务。用人单位的规章制度以及相应工作安排必须符合法律、行政法规的规定,否则既要承担违法后果,也不利于构建和谐稳定的劳动关系、促进自身健康发展。劳动者依法享有相应的劳动报酬和休息休假权益,遵守国家工时制度是用人单位的法定义务。超时加班极易引发劳动争议,影响劳动关系和谐与社会稳定。“996”是埋在人们心中的一根刺“996”一词是从2019年逐渐传开,引发了全球打工人对于部分互联网公司996工作制的抗议。实际上,“996”式加班早已成为埋在人们心头的一根刺,从互联网没有兴起之就早已存在。根据网友的调查,早在互联网还没有兴起的1995年已经有一些加班多的行业普遍工作6天、每日工作12-18小时;部分IT企业2000年就开始“大小周”、“995.5”;一些企业在07年就率先开始实行“996”上班制度;2012年开始软件工程师加班就已经成为行业共识;2013年开始就已经有部分网友发帖吐槽“996工作制”;而后由“996”还衍生出了“997”甚至“007”的说法。引发网友抗议的导火索事发在2019年1月17日,有赞把自家的年会变成了“鸿门宴”,公开宣称实行996工作制,不仅每天工作长达十一个半小时,一周还要强制上班6天,甚至提早下班还要走年假流程,否则就是旷工。仅隔一个月,京东陆续有员工在社交平台曝光即将开启开启“995”工作模式,依然没有加班费,强制执行。而更令网友心寒的是,在2019年4月11日阿里巴巴内部交流活动上,马云对员工们说,“能做996是一种巨大的福气,很多公司、很多人想996都没有机会。如果你年轻的时候不996,你什么时候可以996?”这番话语引发了网友的一波情绪爆发,翌日,2019年4月12日马云又更新了个人微博,表示“任何公司不应该,也不能强制员工996”“不为996辩护,但向奋斗者致敬!”又强调“年轻人要明白,幸福是奋斗出来的”。在此同时,刘强东也在朋友圈发出长文表示自己做到“8116 8”(指周一到周六6天,从早8点工作到晚11点再加上周日工作8个小时),刘强东还称:“混日子的人不是兄弟!真正的兄弟一定是一起拼杀于江湖,一起承担责任和压力,一起享受成功的成果的人!”该文还强调,京东永远不会强制员工995或者996。2020年7月,“北京一互联网公司被曝工位旁支帐篷”、“白板上还写着不畏加班、不念下班”的新闻冲上热搜。后来还有公司董事长公开号召,鼓励全员开启“硬核奋斗模式”,开启“超级大小周”——大周上7天班,小周上6天班,一个月休2天。吃饭休息时间也从2个小时缩短到了1个小时。终于,这种疯狂式加班还是出事了。2020年12月29日凌晨1点30分,拼多多一位女员工因加班,在回家路上突然捂腹并晕厥倒地,最后被同事送至乌鲁木齐本地医院,在将近6个小时的抢救之后不幸离世。对此,央视也曾评论表示,不能让奋斗变了味。另据调查,不仅是软件工程师、电子工程师所在的IT/通信/电子/互联网行业,建筑业、汽车、生产、加工、制造、金融业、能源等也普遍存在“996”现象。李国庆曾痛批“996”,并解释隐含含义李国庆曾经痛批“996”,他认为996拥有两层涵义:1、996就是老板榨取员工剩余的价值,但合同上也没有标注自己工作时间是996,从法律上挑不出毛病。2、虽然员工996了,但是是出于员工自愿情况下的。具体来说,李国庆表示,“互联网是最带头实行996的,因为互联网的人力资源高管和老总们有一句名言,叫3个人干5个人的活,给4个人的工资。”“虽然工作66小时,比法定工时超过了26小时,不付加班费,这叫老板榨取剩余价值,可以这么说,但是是自愿的,所以大家讨论到法律层面,你找不着老板毛病,因为他跟你签合约的时候,可没说你工作66小时。”“剩下给你签成自愿加班,或者签的工资结构里就是基本工资加上加班费,一拆解找不着毛病,你想起诉打官司很难。”“老板和员工工种不一样。老板吃饭也算工作,可能一场闲散的社交就发现了重大商机,但如果一个程序员一天要写11小时的程序,累个半死,回家倒头就睡,所以最近也暴露出一些码农心理、生活,甚至有自残行为了。”其实李国庆并不是第一个谈及996的企业家,2020年5月,任正非在接受《南华早报》采访时被问及华为的所谓“狼文化”,说科技领域有“996”的说法,华为似乎是“007”,0点工作到0点,每周7天,没有休息的时间。对此,任正非表示“狼文化”可能是被外界曲解了,我们既没有996,也没有007。华为一直以来,都被传“加班狠”和“狼性文化”,“带偏”了一票网络公司。不过,华为的薪资也是在网络公司数一数二的。“大小周”按下“暂停键”,“996”何时休?近期,BOSS直聘取消大小周的新闻登上热搜榜,BOSS直聘曾言:“取消大小周,恢复双休后,员工薪资中的“周末加班费”仍正常发出,薪资总额不变。”此前,快手、字节跳动、美团旗下美团优选相继取消大小周,最近也有包括4399等多家游戏公司也恢复了双休制。还有一些企业开始放弃“996”。光明网评论表示:一家企业的作息时间调整登上热搜榜,说明这件事不仅BOSS直聘几千名员工关心,也触动了全社会的某种关切,那就是每一个劳动者对共同富裕的追求,对获得感、幸福感和安全感的更高要求。当然,伴随着不少公司的决议,“叫好声”之下也有不同的声音。有媒体曝出:没有了大小周及996加班,有员工反而更难受,称损失了6000元一天的加班费,北京房贷都还不上了。当然,也有很多人宁愿不要几千块的加班费也要取消996、大小周。随着法律的声音发出,根据中国新闻网的分析,本次两部门联合向社会公开发布典型案例,一方面提示用人单位违法行为风险,促进依法规范用工;另一方面明确劳动者维权预期,引导劳动者依法理性维权。你怎么看待这件事?你的工作时间是多长?被迫超时加班,你怎么应对?出品 21ic中国电子网 付斌网站:21ic.comend微信公众号后台回复关键字“加群”,添加小编微信,拉你入技术群。

    8号线攻城狮

  • 电子电路工程师常用模拟电路整理(20个)!

    ▼点击下方名片,关注公众号▼一、 桥式整流电路1、二极管的单向导电性:伏安特性曲线:理想开关模型和恒压降模型:2、桥式整流电流流向过程:输入输出波形:3、计算:Vo, Io,二极管反向电压。二、 电源滤波器1、电源滤波的过程分析:波形形成过程:2、计算:滤波电容的容量和耐压值选择。三、 信号滤波器1、信号滤波器的作用:与电源滤波器的区别和相同点:2、LC 串联和并联电路的阻抗计算,幅频关系和相频关系曲线。3、画出通频带曲线。计算谐振频率。四、 微分和积分电路1、电路的作用,与滤波器的区别和相同点。2、微分和积分电路电压变化过程分析,画出电压变化波形图。3、计算:时间常数,电压变化方程,电阻和电容参数的选择。五、 共射极放大电路1、三极管的结构、三极管各极电流关系、特性曲线、放大条件。2、元器件的作用、电路的用途、电压放大倍数、输入和输出的信号电压相位关系、交流和直流等效电路图。3、静态工作点的计算、电压放大倍数的计算。六、 分压偏置式共射极放大电路1、元器件的作用、电路的用途、电压放大倍数、输入和输出的信号电压相位关系、交流和直流等效电路图。2、电流串联负反馈过程的分析,负反馈对电路参数的影响。3、静态工作点的计算、电压放大倍数的计算。七、 共集电极放大电路(射极跟随器)1、元器件的作用、电路的用途、电压放大倍数、输入和输出的信号电压相位关系、交流和直流等效电路图。电路的输入和输出阻抗特点。2、电流串联负反馈过程的分析,负反馈对电路参数的影响。3、静态工作点的计算、电压放大倍数的计算。八、电路反馈框图1、反馈的概念,正负反馈及其判断方法、并联反馈和串联反馈及其判断方法、电流反馈和电压反馈及其判断方法。2、带负反馈电路的放大增益。九、二极管稳压电路十、串联稳压电源十一、差分放大电路十二、场效应管放大电路十三、选频(带通)放大电路十四、运算放大电路十五、差分输入运算放大电路十六、电压比较电路十七、RC振荡电路十八、LC振荡电路十九、石英晶体振荡电路二十、功率放大电路来自:网络,电子电路end微信公众号后台回复关键字“加群”,添加小编微信,拉你入技术群。

    8号线攻城狮 电子电路

  • 倍压整流电路是如何把电压升高的?分析过程你会了吗?

    ▼点击下方名片,关注公众号▼在开始今天的内容之前,先给大家看个电路,让大家开动脑筋先思考一下。左滑动浏览答案怎么样,你分析对了吗?上图的电路图其实是一个倍压整流电路,下面就跟大家分享一下这个小电路的知识。倍压整流电路是利用二极管的导向作用,使电容器进行充放电,几个电容器的电压相互叠加起来,就能获得较高的电压输出了,所以,倍压整流电路在电路中常用来升高电压。我们下面来学习一下它的工作原理,先来看一个二倍压整流电路。需要注意的是,倍压整流电路输入的是交流电,输出的是直流电,一般是使用升压变压器将电压升高,升压后再输入到倍压整流电路。相信大家对交流电峰值电压与有效值之间的关系应该是懂的,这里就不详细讲述了。为方便分析,把变压器输出的电压分成正半周和负半周进行分析,这里把变压器输出电压的峰值电压记为Um,不考虑二极管导通压降的情况下,在交流电正半周到来时,C1充满电后两端电压为Um。如下图所示:而在负半周时,变压器电压与电容C1电压叠加起来给C2进行充电,C2充满电后两端电压为2Um。如下图所示:这就实现了两倍电压的输出了,需要注意的是,如果考虑到二极管的管压降,或者在交流电输入频率太低时通过电容会有一定阻抗情况下,电路输出电压会比理想中的电压要小。如果在上图的二倍压整流电流的基础上再增加二极管和电容器,就可以实现输出电压的增加,比如增加多一个二极管和电容器,就变成了三倍压整流电路。下面一起来分析一下这个电路的工作过程吧。在第一个交流电正半周到来时,电容C1充满电,两端电压为Um,如下图所示:在第一个负半周到来时,变压器和电容C1的电压进行相互叠加,使电容C2充满电,两端电压为2Um,如下图所示:在第二个正半周到来时,变压器电压、电容C2电压、电容C1的电压进行相互叠加(因为电容C1的电压方向是反的,所以最后会抵消掉一个Um),使电容C3充满电,其两端电压为2Um,如下图所示,现在明白了文章开篇问题的答案为什么是了吧。这样一来,负载上得到的电压就是电容C1与电容C3叠加起来的电压了,电压为3Um,实现了三倍升压。如果在后面继续增加二极管和电容器,理论上还能获得更高电压的输出。▲ 图片来源:B站 七彩板当然了,倍压整流电路除了有以上电路形式,还有其它电路形式,比如在电蚊拍电路里用的是这样的一个倍压整流电路:我们下面就来分析一下这是个几倍压的整流电路及其工作原理。首先,在第一个交流电正半周到来时,电容C4进行充电,其两端电压为Um,如下图所示:在第一个交流电负半周到来时,电容C3进行充电,其两端电压为Um,如下图所示:在第二个交流电正半周到来时,电源与电容C3相互叠加,对电容C5进行充电,其两端电压为2Um,如下图所示:在第二个交流电负半周到来时,电源与电容C4相互叠加,对电容C6进行充电,其两端电压为2Um,如下图所示:这样一来,输出电压UO实际为电容C5与C6的电压相互叠加的结果,所以输出电压为4Um,这是一个四倍压整流电路。如果把上图的电路捋一捋,摆整齐一点,电路图实际是下图这样的:需要注意的是,倍压整流电路只适用于需要小电流高电压的环境,否则输出电压会降低,倍压越高的电路,这种因负载电流增大而影响输出电压下降的情况越明显。另外,在器件参数的选择上,要特别注意电容器的耐压值与二极管最高反向工作电压要足够大,否则会有被高电压击穿的风险。end微信公众号后台回复关键字“加群”,添加小编微信,拉你入技术群。

    8号线攻城狮 电压 整流电路 倍压整流

发布文章