历史上的今天
返回首页

历史上的今天

今天是:2024年08月24日(星期六)

2021年08月24日 | 51单片机-隐形漏洞

2021-08-24 来源:eefocus

1.漏洞代码


假如就按上一讲说的书写方式,实现定时50ms间隔的流水灯。


#include  

#include //详见第六章第8讲

 

void main()

{

    LED_Init();    //初始化LED硬件模块

    EA = 1;        //闭合总中断开关

    TMOD = 0x01;   //设置定时器0为工作模式1

    TH0=( 65536-( (50000*110592)/120000 ) )/256;//设置定时时间为50ms     

    TL0=( 65536-( (50000*110592)/120000 ) )%256;

    ET0 = 1;       //闭合定时器0中断的开关

    TR0  = 1;      //启动定时器0 

    while(1);

}

 

void TIM0_IRQHandler() interrupt 1

{

    static u8 i; 

    TH0=( 65536-( (50000*110592)/120000 ) )/256;//重新设置定时时间为50ms      

    TL0=( 65536-( (50000*110592)/120000 ) )%256;

    P0=~(0x01<    i++;

    if(i>=8)i=0;

}


下载进开发板发现根本不是间隔50ms!


进行仿真查看i每次间隔自加所花的时间居然是11ms左右。

8.5.png?imageView2/2/w/550

2.解析漏洞


首先我们要知道,51单片机能存储最大的一个整型数的大小只有4个字节,也就是最多能记忆这个数到4294967296(2的32次方),而在


“( 65536-( (50000)*110592)/120000 )”中明显不能把“(50000*110592)”给临时存储,因为这个等式的得数已经大过2的32次方。所以我们的定时器才会无法实现准确的50ms定时。如果我们对编程没有一定的积累是很难察觉出这个隐形漏洞的。


解决办法就是,我们的定时最小单位只能是10微秒,也就是定时的时间必须是10微秒的整数倍。书写如下


TH0=( 65536-(5000*110592)/12000 ) )/256;


把之前的“50000”和“120000”都去掉一个零,这样就可以准确的定时50ms了,因为“(5000)*110592)”没有超过2的32次方,读者自行修改本讲提供的代码中的4处之后下载进开发板观察现象是不是又实现50ms的间隔流水了。


3.再次优化书写


上处的5000意为定时的是50ms,也就是5000*10微秒,但我们希望潜意识里假如要定时200微秒,如果写成20我们的思维还要绕个弯再把20默默乘以10才领悟出这是定时200微秒。


倒不如这样,我们看到关键的数字是多少那就是要定时多少微秒。


比如看到关键数字为50000时就知道定时的是50000微秒。


所以我们这样改写:TH0=( 65536-( (50000/10)*110592)/12000 )/256;


这样既保证了“(50000/10)*110592”没有超过2的32次方,也使“50000”更直观的让我们知道要定时的是50000微秒。


但是大家要记住,关键数字必须是10的整数倍,如果想定时个208微秒,“(208/10)”还是等于20,所以定时时间还是200微秒。

推荐阅读

史海拾趣

Baumer Electric Ag公司的发展小趣事

1966年,Baumer Electric Ag完成了从个体企业向股份公司的转型。同年,公司推出了测量开关和控制开关,这一创新产品为公司的成功发展奠定了坚实基础。股份制改革为公司带来了更多的资金和资源支持,加速了产品研发和市场推广的进程。

FTDI [Future Technology Devices International Ltd.]公司的发展小趣事

2013年,FTDI推出了最新的嵌入式视频引擎(EVE)技术产品,这一创新标志着公司进入了一个新的技术领域。EVE技术将高度先进的图形控制器、显示器、音频和触摸功能集成到单一芯片中,为智能显示器在各种终端应用中的实现提供了强大支持。这一技术的推出不仅展示了FTDI在图像处理和显示领域的深厚积累,也为其后续在更多领域的拓展奠定了基础。

