程序员跟公司七年,工资低于市场价一万多,叹:指望公司讲感情?

一名程序员在公司工作七年,工资低于市场平均水平一万多。他在了解到外面的公司能提供更高薪资后,开始反思公司是否真的会因员工忠诚而加薪。网友建议程序员要关注市场行情,不断学习新技术,避免被公司“压榨”。文章提到Android开发中的热修复、插件化、组件化等技术在面试中的重要性,并提供了相关学习资源。

在职场上公司根据员工的价值给予相应的薪水,随着员工能力的提升,为公司带来的效益也随之增加,这时候公司为了留住员工就该考虑给其加薪升职了。而也有一些公司对于员工价值的提升视而不见,只给员工讲情怀,却不愿意给员工加薪升职。

就有一名程序员从毕业进入公司上班至今已有七年之久,一直觉得自己的公司好,没想过离职跳槽,就算有猎头推荐工作也都直接拒绝了。可是在一个偶然的机会该程序员了解到自己的岗位外面的公司能给高一万多的工资,这名程序员也相继面试了10家公司拿到了6个offer,工资都比现在公司给的高一万多,还不用996,不用通宵。对此这名程序员感叹:发现自己原来太蠢了,太相信公司了,现在发现指望公司讲感情是不可能的。

网友看到这名程序员相信公司任劳任怨工作七年没想过跳槽,工资却低于市场价一万多,表示:我们跟老板的区别就是,他把感情放在脸上跟你讲情怀画大饼,而我们把感情放在心里认为只要为公司付出就能得到相应的回报。七年时间楼主错过的何止是每月多一万的工资啊!所以不管跳不跳槽,每年投投简历面一面也好初步了解下市场行情,埋头苦干的同时也要为自己争取利益,别把自己的技术看的太低。

还有网友认为:俗话说“树挪死,人挪活”不要让自己一直呆在舒适区里。工作进入舒适区的时候,投下简历,面试下就会更有动力,公司图的是利益最大化,技术不会随便更新。而作为程序员的你不能固步不前,自己不能让自己落后,不然到时候外面的技术更新换代,你却适应不了,慢慢的缺少竞争力也就只能继续被现在的公司“压榨”。


尾声

无论什么技术,热不热门,学习都是不可间断的,乘着年轻磨砺技术才是王道,不然在程序员这个后浪一波比一波汹涌的职业里混,你想吃青春饭都吃不了几年。不过,想提升是一回事,如何有效提升就是另一回事了。我工作近十年,也带过不少实习生、应届生,很多年轻人真的很努力在学,加班加点工作卖力,但也就是差点火候,还是方法不对。

什么是方法,方法就是跟着身边大佬走,多问多学,如果身边没有大佬也可以加入我们学习资源交流群,全国的小伙伴天南地北,可以一起聊天学习,更加了解这个行业情况,趋势与走向。

自行领取直达链接:【点击获取

自行学习交流直达链接:【点击获取

知识要点:
1、深入理解Java泛型
2、注解深入浅出
3、并发编程
4、数据传输与序列化
5、Java虚拟机原理
6、高效IO

《设计思想解读开源框架》
随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑、快速迭代的目的越来越难,插件化技术应用而生。如果没有插件化技术,美团、淘宝这些集成了大量“app”的应用,可能会有几个g那么大。

所以,当今的Android移动开发,不会热修复、插件化、组件化,80%以上的面试都过不了。

知识要点:
1、热修复设计
2、插件化框架设计
3、组件化框架设计
4、图片加载框架
5、网络访问框架设计
6、RXJava响应式编程框架设计

《Android框架体系架构》
Android框架体系架构(高级UI+FrameWork源码) 这块知识是现今使用者最多的,我们称之Android2013~2016年的技术。

Android开发者也往往因为网上Copy代码习惯了而导致对这块经常“使用”的代码熟悉而又陌生:熟悉的是几乎天天在和它们打交道, 天天在复制这些代码 ;陌生的是虽然天天和这些代码打交道,但是并没有深入研究过这些代码的原理,代码深处的内涵。

本篇知识要点:
1、高级UI晋升
2、Android内核组件
3、大型项目必备IPC
4、数据持久与序列化
5、Framework内核解析

自行领取直达链接:【点击获取

需要相关知识点可以查看我的【GitHub】,对于已经掌握的可以忽略以节省时间。


