历史上的今天
返回首页

历史上的今天

今天是:2024年12月19日(星期四)

正在发生

2018年12月19日 | 51单片机 主循环和中断共享全局变量的冲突

2018-12-19 来源:eefocus

现象:工作中遇到一个大坑,STC11F32的运行灯闪的不均匀,大多数是500ms低电平和500ms高电平,但偶尔会有40ms左右的高、低电平出现,对,就这么简单的一个程序,奇哉怪哉!


//定义全局变量:ms计数器

unsigned int cnt_ms;

//定义全局变量:ms计数器备份

unsigned int cnt_ms_bk;

//定义LED对应的IO口

sbit LED = P3 ^ 3;

//主循环读访问


int main(void)

{

 ......

 if ((cnt_ms - cnt_ms_bk) > 500)

 {

  led = ~led;

  cnt_ms_bk = cnt_ms;

 }

 ......

}


void timer0_interrupt(void) interrupt 1

{

 ......

 TL0 = 0x0cd; //装在1ms定时初值

 TH0 = 0x0f8;

 count_1ms++;

 ......

}


解决方法:主循环程序修改如下,用示波器观察led的闪烁,结果是正常的。

int main(void)

{

 ......

 EA = 0;    //关中断

 if ((cnt_ms - cnt_ms_bk) > 500)

 {

  led = ~led;

  cnt_ms_bk = cnt_ms;

 }

 EA = 1;    //开中断

 ......

}

原因分析:反汇编如下,为分析方便采用16位示例。


 ......

      101:    if ((cnt_ms - cnt_ms_bk) >= 500)

C : 0x0F18    900036   MOV      DPTR, #msLedCtr(0x0036)

C : 0x0F1B    E0       MOVX     A, @DPTR

C : 0x0F1C    F8       MOV      R0, A

C : 0x0F1D    A3       INC      DPTR

C : 0x0F1E    E0       MOVX     A, @DPTR

C : 0x0F1F    F9       MOV      R1, A

C : 0x0F20    A3       INC      DPTR

C : 0x0F21    E0       MOVX     A, @DPTR

C : 0x0F22    FA       MOV      R2, A

C : 0x0F23    A3       INC      DPTR

C : 0x0F24    E0       MOVX     A, @DPTR

C : 0x0F25    FB       MOV      R3, A

C : 0x0F26    900031   MOV      DPTR, #count_1ms(0x0031)

C : 0x0F29    E0       MOVX     A, @DPTR

C : 0x0F2A    FC       MOV      R4, A

C : 0x0F2B    A3       INC      DPTR

C : 0x0F2C    E0       MOVX     A, @DPTR       //在此处被中断

C : 0x0F2D    FD       MOV      R5, A

C : 0x0F2E    A3       INC      DPTR

C : 0x0F2F    E0       MOVX     A, @DPTR

C : 0x0F30    FE       MOV      R6, A

C : 0x0F31    A3       INC      DPTR

C : 0x0F32    E0       MOVX     A, @DPTR

C : 0x0F33    C3       CLR      C

C : 0x0F34    9B       SUBB     A, R3

C : 0x0F35    FF       MOV      R7, A

C : 0x0F36    EE       MOV      A, R6

C : 0x0F37    9A       SUBB     A, R2

C : 0x0F38    FE       MOV      R6, A

C : 0x0F39    ED       MOV      A, R5

C : 0x0F3A    99       SUBB     A, R1

C : 0x0F3B    FD       MOV      R5, A

C : 0x0F3C    EC       MOV      A, R4

C : 0x0F3D    98       SUBB     A, R0

  C : 0x0F3E    FC       MOV      R4, A

 ......


 ......

      282 :   cnt_ms++;

C : 0x09D1    900031   MOV      DPTR, #cnt_ms(0x0031)

C : 0x09D4    E0       MOVX     A, @DPTR

C : 0x09D5    FC       MOV      R4, A

C : 0x09D6    A3       INC      DPTR

C : 0x09D7    E0       MOVX     A, @DPTR

C : 0x09D8    FD       MOV      R5, A

C : 0x09D9    A3       INC      DPTR

C : 0x09DA    E0       MOVX     A, @DPTR

C : 0x09DB    FE       MOV      R6, A

C : 0x09DC    A3       INC      DPTR

C : 0x09DD    E0       MOVX     A, @DPTR

C : 0x09DE    2401     ADD      A, #0x01

C  :0x09E0    FF       MOV      R7, A

C : 0x09E1    E4       CLR      A

C : 0x09E2    3E       ADDC     A, R6

C : 0x09E3    FE       MOV      R6, A

C : 0x09E4    E4       CLR      A

C : 0x09E5    3D       ADDC     A, R5

C : 0x09E6    FD       MOV      R5, A

C : 0x09E7    E4       CLR      A

C : 0x09E8    3C       ADDC     A, R4

C : 0x09E9    FC       MOV      R4, A

C : 0x09EA    900031   MOV      DPTR, #count_1ms(0x0031)

C : 0x09ED    1218B7   LCALL    C ? LSTXDATA(C : 18B7)

 ......

假设在上述位置被中断前cnt_ms的值为0x00FF,cnt_ms_bk的值为0x0000时:R4装载的值为0xFF,本打算给R5装载值0x00,结果被中断打断,中断后cnt_ms++,后其值变为0x0100,中断执行完返回后继续主循环中装载R5,结果给R5装载值0x01,各位现在主循环中使用的cnt_ms为0x01FF了,这样就会造成脉冲的变窄。