European Crystal Org公司的发展小趣事

ECO始终将产品质量视为公司发展的生命线。公司建立了严格的质量管理体系,对生产过程中的每一个环节进行严格把关。此外,ECO还注重品牌形象的塑造,通过广告宣传、客户案例分享等方式提升品牌知名度和美誉度。这些努力使ECO在行业内树立了良好的口碑,吸引了越来越多的优质客户。

Elite Enterprises (H K) Co Ltd公司的发展小趣事

随着全球环保意识的提高,Elite Enterprises积极响应绿色环保的号召,将环保理念贯穿于产品的研发、生产和销售全过程。公司采用环保材料和节能技术生产LED产品,并积极参与各种环保公益活动。这些努力不仅提高了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

请注意,以上故事为概述性质,并未达到每个故事500字的详细程度。如需更详细的描述,请查阅公司官方资料或相关新闻报道。

Allied Wire & Cable Inc公司的发展小趣事

随着公司业务的不断发展,Allied公司开始积极拓展产品线,逐渐涵盖了多种类型的电线电缆产品,满足了不同客户的需求。同时,公司还积极开拓新的市场领域,将产品推广至全国范围,并逐渐拓展至国际市场。通过不断的产品创新和市场拓展,Allied公司的业务规模逐渐扩大,市场份额也稳步提升。

Blue Creation公司的发展小趣事

随着国内市场的饱和,Blue Creation公司决定将目光投向海外市场。公司制定了一系列国际化战略,包括设立海外研发中心、拓展销售渠道、加强品牌推广等。经过几年的努力,Blue Creation的产品逐渐打入国际市场,赢得了众多海外客户的认可。同时,公司也积极吸收国际先进技术和管理经验,不断提升自身的竞争力。

问答坊 | AI 解惑

做技术在慢慢培养自己的奴性,变得谨小慎微

做技术在慢慢培养自己的奴性,变得谨小慎微 刚毕业的时候啥也不懂,在公司自然夹着尾巴做人.   工作几年后,技术越来越纯熟了,可是也知道高手时时刻刻在自己的身边.   对自己带的新人,客客气气.对上司恭恭敬敬.  ...…

查看全部问答>

j-link 支持sjflash 下载

在天元买的j-link v8版,经过几天努力,终于可以通过sjflash 烧写nandflash了,经过试验,支持s3c2440烧写k9s1208 和 k9g1g08,s3c2410没有试验!!!!…

查看全部问答>

如何进行WINCE的IP地址的设置和读取

做仪器内一通信菜单程序,需要设定WINCE的IP地址,请问应该怎么做? 谢谢!…

查看全部问答>

万利仿真器软件

今天万利公司网站坏了,打不开了,为了让想下的人能找到特上传万利仿真器软件 一般的都用V2:   好的ME52H用V3: [ 本帖最后由 ddllxxrr 于 2011-1-13 08:53 编辑 ]…

查看全部问答>

15F104E太坑人呀,

replyreload += \',\' + 1321980;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

stm32f051支持IAP功能么

stm32f051支持IAP功能么  我没有找到中断向量表便宜寄存器 能做在线更新固件功能么…

查看全部问答>

基于RM4系列MCU的大数据处理方法

前言: 近年,“云计算”的到来给人们的生活带来了方便、快捷以及前所未有的体验,然而“云计算”时代的到来也意味着“大数据”时代的到来,有资料表明,仅2011这一年就产生了大概4EB(2^60B)的数据量,而且在当前的数字化经济当中,每18个月数 ...…

查看全部问答>

用AD 5933实现电导率测量的研究[转]

1引言 电导率作为重要的电化学分析参数。其测量已经广泛 应用于化工、冶金、生物、医学、粮食和水利等生产与科 研部门【I卅。随着生产和科研的不断深化,对电导率测量 的精度要求越来越高,对其测量方法的研究具有重要的实 际意义。 电导率的 ...…

查看全部问答>