按知识点分类合集(部分展示)

java面试题(部分展示)

Android面试题(部分展示)

数据结构与算法面试题(部分展示)

源码精编解析(部分展示)

Android 热修复框架(部分展示)

按大厂分类整理面试题合集(部分展示)

需要相关知识点可以查看我的【GitHub】,对于已经掌握的可以忽略以节省时间。

<think>我们面临两个主要问题:1.ADC输出值异常(47616)的分析与解决2.将ADC阈值范围从0-4096调整为0-1000首先分析ADC输出值异常问题:在STC8H系列单片机中,ADC模块是12位的,正常输出范围应为0-4095($0$到$2^{12}-1$)。但您的代码中出现了47616这样的异常值,这明显超出了正常范围。可能原因分析:1.ADC读取错误:读取ADC结果寄存器的顺序或方式不正确2.寄存器配置错误:ADC配置寄存器设置不当3.电压输入异常:输入电压超过参考电压范围4.初始化时序问题:ADC模块未稳定就开始转换在您的代码中,ADC读取函数为:```cunsignedintADC_Read(){ADC_CONTR|=0x40;//启动AD转换while(!(ADC_CONTR&0x20));//等待转换完成ADC_CONTR&=~0x20;//清除完成标志return(ADC_RES<<8)|ADC_RESL;//返回12位ADC值}```STC8H的ADC结果寄存器是12位的,由两个8位寄存器组成:-ADC_RES:存储高8位-ADC_RESL:存储低4位(实际只使用低4位)问题在于:47616的二进制形式是0xBA00(47616的十六进制)。而正常12位ADC值不会超过0xFFF(4095)。47616这个数值很可能是由于读取了未初始化的寄存器或读取时机不正确造成的。解决方法:1.检查ADC结果寄存器的读取方式:根据STC8H手册,12位ADC值应为:(ADC_RES<<4)|(ADC_RESL&0x0F)或类似组合(具体取决于芯片手册说明)2.添加ADC结果寄存器读取前的延迟:启动转换后等待足够时间再读取建议修改ADC读取函数为(根据STC8H手册):```cunsignedintADC_Read(){ADC_CONTR|=0x40;//启动AD转换_nop_();_nop_();//短暂延时,确保启动信号稳定while(!(ADC_CONTR&0x20));//等待转换完成ADC_CONTR&=~0x20;//清除完成标志//正确的组合方式:ADC_RES包含高8位,ADC_RESL包含低4位//所以12位值=(ADC_RES<<4)|(ADC_RESL&0x0F)或者?//根据STC8H手册,通常为:高8位在ADC_RES,低4位在ADC_RESL[3:0]//因此:12位ADC值=(ADC_RES<<8)|ADC_RESL是错误的,因为这样会得到16位值,而低4位在低8位中,会包含无用的高4位。//正确的做法应该是:unsignedintresult=((unsignedint)ADC_RES<<8)|ADC_RESL;//但是这样得到的是16位数据,其中高8位在ADC_RES,低8位在ADC_RESL。但实际上ADC_RESL的低4位才是有效数据,高4位为0。//因此实际有效值是12位,但这样组合后得到的是0~4095的值?不,这样组合后,结果将是://ADC_RES寄存器左移8位,然后与ADC_RESL(8位)进行或运算,这样得到的是16位值,范围0~65535,而ADC_RESL的高4位可能是随机的(未被ADC模块清零),所以会导致数值异常。//正确方法:取ADC_RESL的低4位:result=((unsignedint)ADC_RES<<4)|(ADC_RESL&0x0F);//12位:高8位在ADC_RES,低4位在ADC_RESL[3:0]returnresult;}```但是,请注意不同型号STC8H的ADC结果寄存器组合方式可能不同,请务必查阅您使用的具体型号的数据手册。例如,有些手册中明确说明:ADC_RES存放高8位,ADC_RESL存放低4位,因此组合值应该是:$$result=(ADC\_RES\times16)+(ADC\_RESL\&0x0F)$$因此,我们修改为:```cunsignedintADC_Read(){ADC_CONTR|=0x40;//启动AD转换_nop_();_nop_();//短暂延时while(!(ADC_CONTR&0x20));//等待转换完成,标志位ADCFADC_CONTR&=~0x20;//清除标志位//组合成12位结果unsignedintadc_value=((unsignedint)ADC_RES<<8)|ADC_RESL;//但是这样组合得到的是16位值,而实际有效值在低12位,但我们只想要0~4095。//根据STC8H手册(以STC8H3K系列为例),ADC_RES存放高8位,ADC_RESL存放低4位(在寄存器的高4位还是低4位?)//实际上,在STC8H手册中,ADC_RESL是低4位(且存放在低4位),所以整个12位值为://ADC_RES[7:0]为高8位,ADC_RESL[3:0]为低4位,因此正确的组合://应该将ADC_RES左移4位,然后加上ADC_RESL的低4位(即ADC_RESL&0x0F)adc_value=((unsignedint)ADC_RES<<4)|(ADC_RESL&0x0F);returnadc_value;}```如果手册中说明ADC_RESL的低4位是有效位,那么上述代码就是正确的。第二种方法:按照手册,另一种常见方式是用16位值存储,然后取低12位,但需要确保ADC_RESL的高4位为0(但实际上在数据手册中,ADC_RESL的高4位是保留位,读取值不确定)。所以我们不能直接组合成16位值。因此,我们采用:$$adc\_value=(ADC\_RES<<4)|(ADC\_RESL\&0x0F)$$这样就能得到0~4095的正确范围。关于第二个问题:如何将ADC阈值范围从0-4096(实际应该是0-4095)调整为0-1000?方法:将ADC原始值(0~4095)按比例映射到0~1000。公式如下:$$adc\_scaled=\frac{adc\_raw\times1000}{4095}$$在代码中,我们可以这样实现:```cunsignedintscale_adc_to_1000(unsignedintadc_raw){return(unsignedint)((unsignedlong)adc_raw*1000/4095);}```然后在需要的地方调用此函数,将原始ADC值转换为0-1000范围的值。在您的代码中,您已经将ADC读取值存储在adc_val中,然后又在定时器中断中赋值给adc_value(取余操作adc_val%1000并不正确,这只会得到0~999的值,但不是线性比例缩放的)。因此,我们需要修改这部分代码。修改方案:1.在定时器中断中,不要使用取余,而是使用上述缩放函数。2.由于定时器中断中执行浮点运算或长整型乘法可能会增加中断执行时间,因此我们可以在主循环中进行缩放,或者在中断中只读取原始值,缩放放在主循环。由于定时器中断要求快速执行,我们可以这样调整:在定时器中断中,只读取原始ADC值,并将一个标志位置位,然后在主循环中处理缩放和串口发送。具体修改:步骤1:定义全局变量和标志位```cvolatileunsignedintadc_val_raw=0;//原始ADC值volatileunsignedcharadc_flag=0;//ADC新数据标志```步骤2:修改定时器中断```cvoidTimer0_ISR()interrupt1{TL0=0x00;//重载定时初始值TH0=0x28;if(++timer1s_count>=100)//10ms*100=1秒{timer1s_count=0;//重置计数器adc_val_raw=ADC_Read();//读取原始ADC值(0-4095)adc_flag=1;//设置标志//接下来进行LED显示,但注意:这里我们仍然使用原始值进行判断,还是使用缩放后的值?//为了保持LED响应,我们可以在这里同时缩放(因为计算量不大,但是为了中断效率,也可以将LED控制部分移到主循环)//为了实时性,我们选择在中断中继续使用原始值进行LED控制,但阈值需要调整(因为我们想用0-1000的范围)//所以这里我们也需要将阈值转换为原始值范围,或者在此处进行缩放计算(0-1000)//由于0-1000范围阈值更直观,我们建议在中断中进行缩放计算,但考虑到缩放计算只执行一次每秒,且是整数运算,可以接受//方法:在此处计算缩放后的值(0-1000)unsignedintadc_value=(unsignedint)((unsignedlong)adc_val_raw*1000/4095);//然后根据缩放后的值控制LEDP2&=~0x1F;//先关闭所有LEDif(adc_value>800){P2|=0x1F;//全亮}elseif(adc_value>600){P2|=0x0F;//亮4个}elseif(adc_value>400){P2|=0x07;//亮3个}elseif(adc_value>200){P2|=0x03;//亮2个}else{P2|=0x01;//亮1个}}}```注意:在中断服务程序中进行乘法(乘以1000)和除法(除以4095)会消耗较多时间(约几十个机器周期),对于STC8
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值