我起先老纠结中断时会压栈,会将变量保存。实际中断时保存的是ACC, B, DPTR等寄存器,但是全局变量cnt_ms被保存到了xdata区,DPTR中断前后不变,但其指向的内容(xdata区)已被修改。

推荐阅读

史海拾趣

上海双岭电子(Double-peak)公司的发展小趣事

上海双岭电子自成立以来,一直致力于场效应半导体器件的研发和生产。在成立初期,公司面临着技术瓶颈和市场竞争的双重压力。然而,双岭电子的创始人团队凭借对技术的执着追求和对市场的敏锐洞察,成功研发出具有自主知识产权的结型场效应晶体管,并迅速在航空、通讯等领域打开了市场。这一创新不仅为公司带来了丰厚的利润,也奠定了双岭电子在电子行业中的领先地位。

Akahane Electronics Ind Corp公司的发展小趣事

面对日益严重的环境问题,Akahane敏锐地捕捉到绿色电子产品的市场潜力。公司投入大量研发资源,开发出低能耗、环保的电子产品,并积极推广绿色生产和循环经济理念。这一举措不仅赢得了消费者的青睐,还为公司赢得了良好的社会声誉。同时,Akahane还积极参与国际环保组织的活动,推动电子行业的绿色化发展。

Barry Industries Inc公司的发展小趣事

在国内市场取得一定成绩后,Barry Industries Inc开始积极拓展国际市场。公司参加了多个国际电子展会,与国际知名企业建立了合作关系,成功将产品打入国际市场。同时,Barry还积极寻求与国际先进技术的交流与合作,不断提升自身的技术水平和产品质量。

Analog Microelectronics GmbH公司的发展小趣事

随着电子行业的快速发展,Barry Industries Inc意识到只有不断创新才能在市场中立足。公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。经过多年的努力,Barry成功突破了微波半导体封装技术的多项关键技术,推出了多款性能卓越、具有创新性的产品。这些产品不仅广泛应用于军事、航天、通信等领域,还为公司赢得了市场的广泛认可。

安路科技(Anlogic)公司的发展小趣事

在发展过程中,安路科技积极寻求与产业链上下游企业的战略合作,通过技术合作、市场共享等方式,共同推动FPGA产业的发展。同时,公司也吸引了多家知名投资机构的关注,成功获得了多轮融资。这些资本的注入为安路科技的技术研发和市场拓展提供了强有力的支持。

C&D公司的发展小趣事

C&D公司深知品质是企业的生命线,因此始终坚守品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到生产制造,再到产品出厂,每一个环节都严格把控,确保产品的品质达到最高标准。同时,C&D公司还注重品牌建设,通过广告宣传、社交媒体营销等方式,提升品牌知名度和美誉度。

问答坊 | AI 解惑

认识ARM体系结构的发展

处理器的体系结构定义了指令集(ISA)和基于这一体系结构下处理器的程序员模型。尽管每个处理器 性能不同,所面向的应用不同,每个处理器的实现都要遵循这一体系结构。ARM体系结构为嵌入系统发展 商提供很高的系统性能,同时保持优异的功耗和 面 ...…

查看全部问答>

FPGA、CPLD常用protel库

FPGA、CPLD常用protel库…

查看全部问答>

[51] 郭天祥十天学习51单片机仿真板

大家看一下,怎么样让这个板子上的SOUNDER响啊,用kei软件,C语言编写的程序应该是什么样的,哪位大侠帮我这个刚接触单片机的菜鸟编个程序啊,我怎么弄不响啊?谢谢大家了! QQ:553695150 [ 本帖最后由 tiankai001 于 2010-4-27 10:18 编辑 ]…

查看全部问答>

nrf905通过匹配网络连接50欧姆单端天线问题

现在用nrf905设计开发一个射频智能卡测试平台的无线接口,为增强实验的可靠性,我们在设计了PCB环形差分天线的前提下,通过两个跳线,将芯片的ANT1和ANT2通过匹配网络再连接到SMA天线接口处,以备PCB环形天线不能满足实验要求时,可以经过跳线连接 ...…

查看全部问答>

[求助]求高人帮我看下程序

;-------------------------------------------------------------------------- ;[H1+H2]+[ADR]+[CMD]+[CRC] ;[L1+L2]+[ID]+[TEM_1]+[TEM_2]+[TEM_3]+[TEM_4]+[TEM_5]+[DOOR] ;-------------------------------------------------------------- ...…

查看全部问答>

水质检测器电路

本帖最后由 jameswangsynnex 于 2015-3-3 19:54 编辑   …

查看全部问答>

STM8反汇编

发现用STM8汇编的人很少. 由于一个项目需要用到反汇编. 自己用VC写了一个STM8的反汇编程序. 运行验证没发现有问题. 现共享给大家. 未命名.JPG (227.28 KB) 下载次数:5 2010-7-1 09:45 ...…

查看全部问答>

UCOS的问题请教下。

ARM启动后,设置了PPL时钟工作频率,然后进入main函数执行,在main函数创建启动任务及其他任务,在启动任务里面创建系统滴答时钟定时器。    因为有个模块需要延时100MS复位时间,才能开始工作,初始化时间也要30MS左右。那么我能把这个 ...…

查看全部问答>

Launchpad 所谓 动画

$(\'swf_RHB\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMzY5MjkwNDIw/v.sw ...…

查看全部问答>

我们的发展需要你们的加入

我们寻觅那些卓然不群的开拓者、同样期待那些精益求精的坚守者,而你将成就的是一个远大的梦想、一段激情的旅程。如果不甘寂寞的你渴望今天就开始改变自己、改变世界,请申请加入我们!我们在一览LED英才网上发布招聘信息,期待您的加入。深圳市源 ...…

查看全部问答>