内联汇编器使用汇编器说明符进行调用,后面跟用大括号或括号括起来的汇编器指令序列。以使用“__asm”为例,介绍单行和多行内联汇编。下面的例子显示了内联汇编和真正汇编的区别。嵌入汇编函数语法格式如下:在参数列表中允许使用参数名,但不能用在嵌入式汇编函数体内。......
2023-11-19
由于干扰或程序设计错误等原因,程序在运行过程中可能会偏离正常的顺序而进入到不可预知、不受控制的状态,甚至陷入死循环,我们称之为“飞程序”或“死机”。为防止这种情况造成重大损失,并让系统能够自动恢复正常运行,必须对系统运行进行监控,完成系统运行监控功能的电路或软件称为“看门狗”(Watchdog)电路或“看门狗”定时器。其工作原理是系统在运行过程中,每隔一段固定的时间给“看门狗”一个信号,表示系统运行正常。如果超过这一时间没有给出信号,则表示系统失灵,“看门狗”将自动产生一个复位信号使系统复位,或产生一个“看门狗”定时器中断请求,系统响应该请求,转去执行中断服务子程序,处理当前的故障,如停机或复位等。
“看门狗”有如下特性:
1)本身能独立工作,基本上不依赖于CPU。CPU只在一个固定的时间间隔内与之打一次交道,表明整个系统“目前尚属正常”。
2)若CPU落入死循环,能及时发现并使整个系统复位。
“看门狗”技术可由硬件实现,也可由软件实现,还可由软、硬件结合实现。
1.硬件“看门狗”电路
硬件实现可以采用带有“看门狗”功能的系统监控芯片,如MAX705/706/813L,其“看门狗”定时器时序如图10-11所示。硬件实现电路如图10-12所示。
图10-11 MAX705/706/813L“看门狗”定时器时序图
图10-12 MAX705/706/813L系统监控电路图
如果在时间tWD=1.6ms之内不触发“看门狗”输入引脚WDI,则“看门狗”输出引脚将由高电平变为低电平。触发“看门狗”的方法是在WDI引脚加一个正脉冲。通常用单片机的一个I/O口(如P1.0)来控制WDI,而将接到单片机的中断输入引脚(如
),如图10-12所示。系统通过软件不断在I/O口输出正脉冲使WDO保持高电平,两次脉冲时间间隔不大于1.6 ms,则
永远为高电平,说明程序执行正常。一旦单片机不能正常工作,如程序跑飞或陷入死循环,则程序不能按时向I/O口发出脉冲,当两次发出正脉冲的时间间隔大于1.6 ms时
将变为低电平,使单片机产生一个中断,“看门狗”定时器中断服务子程序将对系统做相应处理,使程序恢复正常运行,并重新触发WDI,则
又回到高电平并从“0”开始计时。也可把
接到手动复位端
,直接产生一个复位信号使系统复位,保证系统重新工作。
2.软件“看门狗”
由硬件电路实现的“看门狗”技术,可以有效地克服主程序或中断服务程序由于陷入死循环而带来的不良后果。但在工业应用中,严重的干扰有时会破坏中断方式控制字,导致中断关闭,这时硬件“看门狗”电路的程序将不能实现。采用软件进行双重监视,可以弥补这一不足。
软件“看门狗”技术的基本思路是在主程序中对T0中断服务程序进行监视,在T1中断服务程序中对主程序进行监视,T0中断监视T1中断。这种相互依存、相互制约的抗干扰措施使系统运行的可靠性大大增加。(www.chuimin.cn)
系统软件包括主程序、高级中断子程序和低级中断子程序3个部分。假设将定时器T0设计成高级中断、定时器T1设计成低级中断,从而形成中断嵌套。
主程序流程图如图10-13所示。主程序在完成系统测控功能的同时,还要监视T0中断因干扰而引起的中断关闭故障。A0为T0中断服务程序运行状态观测单元,T0中断运行时,每中断一次A0便自动加1。在测控功能模块运行程序(主程序的主体)入口处,先将A0之值暂存于E0单元。由于测控功能模块程序一般运行时间较长,设定在此期间T0产生定时中断(设T0定时溢出时间小于测控功能模块运行时间),从而引起A0的变化。在测控功能模块的出口处,将A0的即时值与先前的暂存单元E0的值相比较,观察A0的值是否发生变化。若A0之值发生了变化,说明T0中断运行正常;若A0之值没变化,说明T0中断关闭,则转到0000H处,进行出错处理。
T1中断程序流程如图10-14所示。T1中断服务程序在完成系统特定测控功能的同时,还监视主程序的运行状态。在中断服务程序中设置一个主程序运行计时器M,T1每中断一次,M便自动加1。M中的数值与T1定时溢出时间之积表示时间值。若M表示的时间值大于主程序运行时间T(为可靠起见,T要留有一定余量),说明主程序陷入死循环,T1中断服务程序便修改断点地址,返回0000H,进行出错处理。若M小于T,则中断正常返回。M在主程序入口处循环清0,如图10-13所示。
T0中断程序流程如图10-15所示。T0中断服务程序的功能是监视T1中断服务程序的运行状态。该程序较短,因而受干扰破坏的几率很小。A1、B1为T1中断运行状态的观测单元。A1的初始值为00H,T1每发生一次中断,A1便自动加1。T0中断服务程序中若检测A1>0,说明T1中断正常;若A1=0,则B1单元加1(B1的初始值为00H);若B1的累加值大于Q,说明T1中断失效,失效时间为T0定时溢出时间与Q值之积。Q值的选取取决于T1、T0定时溢出时间。例如,T0定时溢出时间为10ms,T1定时溢出时间为20ms,当Q=4时,说明T1的允许失效时间为40ms,在这样长的时间内,T1没有发生中断,说明T1中断出现了故障。由于T0中断级别高于T1中断,所以T1的任何中断故障(死循环、故障关闭)都会因T0的中断而被检测出来。
若系统受到干扰,主程序可能发生死循环,而中断服务程序也可能陷入死循环或因中断方式字的破坏而关闭中断。主程序的死循环可由T1中断服务程序进行监视,T0中断的故障关闭可由主程序进行监视,T1中断服务程序的死循环和故障关闭可由T0的中断服务程序进行监视。由于采用了多重软件监测方法,大大地提高了系统运行的可靠性。
3.软、硬件结合的“看门狗”技术
硬件“看门狗”技术能有效监视程序陷入死循环,但对中断关闭故障无能为力;软件“看门狗”技术对高级中断服务程序陷入死循环无能为力,但能监视全部中断关闭的故障。因此,可将硬件“看门狗”和软件“看门狗”结合起来,取长补短,获得更加优良的抗干扰效果。
图10-13 主程序流程图
图10-14 T1中断程序流程图
图10-15 T0中断程序流程图
有关单片机基础及应用的文章
内联汇编器使用汇编器说明符进行调用,后面跟用大括号或括号括起来的汇编器指令序列。以使用“__asm”为例,介绍单行和多行内联汇编。下面的例子显示了内联汇编和真正汇编的区别。嵌入汇编函数语法格式如下:在参数列表中允许使用参数名,但不能用在嵌入式汇编函数体内。......
2023-11-19
Linux统按照文件中数据的特点对文件划分不同的类别,称做文件类型。Linux系统提供了一个file命令用来查看文件的类型,执行file<文件名>即可得到指定文件的类型。目录的第一项是目录本身,以“.”作为目录本身的名称。......
2023-11-19
上面介绍了字符设备驱动程序的重要的数据结构,那么如何设计一个字符设备驱动程序的数据结构?字符设备驱动程序的初始化流程一般可以用如下的过程来表示:定义相关的设备文件结构体[如file_operation()中的相关成员函数的定义]。向内核申请主设备号。内核提供了三个函数来注册一组字符设备编号,这三个函数分别是:alloc_chrdev_region()、register_chrdev_region()和register_chrdev()。所以在一般的字符设备驱动程序中,不会看到对cdev的操作。这里举出字符设备驱动程序的常见的两种编程架构。......
2023-11-19
在Linux系统中,文件系统可以根据需要随时装载。mount-text3/dev/hdal/mnt表示把刚才格式化好的IDE硬盘第一个分区挂载到/mnt目录下,并且指定了分区的文件系统类型是ext3。mount命令通过-t参数指定挂载文件系统的类型,还可以使用-o参数指定与文件系统相关的选项,例如数据的处理方式等。为了保证文件系统的完整性,在关闭文件系统之前,所有挂载的文件系统都必须卸载。umount/mnt表示把挂载在/mnt目录下的文件系统卸载。......
2023-11-19
嵌入式系统的发展大致经历了嵌入式微控制器、嵌入式微处理器和嵌入式数字信号处理器、嵌入式片上系统和以Internet为标志的嵌入式系统等阶段。嵌入式系统的出现最初是基于单片机的,这一阶段的嵌入式系统硬件是单片机,软件停留在无操作系统阶段,采用汇编语言实现系统的功能。第四阶段是以Internet为标志的嵌入式系统。......
2023-11-19
在Linux下使用socket()函数来创建套接字,其函数原型为:int socket;各参数含义如下。这种套接字计算机只管传输数据,不作数据校验,如果数据在传输中损坏,或者没有到达另一台计算机,是没有办法补救的。表8.1协议族与socket类型续表3.protocol表示传输协议常用的有IPPROTO_TCP和IPPTOTO_UDP,分别表示TCP传输协议和UDP传输协议。因此可通过如下方法创建TCP套接字和UDP套接字。int socket=socket;//创建TCP套接字int socket=socket;//创建UDP套接字......
2023-11-19
a.out来自于Unix C编译程序默认的可执行文件名。ELF格式已经被Linux系统作为标准的格式采用。当使用gcc时,gcc会完成预处理、编译、汇编和连接。GCC支持数种调试和剖析选项。gcc提供了一个很多其他C编译器里没有的特性,在gcc里能使-g和-O连用。......
2023-11-19
按照惯例,所有的Makefile变量都应该是大写。如果变量的值发生变化,就只需要在一个地方修改,从而简化了Makefile的维护。现在利用变量把前面的Makefile重写一遍:除用户自定义的变量外,make还允许使用环境变量、自动变量和预定义变量。需要注意的是,如果用户在Makefile中定义了同名的变量,用户自定义变量将覆盖同名的环境变量。此外,Makefile中还有一些预定义变量和自动变量,但是看起来并不像自定义变量那样直观。......
2023-11-19
相关推荐