文档库 最新最全的文档下载
当前位置:文档库 › 驱动-异常处理结构、中断处理结构

驱动-异常处理结构、中断处理结构

驱动-异常处理结构、中断处理结构
驱动-异常处理结构、中断处理结构

一,Linux 异常处理体系结构框架:

1,按键按下时。

强制的跳到异常向量处执行(中断是异常的一种)。

2,CPU 发生中断。

3,“入口函数”是一条跳转指令。跳到某个函数:(作用)

将2440 作为单片机使用时:裸机程序时

②,执行中断处理函数。

③,恢复被中断的现场。

①,保存被中断处的现场(各种寄存器的值)。

LINUX 中处理中断的过程:

1,写程序时先设置异常入口:

发生“中断”时,就跳到0x18

地址处,跳转到“HandleIRQ”是执行下面的指令:

中断处理完后,要返回去继续执行之前被中断的那个程序。

保存寄存器就是保存中断前那个程序的所用到的寄存器。

然后是处理中断,最后是恢复。

linux 中:

异常向量在哪里:

LINUX 异常处理结构、中断处理结构:

2012年2月23日

11:03

①,LINUX的异常向量在哪里:

ARM架构的CPU的异常向量基址可以是 0x0000 0000,也可以是 0xffff0000,LINUX内核

使用后者,只需要在某个寄存器里设置下,就可以将异常基址定位到这里来。这个地址并不代表实际的内存,是虚拟地址。当建立了虚拟地址与物理地址间的映射后,得将那些异常向量,即相当于把那些跳转指令(如:HandleSWI 等)复制拷贝到这个 0xffff0000这个地址处去。(“那些跳转指令”是指head.S中那些跳转)。

这个过程是在trap_init这个函数里做。

trap_init函数将异常向量复制到0xffff0000处,部分代码如下:

如上:

将 __vectors_start, __vectors_end -__vectors_start 这段代码拷贝到 vectors来。

将 __vectors_start, __vectors_end -__vectors_start 这段代码拷贝到 vectors来。

vectors是“CONFIG_VECTORS_BASE” 是个配置项(内核的配置选项)。

在linux源码顶层目录下:vim .config, 搜索“CONFIG_VECTORS_BASE”。

我的内核配置文件这个地址是“0xffff0002”和书上的不同。

__vectors_start 在 entry-armv.S 中定义,也是些跳转指令。

可见和单片中的一样(都是跳转指令)。

A:假设发生了 vector_und (undefined)异常未定义指令后,会跳转到 vector_und 加一个偏移地址

stubs_offset(b vector_und + stubs_offset)。这个 vector_und 地址标号源代码里没有,它是一个宏:

将这个宏展开:

将这个宏展开:

===========================================vector_stub und, UND_MODE这个宏展开替换下面的语句:

.macro vector_stub, name, mode, correction=0(.macro 开始定义宏)

把宏展开,上面的name就是"und"。则下来替换后,“vector_\name”就成了“vector_und”vector_\name:(变成vector_und: )定义了一个vector_und标号。做的事情如下。

.if \correction因为上面“correction=0”,即这里是:.if 0.所以if...endif 间的代码忽略。

sub lr, lr, #\correction

.endif(这三句因为"correction=0,忽略不要")

@

@ Save r0, lr_ (parent PC) and spsr_先保存。

@ (parent CPSR)

@

stmia sp, {r0, lr} @ save r0, lr

mrs lr, spsr

str lr, [sp, #8] @ save spsr

@

@ Prepare for SVC32 mode. IRQs remain disabled.转换到管理模式。

@

mrs r0, cpsr

eor r0, r0, #(\mode ^ SVC_MODE)

msr spsr_cxsf, r0

@

@ the branch table must immediately follow this code这里是下一级跳转

@

and lr, lr, #0x0f

mov r0, sp

ldr lr, [pc, lr, lsl #2]

movs pc, lr @ branch to handler in SVC mode

.endm(.endm 结束宏定义)

.endm (.endm 结束宏定义)

这里是下一级的跳转,跳转表如下:①,name

是und

.if \correction

sub lr, lr, #\correction

.endif

②,correction=0默认是0,则:

则这三句不用管。

后面 __und_usr等标号中,去保存那些寄存器,作处理。处理完后,再恢复那些寄存器,即恢复那些被中断的程序。

③,下一级跳转表:

B:下面是一个实例:在 entry -armv.S 源码中的第1069行:

B:下面是一个实例:在 entry -

armv.S 源码中的第1069行:

发生中断便跳转到这里。这个地址标号“vector_irq”在代码中也没有。也是一个宏来定义的:vector_stub irq, IRQ_MODE, 4 这里是一个宏,将这个宏和宏参数替换到下面的宏定义中去:

“name ”为“irq ”.

“correction ”为“4”。

.align 5

.macro vector_stub, name, mode, correction=0.if \correction 宏替换后:.if 4

vector_\name: 宏替换后:vector_irq:

也是和上面的“vector_stub und, UND_MODE”一样,是用下面的宏展开:

.if \correction宏替换后:.if 4

sub lr, lr, #\correction宏替换后:sub lr, lr, #4

.endif

这里宏替换后就变成:

vector_irq:

.if 4

sub lr, lr, #4

.endif

"sub lr, lr, #4"这是计算返回地址,比较裸机程序:

“F:\embedded\嵌入式LINUX开发完全手册\嵌入式LINUX开发完全手册光盘\视频\ask100_example\int”下的:head.S

@

@ Save r0, lr_ (parent PC) and spsr_转换到“管理模式”。

@ (parent CPSR)

@

stmia sp, {r0, lr}@ save r0, lr

mrs lr, spsr

str lr, [sp, #8]@ save spsr

@

@ Prepare for SVC32 mode. IRQs remain disabled.

@

mrs r0, cpsr

eor r0, r0, #(\mode ^ SVC_MODE)

msr spsr_cxsf, r0

@

@ the branch table must immediately follow this code这里是下一级跳转

@

and lr, lr, #0x0f

mov r0, sp

ldr lr, [pc, lr, lsl #2]

movs pc, lr@ branch to handler in SVC mode

.endm

下一级跳转的跳转表:

__irq_usr : 应该是用户态发生中断时,就跳转到“__irq_usr ”标号中去。

__irq_svc:在管理模式里发生中断时,就跳转到“__irq_svc”这个标号中去。

上面的跳转表,从名字上猜测:

查看标号“__irq_usr ”:

这个宏 usr_entry 应该是保存那些寄存器。搜索“usr_entry

”的宏定义如下:

在这个栈(sp )中将寄存器保存进去。

接着再看:__irq_svc

标号的实现,会有个:

"irq_handler"也是一个宏:

"irq_handler"

也是一个宏:

从上面的宏定义可以看到,最终会调用一个 asm_do_IRQ .就是处理函数,比较复杂的代码就用C语言实现。总结:linux 内核中处理异常的流程,最后调用到“asm_do_IRQ()”

①,异常向量:

首先“trap_init”构造了“异常向量”。

②,异常向量是什么?

异常向量就是将这段代码“__vectors_start”拷贝到0xffff0000“vectors”处:

最后是调用:

异常向量就在这里。这“异常向量”也是某些跳转。如:“b vector_irq + stubs_offset”因为向量已重新定位了,所以得加上“stubs_offset”偏移地址。“vector_irq”是链接地址,要加上一个偏移地址才能正确的跳转。

③,vector_irq 做的事:

它是由一个宏定义的。做的事和单片机程序一样。

a,计算返回地址:sub lr, lr, #4

b, 保存寄存器值:

c,调用处理函数(如:__irq_usr若用户态发生中断,就跳转到这个标号处。)

d, 处理函数又去调用“宏”:如"__irq_usr"标号处理是“usb_entry”宏,此宏先保存环境变量诸多寄存器。然后就调用宏“irq_handler”。此宏的定义会调用函数“asm_do_IRQ”。

如: __irq_usr:

usr_entry(这个宏也是保存些寄存器)

irq_handler(从__irq_usr后调用这个函数,它也是一个宏。)

asm_do_IRQ(irq_hander这个宏是做asm_do_IRQ函数) e:恢复(调用完asm_do_IRQ函数后)

==================================================

二,LINUX的中断框架:内核中断框架

了解“asm_do_IRQ”,理解中断处理的过程。

A,单片机下的中断处理:

1,分辨是哪个中断。

2,调用处理函数(哪个中断就调用哪个处理函数)。

3,清中断。

1,上面是先读寄存器“INTOFFSET”,看是哪个中断。

2,中间是中断处理。

3,最后是清中断。

内核的也差不多。

以上单片机的3个过程,都是在 asm_do_IRQ 中实现的。最终在“handle_irq”中实现的。

struct irq_desc *desc = irq_desc + irq;

1,首先是根据传进来的 IRQ 中断号(参1),

irq_desc 是一个数组。在“Handle.c”中定义:

B,内核的中断处理:

从名字上看可知这是一个“中断描述”数组。以中断号“NR_IRQS”为下标。

struct irq_desc *desc = irq_desc + irq;

在这个数组下标处取到一个“数组项”。

irq_enter();不用管。

然后进入处理:

desc_handle_irq(irq, desc);

asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)

-->struct irq_desc *desc= irq_desc + irq;

desc_handle_irq(irq, desc);

static inline void desc_handle_irq(unsigned int irq, struct irq_desc *desc)

--> desc->handle_irq(irq, desc);

desc->handle_irq(irq, desc);

即为:

(irq_desc + irq)->handle_irq(irq, desc);

desc是全局数组“irq_desc(中断号为下标) ”

裸机程序中的3过程是在这个“handle_irq”中实现的。

2,查找“handle_irq”时,发现它有在“/kernel/irq/Chip.c”中的“__set_irq_handler()”函数中有被用到。

在“chip.c”的如下函数中有调用过“handle_irq”:

V oid__set_irq_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained, const char *name)

-->desc->handle_irq = handle;

接着查“__set_irq_handler()”这个函数有谁调用过。在Irq.h中:

接着查“__set_irq_handler()”这个函数有谁调用过。在Irq.h中:

再搜索“set_irq_handler”时在“arch/arm/plat -

s3c24xx/Irq.c”中找到一个函数:

下面是在"Chip.c"中

是以形参“irq”这索引,在“irq_desc”中断描述数组中找到一项,将这一项给“desc”.

将通过“形参irq”索引找到的那一项“desc”的“handle_irq”指向传进函数“__set_irq_handler”的形参“irq_flow_handler_t handle”。

这样显然在“void __init s3c24xx_init_irq(void)”函数中就构造了这个数组的很多项。

这个函数中有:

结构体“desc”的原型的成员:

在这个“irq_desc”结构中有“handle_irq”等于“某个函数”;如下举例,看此结构成员handle_irq 等于什么函数,"*chip" 等于什么函数。

在Irq.c 中/*external interrupts*/外部中断中。

IRQ_EINT0到IRQ_EINT3(外部中断0到外部中断3)。设置了上面结构中的“handle_irq ”和“*chip

举例:IRQ_EINT0到IRQ_EINT3:

1,成员“handle_irq

”:

如上外部中断0“IRQ_EINT0”(从名字猜测这是中断号),在\arch-s3c2410\Irqs.h中有定义。那么“16”这个数组项(irq_desc[16])的“handle_irq”就等于这个函数“handle_edge_irq”边缘触发。(set_irq_handler(irqno, handle_edge_irq);)

从“handle_edge_irq ”名字中“edge

”可猜测到是处理那些边缘触发的中断。

2,成员“

*chip ”:

对于上面的“set_irq_chip(irqno, &s3c_irqext_chip);”也是找到相应的数组项:

所以这里“chip”等于“s3c_irq_eint0t4”是s3c外部中断0-4.

Irq_desc[外部中断4 到外部中断23]

举例2:外部中断IRQ_EINT4;到外部中断 IRQ_EINT23

Irq_desc[外部中断4 到外部中断23]

Handle_irq = handle_edge_irq;

Chip = s3c_irqext_chip;

总结:

Irq_desc[外部中断0 ~ 3 ]:

Handle_irq = handle_edge_irq;

Chip = s3c_irq_eint0t4;

Irq_desc[外部中断 4 到外部中断23]:

Handle_irq = handle_edge_irq;

Chip = s3c_irqext_chip;

以上就是初始化,在“void __init s3c24xx_init_irq(void)”中实现的。

中断处理C函数入口 “asm_do_IRQ”会调用到事先初始的“handle_irq”函数。如外部中断调用

“handle_edge_irq”.是处理边缘触发的中断。

void __init s3c24xx_init_irq(void)

-->for (irqno = IRQ_EINT0; irqno <= IRQ_EINT3; irqno++) {

set_irq_chip(irqno, &s3c_irq_eint0t4);

set_irq_handler(irqno, handle_edge_irq);

}

for (irqno = IRQ_EINT4; irqno <= IRQ_EINT23; irqno++) {

set_irq_chip(irqno, &s3c_irqext_chip);

set_irq_handler(irqno, handle_edge_irq);

}

在函数“/kernel/irq/Chip.c”中,可以看到“handle_edge_irq”做的事情。

void fastcall handle_edge_irq(unsigned int irq, struct irq_desc *desc)

-->kstat_cpu(cpu).irqs[irq]++; /* 发生了多少次中断的计数*/

-->desc->chip->ack(irq); /* Start handling the irq 开始处理中断*/

-->if (unlikely(!action)) { /*这里是出错处理。 action是链表。若此链表为空 */

desc->chip->mask(irq); /* 若链表为空则屏蔽中断 */

goto out_unlock;

}

-->action_ret = handle_IRQ_event(irq, action); /* 这是真正的中断处理过程*/

action_ret = handle_IRQ_event(irq, action);

其中"irq"是“handle_edge_irq”参1;“action”是“struct irqaction *action = desc->action;”参2结构中的成员。

handle_edge_irq(unsigned int irq, struct irq_desc *desc)

总结:

handle_edge_irq

-->desc->chip->ack(irq). 清中断

-->handle_IRQ_event(irq, action). 处理中断

“handle_edge_irq”的处理过程:处理边缘触发的中断。

①,desc->chip->ack(irq):清中断

假设是如下外部中断,irq.c 中“s3c24xx_init_irq()”初始化中断中:

在“chip :s3c_irqext_chip”定义如下:desc->chip 就是“s3c_irqext_chip ”:

S3c_irqext_chip 名字上猜测是irq(中断)ext(外部)

.ack = s3c_irqext_ack,

那么:desc->chip->ack :这个成员"ack"即:

static void s3c_irqext_ack(unsigned int irqno)

-->mask = __raw_readl(S3C24XX_EINTMASK); /* 读出外部中断屏蔽寄存器*/

-->__raw_writel(bit, S3C24XX_EINTPEND); /* 外部中断等待寄存器‘pending’。这里是清0*/

从这个函数的具体实现,可知它应该是“清中断”。

②,

如果链表“action”是空的,就将它屏蔽。(出错处理)

取出链表action中的成员,执行“action ->handler()”。

③,handle_IRQ_event 这是真正的正理过程:处理中断。

linux-2.6.22.6\arch\arm\kernel\entry-armv.S 中1,CPU自动进入“异常模式”。调用“异常处理函数”。

2,在“异常处理函数”中如跳到“b vector_irq + stubs_offset”。

总结:“中断框架”(按下按键)。

“vector_irq”是一个宏定义的。找到这个“宏”,假设它调用“__irq_usr”。

vector_stub irq, IRQ_MODE, 4

此宏展开:

Vector_irq:

Sub lr, lr, #4

@

@ Save r0, lr_ (parent PC) and spsr_

@ (parent CPSR)

@

stmia sp, {r0, lr}@ save r0, lr

mrs lr, spsr

str lr, [sp, #8]@ save spsr

@

@ Prepare for SVC32 mode. IRQs remain disabled.

@

mrs r0, cpsr

eor r0, r0, #(\mode ^ SVC_MODE)

msr spsr_cxsf, r0

@

@ the branch table must immediately follow this code

@这里调用某个列表。如下图:

and lr, lr, #0x0f

mov r0, sp

ldr lr, [pc, lr, lsl #2]

movs pc, lr

@ branch to handler in SVC mode Array假若是调用的列表中的“__irq_usr”。

3,调用到列表中的“__irq_usr”后,可以具体分析这个“__irq_usr”中处理的情况:

3,调用到列表中的“__irq_usr”后,可以具体分析这个“__irq_usr”中处理的情况:

__irq__usr 是用户态中断。

“usr_entry”这是它的入口,其中保存寄存器(中断现场)。

,这也是一个宏。

再调用“irq_handler”

最终会调用到“asm_do_IRQ”这个C函数。

4,“asm_do_IRQ”调用“irq_desc[IRQ中断下标]以中断为下标取出里面的一项“handle_irq””

desc->handle_irq(irq, desc);指向谁:

举例说明:在:linux-2.6.22.6\arch\arm\plat-s3c24xx\Irq.c中,s3c24xx_init_irq(void)初始化中

断时,若是外部中断0-3,或外部中断4-23 时,,指向“handle_edge_irq

函数”Array

,指向“handle_edge_irq函数”

5,“handle_edge_irq”做的事:

①,desc->chip->ack()清中断

①,desc->chip->ack() 清中断

②,handle_IRQ_event() 处理中断

③,取出“action”链表中的成员,执行“action ->handler”。

分析“irq_desc[]”结构数组:里面有“action 链表”,有“chip

”等。

首先是清中断,然后把链表“action”中的成员

取出,一一执行里面的“action ->handler”

handle_irq:是函数指针。在上面的例子中这个函数指针指向了“handle_edge_irq”。

起动、关闭、使用、禁止、ack响应中断(响应中断即清中断而已)、

这个结构体“irq_chip”作些底层的操作:

*chip :是芯片相关底层的一些处理函数。在例子中是指向"&s3c_irqext_chip”

6,核心在“irq_desc ”

结构数组:

里面有:handler(处理函数),还有“flags”等。

*action:中断的动作列表。

里面有:handler(处理函数),还有“flags”等。 以上1-

6都是系统做好的,这便是系统的“中断处理框架”。

但是我们写中断处理时,是想执行自已的中断代码。那么我们的代码就应该在“action ->handler”这里。我们要用“request_irq()”告诉内核我们的处理函数是什么。

LINUX内核中断框架:

首先内核中有个数组“irq_desc[]”IRQ的描述结构数组,这个结构数组是以“中断号”为下标。

handle_irq:中断入口函数。这个入口函数中,是做清中断,再调用action链表中的各种处理函数。

chip: 指向底层硬件的访问函数,它做屏蔽中断、使能中断,响应中断等。

action:链表头,它指向“irqaction结构”,这个结构中存放“handler用户注册的中断处理函数”等。

结构中有:

我们想使用自已的中断处理函数时,就是在内核的这个中断框架里在其中的“action链表”中添加进我们的“中断函数”。

中断异常处理流程

计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种机制。异常主要是从处理器被动接受的角度出发的一种描述,指意外操作引起的异常。而中断则带有向处理器主动申请的意味。但这两种情况具有一定的共性,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。若无特别说明,对“异常”和“中断”都不作严格的区分。本文结合经过实际验证的代码对ARM9中断处理流程进行分析,并设计出基于S3C2410芯片的外部中断处理程序。 1.异常中断响应和返回 系统运行时,异常可能会随时发生。当一个异常出现以后,ARM微处理器会执行以下几步操作: 1) 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。 2)将CPSR复制到相应的SPSR中。 3)根据异常类型,强制设置CPSR的运行模式位。 4) 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。 这些工作是由ARM内核完成的,不需要用户程序参与。异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回: 1)将连接寄存器LR的值减去相应的偏移量后送到PC中。 2)将SPSR复制回CPSR中。 3) 若在进入异常处理时设置了中断禁止位,要在此清除。 这些工作必须由用户在中断处理函数中实现。为保证在ARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序。当异常处理完成以后,返回到主程序继续执行。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。 2.异常处理程序设计 2.1 异常响应流程

品质异常处理流程模板

品质异常处理流程 (公开文件,共4页) 一、目的: 规范品质异常处理流程,提高品质异常处理的时效性,确保来料质量及生产的正常运转,同时满足顾客的质量要求。 二、范围: 适用于本公司来料、制程、出货品质异常的处理。 三、定义: 3.1 来料品质异常: a、不符合相关检验标准要求,且不良率超过质量目标时; b、合格物料制程中发现重点物料不合格时; c、有经过改善且有效果确认,但又重复发生品质异常时。 3.2 制程品质异常: a、使用不合格的原料或材料; b、同一缺陷连续发生; c、不遵守作业标准或不遵守工艺要求; d、机械发生故障或精度磨损; e、其他情形影响到产品质量时。 3.3 出货品质异常: a、客户投诉或抱怨; 四、职责 4.1 来料品质异常: 品质:a.负责填写《品质异常联络单》“异常描述”部分; b.负责将《来料检验报告》、《品质异常联络单》发送于采购,抄送工程、生产; c负责品质异常改善结果确认。 采购:负责将《来料检验报告》、《品质异常联络单》发送给供应商并及时与供应商联系跟踪供应商及时回复“原因分析”“纠正与预防措施”并将结果回复品质部. 4.2 制程品质异常: 品质部: a,负责品质异常之最终判定; b,负责确认品质异常责任部门; c,负责主导品质异常案例的处理过程; d,负责对责任单位的改善结果进行追踪确认

异常责任单位: a负责品质异常的原因分析,提出临时措施及长期改善对策并执行。 生产部: a负责品质异常的改善和预防措施的实施及验证改善措施的有效性; 其它相关单位: a在需要时进行异常改善的配合 4.3 出货品质异常: 品质部: a负责将品质异常通知各部门及确定责任部门; b负责异常改善后的跟踪确认; c负责处理客户抱怨 异常责任单位: a负责品质异常的原因分析,提出临时措施及长期改善对策并执行。 生产部: a负责品质异常的改善和预防措施的实施及验证改善措施的有效性; 营业部: a负责将客户抱怨反馈给相关部门。 其它相关单位: a在需要时进行异常改善的配合 五、工作程序: 5.1 进料品质异常: 5.1.1 依相关检验标准判定不合格,针对不合格物料标示“不合格”,并立即移至不良品区域。 5.1.2 异常成立4小时内开立《品质异常联络单》通知采购。 5.1.3 采购接《品质异常联络单》后4小时内转责任供应商。 5.1.4 供应商需于1个工作日内针对异常物料提出临时对策,如对异常内容有疑问,需在4 小时与品质相关人员确认清楚。 5.1.5 供应商必须在《品质异常联络单》要求的期限前(如无明确要求,默认为《品质异常联络单》发出后2个工作日内)回复完整的改善方案。 5.1.6 品质部对供应商回复内容进行确认,针对改善措施不合格部分予以退件,要求供应商重新回复。改善措施合格,则报告予以归档,跟踪后续进料品质状况,依5.1.7执行。 5.1.7 针对供应商改善后产品加严检验,连续追踪3批无异常予以结案,转正常检验;连续追踪3批中途发现不良现象仍存在,则重复5.1.2-5.1.7。 5.1.8 如供应商改善措施回复后连续2个月无进料,则强制结案,后续进料依正常检验执行。 5.1.9

程序设计异常处理机制

异常处理是程序设计中一个非常重要的方面,也是程序设计的一大难点,从C开始,你也许已经知道如何用if...else...来控制异常了,也许是自发的,然而这种控制异常痛苦,同一个异常或者错误如果多个地方出现,那么你每个地方都要做相同处理,感觉相当的麻烦!Java 语言在设计的当初就考虑到这些问题,提出异常处理的框架的方案,所有的异常都可以用一个类型来表示,不同类型的异常对应不同的子类异常(这里的异常包括错误概念),定义异常处理的规范,在1.4版本以后增加了异常链机制,从而便于跟踪异常!这是Java语言设计者的高明之处,也是Java语言中的一个难点,下面是我对Java异常知识的一个总结,也算是资源回收一下。 一、Java异常的基础知识 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。比如说,你的代码少了一个分号,那么运行出来结果是提示是错误https://www.wendangku.net/doc/6414724979.html,ng.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出https://www.wendangku.net/doc/6414724979.html,ng.ArithmeticException的异常。 有些异常需要做处理,有些则不需要捕获处理,后面会详细讲到。 天有不测风云,人有旦夕祸福,Java的程序代码也如此。在编程过程中,首先应当尽可能去避免错误和异常发生,对于不可避免、不可预测的情况则在考虑异常发生时如何处理。Java中的异常用对象来表示。Java对异常的处理是按异常分类处理的,不同异常有不同的分类,每种异常都对应一个类型(class),每个异常都对应一个异常(类的)对象。 异常类从哪里来?有两个来源,一是Java语言本身定义的一些基本异常类型,二是用户通过继承Exception类或者其子类自己定义的异常。Exception 类及其子类是Throwable的一种形式,它指出了合理的应用程序想要捕获的条件。 异常的对象从哪里来呢?有两个来源,一是Java运行时环境自动抛出系统生成的异常,而不管你是否愿意捕获和处理,它总要被抛出!比如除数为0的异常。二是程序员自己抛出的异常,这个异常可以是程序员自己定义的,也可以是Java语言中定义的,用throw 关键字抛出异常,这种异常常用来向调用者汇报异常的一些信息。 异常是针对方法来说的,抛出、声明抛出、捕获和处理异常都是在方法中进行的。 Java异常处理通过5个关键字try、catch、throw、throws、finally进行管理。基本过程是用try语句块包住要监视的语句,如果在try语句块内出现异常,则异常会被抛出,你的代码在catch语句块中可以捕获到这个异常并做处理;还有以部分系统生成的异常在Java运行时自动抛出。你也可以通过throws关键字在方法上声明该方法要抛出异常,然后在方法内部通过throw抛出异常对象。finally语句块会在方法执行return之前执行,一般结构如下: try{ 程序代码 }catch(异常类型1 异常的变量名1){ 程序代码 }catch(异常类型2 异常的变量名2){ 程序代码 }finally{ 程序代码 } catch语句可以有多个,用来匹配多个异常,匹配上多个中一个后,执行catch语句块时候仅仅执行匹配上的异常。catch的类型是Java语言中定义的或者程序员自己定义的,表示代

产品质量异常处理流程(精)

供应商来料异常管理流程 1. 目的: 规范来料产品的异常处理流程控制,提高来料合格率。 2. 范围: 本规范适用于所有外购零部件及外包加工件。 3. 职责与权限: 3.1生技部:负责检测治具的制作。 3.2质量中心:负责来料异常的提出、分析、处理。 3.3生产部:负责来料异常协助处理。 3.4研发部:负责来料异常的分析、处理。 3.5生管部:负责确认来料品上线使用时间。 3.6采购部:负责来料异常与供应商的纠通取得异常的处理。 4. 名词定义: 4.1不合格:未满足产品的质量要求。 4.2 A类:单位产品的极重要质量特性不符合规定,或者单位产品的质量特性极严重不符合规定。 4.3 B类:单位产品的重要质量特性不符合规定,或者单位产品的质量特性严重不符合规定。 4.4 C类:单位产品的一般质量特性不符合规定,或者单位产品的质量特性轻微不符合规定。 5、异常处理流程控制 5.1 IQC依据检验指导书、封样、评估报告等资料检验,发现来料品不满足质量要求。 5.2 IQC将自已判定为不合格的产品经工程师、部门主管核对确实为不合格品。 5.3 IQC 立即填写《供应商异常矫正单》进行处理。 5.4 质量中心主管主导组织针对异常讨论,参与人员:采购、PIE、质量中心经理、研发工程师、研发总监、厂部厂长及其相关人员。 6、异常分类: 6.1 外观不良:表面有划痕、水印、字体不清、表面气泡、砂眼、黑点、缺料、油污、毛刺、变形、色差、氧化及电镀层脱落、标识规格错误、无料号贴纸、无出厂检验报告等。 6.2性能不良:尺寸与图纸不符、适配过大,过小、色温,波长,亮度不符、电压,电流不符等。 7、异常处理方式 7.1将不良品返回供应商进行返工、返修、报废等。

异常处理机制

异常的基本概念 异常是导致程序终止运行的一种指令流,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失。 在没有异常处理的语言中如果要回避异常,就必须使用大量的判断语句,配合所想到的错误状况来捕捉程序中所有可能发生的错误。 Java异常处理机制具有易于使用、可自行定义异常类、处理抛出的异常同时又不会降低程序运行的速度等优点。因而在java程序设计时应充分地利用java的异常处理机制,以增进程序的稳定性及效率。 当程序中加入了异常处理代码,所以当有异常发生后,整个程序并不会因为异常的产生而中断执行。而是在catch中处理完毕之后,程序正常的结束。 在整个java异常的结构中,实际上有两个最常用的类,分别为Exception和Error 这两个类全都是Throwable的子类。 Exception:一般表示的是程序中出现的问题,可以直接使用try……catch处理。 Error:一般值JVM错误,程序中无法处理。 Java异常处理机制。 在整个java的异常处理中,实际上也是按照面向对象的方式进行处理,处理的步骤如下: 1)一旦产生异常,则首先会产生一个异常类的实例化对象。 2)在try语句中对此异常对象进行捕捉。 3)产生的异常对象与catch语句中的各个异常类型进行匹配,如果匹配成功则执行catch语句中的代码。 异常处理 在定义一个方法时可以使用throws关键字声明,表示此方法不处理异常,而交给方法的调用处进行处理,在方法调用处不管是否有问题,都要使用try……catch块进行异常的捕获与处理。 如果在主方法中使用throws关键字,则程序出现问题后肯定交由jvm处理,将导致程序中断。 与throws关键字不同的是,throw关键字人为的抛出一个异常,抛出时直接抛出异常类的实例化对象即可。 Exception在程序中必须使用try……catch进行处理。RuntimeException可以不使用try……catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。(建议RuntimeException的子类也使用try……catch进行处理,否则产生的异常交给jvm处理会导致程序中断。) 继承关系: Exception》RuntimeException》lllegalArgumentException》NumberFormatException; 异常类必须继承于Exception 建议:继承Exception一般要添加全部父类型一样的构造器! class NameOrPwdException extends Exception { public NameOrPwdException() {

异常情况处理制度及流程

山西煤炭运销集团 蒲县昊锦塬煤业有限公司异常情况处理制度为认真贯彻落实国家、省、市关于集中开展安全生产大检查的工作安排要求,加强我矿信息监控系统管理水平,做好矿井生产过程中井下环境参数的有效监控,保障矿井安全生产,加强煤矿安全生产管理水平及抗灾能力,特制定本矿异常情况处理制度如下: 一、值班人员按《中心岗位责任制》规定,浏览查询煤矿安全信息,发现异常情况及时处理,并认真填写《异常情况报告处理表》,传真至县监控中心。 二、监控室值班人员发现系统发出异常报警后,值班人员必须立即通知监控室主任、分管领导,同时立即通知矿井调度部门,由监控室主任或分管领导组织相关人员对本次异常报警进行原因分析,并按规定程序及时报上一级网络中心。处理结果应记录备案。调度值班人员接到报警、断电信息后,应立即向矿值班领导汇报,矿值班领导按规定指挥现场人员停止工作,断电时撤出人员。处理过程应记录备案。当系统显示井下某一区域瓦斯超限并有可能波及其他区域时,矿井有关人员应按瓦斯事故应急预案手动遥控切断瓦斯可能波及区域的电源。值班人员接到网络中心发出的报警处理指令后,要立即处理落实,并将处理结果向网络中心反馈。 当工作面瓦斯浓度达到报警浓度时,值班人员应立即通知矿值班领导及监控室主任,并填写异常情况处理报告表传真上报至

县监控中心

;由分管领导或监控室主任安排相关人员进行原因分析,按照瓦斯超限分析原则:①按人工检测值与甲烷传感器对比分析; ②按报警地点的历史曲线对比分析;③按报警地点上风侧检测值对比分析。根据分析结果立即将处理措施下达至矿调度中心按处理措施严格执行。报警期间要采取安全措施,报警消除后将报警的起止时间、分析报告、采取措施和处理结果上报县监控室并存档备案。 三、当煤矿通讯中断、无数据显示时,值班人员要通过传真(或电话)向县监控中心报告,并查明原因,恢复通讯。情况紧急的,由值班人员立即向矿领导汇报,对因故造成通讯中断未及时上报的,要通过电话联系移动公司或长途线务局进行抢修。

如何使用异常处理机制

如何使用异常处理机制 《PHP核心技术与最佳实践》第1章面向对象思想的核心概念,本章将就面向对象一些概念展开讨论,其中重点讨论PHP特色的面向对象的风格和语法,并通过相互借鉴和对比,使读者认识PHP自身的特点,尤其是和其他语言中不同的地方。本节为大家介绍如何使用异常处理机制。 1.6.1 如何使用异常处理机制(1) 异常的思想最早可以追溯到20世纪60年代,其在C++、Java中发扬光大,PHP则部分借鉴了这两种语言的异常处理机制。 PHP里的异常,是程序运行中不符合预期的情况及与正常流程不同的状况。一种不正常的情况,就是按照正常逻辑不该出错,但仍然出错的情况,这属于逻辑和业务流程的一种中断,而不是语法错误。PHP里的错误则属于自身问题,是一种非法语法或者环境问题导致的、让编译器无法通过检查甚至无法运行的情况。 在各种语言里,异常(exception)和错误(error)的概念是不一样的。在PHP里,遇到任何自身错误都会触发一个错误,而不是抛出异常(对于一些情况,会同时抛出异常和错误)。PHP一旦遇到非正常代码,通常都会触发错误,而不是抛出异常。在这个意义上,如果想使用异常处理不可预料的问题,是办不到的。比如,想在文件不存在且数据库连接打不开时触发异常,是不可行的。这在PHP里把它作为错误抛出,而不会作为异常自动捕获。 以经典的除零问题为例,如代码清单1-16所示。 代码清单1-16 exception.php 1.// exception.php 2.getMessage(); 9.$a=-1; 10.}

品质异常处理控制程序

目录 1.目的 (3) 2.适用范围 (3) 3.用语定义 (3) 4.参考文件 (3) 5.职责分工 (3) 6.业务流程图 (3) 7.业务流程说明 (3) 7.1 报警 (3) 7.2停产(恢复)标准 (3) 7.3让步申请及签字权限 (6) 7.4质量存档 (6) 8 流程KPI (9) 9. 附录 (10)

1.目的 完善质量反馈信息流程,使每个问题的反馈都能得到有效改善,便于异常质量信息的分析、整改,做好纠正预防措施,杜绝批量质量事故的发生,减少质量事故造成的损失,同时满足顾客的质量要 求。 2.适用范围 3?用语定义 无 4?参考文件: 《质量异常报警流程》、《停产恢复流程》、《让步申请流程》 5.职责分工 5.1质量部:负责质量信息的跟进和相关责任部门回复的整改措施进行跟进; 5.2生产部: ①负责开立影响生产现场正常进行的《品质异常信息报警单》,并负责追踪相关责任部门进行措施回复; ②负责其他部门开立的有关生产《品质异常信息报警单》进行措施回复,并要跟进行措施的验证; ③还要负责保存本部门开立的且相关责任部门回复合格的《品质异常信息报警单》及相关质量记 录; 5.3品质处: ①IPQC负责对产品的过程进行监控; ②QA负责对产品的出货进行质量检验控制; 5.4质量督办负责统计现场、出货及工序前5位问题,由现场PE牵头组织处理,并制定改善行动措施; 5.5开发、质管、工艺:等职能部门负责确认不良问题点,分析不良的根本原因,出具纠正/预防的 控制措施,如出现意见冲突,上诉一级申辩,或由事业部长定裁; 6.业务流程图: 后附 7.业务流程说明: 7.1报警: 7.1.1质量体系中出现不符合问题时由TCE&G或发现部门下达《体系纠偏单》并由质量革新部负责跟踪验证,并保存《体系纠偏单》及相关质量记录;

设备故障处置过程中的九大错误与解决办法

设备故障 处置过程中的九大错误与解决办法设备故障处理是设备管理和维修人员经常会面对的问题之 O 维修人员在日常的设备故障检查处理过程中,外部受时间、环境、人员等方面的压力,内部受维修人员本身的技术水平、经验、设备熟悉程度、人员身体精神状态等的影响,这些因素,会对故障快速、准确的处置造成一定的影响。 维修人员对设备故障的排查和处置不当,会导致故障处置时间、人力、成本等的增加,或为下次故障留下隐患。 问题一.不能正确判断分析故障,盲目大拆大卸 1、现象: —些维修人员由于对机械结构、原理不清楚,未认真分析清楚故障原因,不能准确判断故障部位,凭着〃大概、差不多〃的思想盲目对机械大拆大卸,结果不但原故障未排除,而且由于维修技能和工艺较差,又出现新的问题。 2、解决办法: 当机械出现故障后,要通过检测设备进行检测,如无检测设备,可通过"问、看、查、试〃等传统的故障判断方法和手段,结合工程机

械的结构和工作原理,确定最可能发生故障的部位。在判定工程机械故障时,一般常用〃排除法〃和〃比较法",按照从简单到复杂、先外表后内部、先总成再部件的顺序进行,切忌"不问青红皂白,盲目大拆大卸"。 问题二■盲目更换零部件,一味"换件修理" 1、现象: 有些维修人员一贯采用换件试验的方法,不论大件小件,只要认为可能是导致故障的零部件,一个一个更换试验,结果非但故障没排除,且把不该更换的零部件随意更换了,增加了消费者的开支。还有些故障零部件完全可以通过修理恢复其技术性能,不需要复杂修理工艺即可修复,但维修人员却要求用户更换新件,一味采取〃换件修理"的方法,造成严重的浪费。 2、解决办法: 在维修时,应根据故障现象认真分析判断故障原因及部位,对能修复的零部件要采取修理的方法恢复技术性能,杜绝盲目更换零部件的做法。 问题三、不检查新件质量,装配后出现故障 1、现象: 在更换配件前,有些维修人员对新配件不做技术检查,皇来后直接安装到设备上,这种做法是不科学的。目前市场上出售的零配件质量良

异常情况处理流程说明

异常情况处理流程说明 一、“异常情况”包括 1、质量不合格问题。主要包括制程质量问题、售后质量问题、技术设计或图纸下发后出现问题、调试中 质量问题、外购设备物资质量问题等; 2、交货期延误问题、采购交期延误问题及其他有关生产进度的问题等; 3、生产物料损耗异常问题; 4、生产设备损坏问题; 5、员工违纪问题; 6、其它异常问题。 二、员工出现异常问题,应及时按规定报于部门领导; 三、企管部(质检部)在日常工作中发现员工出现异常问题时,应作出《整改通知》或《整改报告》,由 责任部门签收; 四、员工所属部门部长应及时落实责任人并对问题组织处理。责任人是指直接或间接造成各类问题发生的 员工包括各级管理人员。 五、责任部门部长应督促责任人填写《异常情况处理报告》,责任人应根据问题发生的原因、经过、问题 的现象或后果、问题发生的时间和发现时间,进行详细如实填写,并随后签字确认; 六、责任人填写完毕交直接主管进行原因分析,提出解决措施,并填写《异常情况处理报告》,上交部门 负责人。 1、责任人的直接主管为班长的,该班长应根据问题的具体情况认真分析,确定属于哪种原因,并分析自 己在问题中所负的责任,必须认真填写明白,不得包庇、隐瞒; 2、责任人的直接主管为部长的,则由责任人所属部门部长填写; 3、责任人为部长的,责任人可以不填写此栏,只填写“问题描述”和“责任部门处理意见”; 4、责任人为副总的,责任人填写“问题描述”和“处理意见”; 七、责任人所属部门部长应详细调查、分析问题,确定解决措施,并填写处理报告,依据公司的有关规定 并分析自己在问题中所负的责任,做出公平、公正的处理意见;该部长应本着认真客观的态度对待问题,反思自己工作的欠缺,及时纠正并预防问题的再次发生。 八、责任部门将报告交分管副总,分管副总分析问题发生原因和相关负责人的处理意见,根据公司的有关 规定,对责任人做出处理意见;并由责任部门部长将报告交企管部(质检部); 九、企管部长(质检部长)实施监督职责,本着公平、公正地原则,对问题深入分析,不确定的问题应重 新调查,并分析责任部门的处理建议是否符合公司的有关规定。若符合规定则填写问题处理报告,做出企管部(质检部)的处理意见;若不符合有关规定,或责任部门的处理意见有失公平、公正,则需

SEH 结构化异常处理

标题:【原创】加密与解密二版菜鸟学习笔记(2) - SEH 结构化异常处理 作者:ytcswb 时间: 2005-02-01,16:40:24 链接: https://www.wendangku.net/doc/6414724979.html,/showthread.php?t=10651 看学加密与解密二版学习笔记(2) - SEH 结构化异常处理 [ 工具] flyod1.10 [ 目的] 学习SEH的手法,另书中是用SoftICE调试的,看起来不习惯.根据原文内容重新整理一下,便于和我一样的菜鸟们一起学习. 今天下决心,好好学习,这是就算是个开始吧!感觉学明白的确很不容易! [ 注释] ?--为不能理解的地方,请大侠们指点一下.学习过程中,有理解错误的地方,肯请大侠们多多指教. [练习对象] 加密与加密二版第10章,光盘配套的练习软件:seh.exe seh2.exe [ writer ] ytcswb 2005.2.1 感谢看学及论坛的大侠们为我们提供这么好的学习资料。 1.例子seh.exe学习: 00401000 > $ 8D4424 F8 lea eax,dword ptr ss:[esp-8] //程序入口!根据下面的代码分析,这里显然可以 //理解为开辟8字节的空间,并把栈顶指针保存到eax //相当于sub esp,8 ; lea eax,dword ptr ss:[esp] 00401004 . 64:8705 00000>xchg dword ptr fs:[0],eax //记住fs[0]永远是指向当前err结构的指针, //执行完成后,fs[0]指向栈顶,准备在堆栈中构造1个err结构 //eax等于原fs[0],即指向原来的err结构的指针,即那个err结构的地址 0040100B . BB 2E104000 mov ebx,Seh.0040102E //地址40102e-->ebx,建议在此地址上设断点,才能正常跟踪入seh代码中 00401010 . 53 push ebx //压入堆栈,即当前err结构的handler成员,当前异常处理代码的入口地址 00401011 . 50 push eax //压入原fs[0],即当前err结构的prev成员,即下一个err结构的地址 此时堆栈: 0012FFBC 0012FFE0 指针到下一个SEH 记录//0012FFE0是个指针,看看就知道指向下一个err结构,数值上等于下一个err结构的地址 0012FFC0 0040102E SE 句柄//建立了1个当前的err结构 0012FFE0 FFFFFFFF SEH 链尾部

产品质量异常处理流程汇总

XXXXXXXX 有限公司 产品质量异常处理流程 YCCL---2012 编制:版号: 审核:受控状态: 批准:分发号:

2012. 发布2012. 3 .实行3 .

产品质量异常处理流程 1.0目的: 规范品质异常处理作业,使品质异常发生时处理过程有据可依有 规可循,使品质异常能在规定的时间内有效改善,并采取相应的预防措施,防止相同问题重复发生。降低处理品质异常的成本,满足客户质量要求。 2.0范围: 品质异常、制程异常、出货前异常、客户抱怨 3.0定义: 3.1品质异常3.1.1产品品质异常: 3.1.1.1不符合相关检验标准要求,且不良率超过质量目标时。 3.1.1.2有经过改善且有效果确认,但又重复发生品质异常时。 3.1.1.3客户抱怨及退货时。 3.1.1.4其它情形,影响到产品品质时。 3.1.2制程异常3.121不遵守操作标准操作。 3.122虽然照操作标准操作,但因各种标准不完善,以致无法控制变 异原因。 3.1.2.3使用不合格的原料或材料。 3.124机械发生故障或磨损。 3.125其它情形,可能存在品质隐患时。

4.0职责 4.1质控部: 4.1.1负责各生产部门质量异常不良的提出4.1.2负责不良现象及不良比例的确认和判定,临时对策效果的确认 及不良物料的处理。 4.1.3负责质量外观不良类的最终判定与裁决。 4.2技术部: 负责结构类和功能类质量异常的分析与临时对策的提出。 4.3生产部门: 负责按质控部/技术部临时对策的执行,并配合处理相关不良品处理。 4.4业务部: 负责接收客户投诉并反馈信息至技术、质控,投诉分析完成后把处理结果反馈至客户。 4.5其它部门: 在问题涉及时负责问题的分析、措施的提出及执行。 5.0工作程序: 5.1进料品质异常: 5.1.1 IQC依相关检验标准判定不合格,针对不合格物料标示“不合 格”,并通知仓库立即移至不良品区域。 5.1.2异常成立1小时内开立《品质异常处理单》通知采购/生产管理 部门。

[重点]设备异常处理流程及规定

[重点]设备异常处理流程及规定 设备异常处理流程 序流程图责任人表单作业内容号 班组长/线长不能处生产异常出现时,生产部门/设备生产异常理或异常会导致停产时间超过30分钟 1 相关部门/ 时,应立即上报,或开出《生产异常发现者报告单》进行处理。 生产部负责人接到报告后应在10分钟生产部门/内赶赴现场;必要时可同时通知相关相关人员 2 相关部门/ 部门负责人,相关部门负责人接到通赶赴现场负责人知后应在10分钟内赶到现场( 相关部门负责人到达现场后立即对异相关部门异常分析 3 常进行分析,若部门负责人不能到场负责人应在10分钟内派人到达现场( 如不能立即处理应作出是否停产的意确定是总经办/总4 见,并注明预计恢复生产的时间(停否停产经理产应由总经理批准( 相关部门负责人针对问题应在30分钟制定应急相关部门生产异常 5 内制定出应急处理措施,制定措施时处理措施负责人报告单应尽可能地降低影响生产部门生产异常生产部门按应急措施进行生产按照处理6 负责人报告单调整生产措施生产 生产部/品 质部 NG 应急措施的有效性由生产部与品质部生产异常责任人措施7 共同验证,如验证不符合则重新制定报告单验证相关措施( YES 验证结果符合生产及品质相关要求,生产部负责恢复正8 可以在恢复生产后由品质部和生产部人常生产对异常进行跟进确认(

相关责任部生产恢复正常后相关部门应对问题的生产异常 9 制定长期门深层次的原因加以分析,并在两个工报告单预防措施负责人作日内制定出长期预防措施( 生产部生产异常生产部应协同品质部对责任部门的长10 负责人报告单期预防措施执行结果进行跟踪预防措施跟踪 异常处理规定 1(目的 为了更好的规范和完善公司生产异常处理作业,使生产问题发生后,各部门人员迅速、有效的处理,减免停工时间,提高生产效率,特制定本流程。 2(适用范围 适用于公司所有生产异常的处理。 3(职责 3(1 生产部门负责生产异常的反馈和处理措施验证。 3(2 品质部负责品质异常的处理及验证。 3(3 设备组负责设备异常的处理。 3(4 计控部负责物料异常的处理。 3(5 技术部负责技术、关键工序设备、工装模具、工艺异常的处理。 4(作业规范 4.1 生产异常反馈 4.1.1 当生产发生异常或有出现异常的趋势时,生产部发现人员和现场管理人员(如班组长)应即时给予分析,并主动积极寻求解决方法,包括与相关人员联系,如能及时解决则不在本流程规定内。

货物异常应急处置制度

货物异常应急处置制度 一、目的 确保公司在进行货物运输、装卸、存储等过程中对货物多货、少货、货损、污染、霉变、虫害、火灾、被盗、丢失及其他异常情况进行及时调查分析和处置,并遵守国家相关安全要求。 二、范围 1、本制度适用于货物运输、装卸、存储数量及质量控制; 2、本制度使用货物异常分析及处置。 三、主要职责和权限 1、理货员负责核实出入库货物数量、质量、单据和记录的控制; 2、统计员负责提供货物单据及盘点数量; 3、业务员负责货物异常的追溯、调查及对接客户的处理方案; 4、仓库经理负责处理异常货物。 四、工作程序 1、入库货物多货、少货 (1)货物拆箱时,由理货员依据入库单,清单货物数量。如发现多货或少货,首先与统计员、操作员确认入库单数量是否正确; (2)如确认的确为装箱货物数量异常,则须拍照取证,并及时上报仓库经理、操作员; (3)操作员须及时与客户沟通确认是否继续卸货,待客户确认实际到货数量,并同意卸货后,方可安排叉车工予以卸货; (4)操作员留存客户确认实际到货数量的邮件、微信等截图。 2、出库货物多货、少货 (1)货物装箱时,由理货员依据出库单,查找对应提单号货物存储位置,并检查货物状态,是否有货损、污染、霉变、虫害等情况; (2)如存储期间出现货损、污染、霉变、虫害等情况,则及时报告仓库经理,对异常情况进行调查,必要情况下,须及时通知客户以便出具处理意见; (3)货物检查无异常的,安排并监督叉车工进行装车工作,清点装货数量。 (4)如出库货物到达客户仓库后,被告知货物多货或少货的,则由仓库经理负责调取监控,查看装车视频,清点装车数量,确定为装货时数量异常还是运输过程中数量异常; (5)如装货时少货的,除上报公司外,与客户沟通单独送货还是待下批次货物一同运输; (6)如装货时多货的,除上报公司外,与客户沟通单独退货还是待下批次货物扣除同等数量。 (7)操作员留存客户确认实际到货数量、处理意见的邮件、微信等截图。 3、入库货物货损 (1)货物拆箱时,由理货员依据入库单,检查货物包装。如发现货损情况,则须拍照取证,并及时上报仓库经理、操作员; (2)由仓库经理负责调取监控,查看车辆入场、拆箱视频,确认货损出现原因;

Linux中断处理流程

Linux中断处理流程 先从函数注册引出问题吧。 一、中断注册方法 在linux内核中用于申请中断的函数是request_irq(),函数原型在Kernel/irq/manage.c中定义: int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) irq是要申请的硬件中断号。 handler是向系统注册的中断处理函数,是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递给它。 irqflags是中断处理的属性,若设置了IRQF_DISABLED (老版本中的SA_INTERRUPT,本版zhon已经不支持了),则表示中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程 序不屏蔽;若设置了IRQF_SHARED (老版本中的SA_SHIRQ),则表示多个设备共享中断,若设置了IRQF_SAMPLE_RANDOM(老版本中的 SA_SAMPLE_RANDOM),表示对系统熵有贡献,对系统获取随机数有好处。(这几个flag是可以通过或的方式同时使用的) dev_id在中断共享时会用到,一般设置为这个设备的设备结构体或者NULL。devname设置中断名称,在cat /proc/interrupts中可以看到此名称。 request_irq()返回0表示成功,返回-INVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。 关于中断注册的例子,大家可在内核中搜索下request_irq。 在编写驱动的过程中,比较容易产生疑惑的地方是: 1、中断向量表在什么位置?是如何建立的? 2、从中断开始,系统是怎样执行到我自己注册的函数的? 3、中断号是如何确定的?对于硬件上有子中断的中断号如何确定? 4、中断共享是怎么回事,dev_id的作用是? 本文以2.6.26内核和S3C2410处理器为例,为大家讲解这几个问题。 二、异常向量表的建立 在ARM V4及V4T以后的大部分处理器中,中断向量表的位置可以有两个位置:一个是0,另一个是0xffff0000。可以通过CP15协处理器c1寄存器中V位(bit[13])控制。V和中断向量表的对应关系如下: V=0 ~ 0x00000000~0x0000001C V=1 ~ 0xffff0000~0xffff001C arch/arm/mm/proc-arm920.S中 .section ".text.init", #alloc, #execinstr __arm920_setup: ...... orr r0, r0, #0x2100 @ ..1. ...1 ..11 (1) //bit13=1 中断向量表基址为0xFFFF0000。R0的值将被付给CP15的C1.

BCB讲座第十三讲异常处理

异常处理 在程序设计过程中,我们不仅仅要考虑如何实现程序的功能,还要防止可能出现的异常情况,所谓异常情况就是指在程序运行过程中出现的不正常或不可预料的情况,例如打开的文件不存在、不能分配所需的内存等等。特别是当一个软件要面向大量用户时,它所遇到的运行情况可能千差万别,如果不能够应付各种异常情况,其功能再好再强大也难以弥被这样的缺陷。本讲要介绍的就是如何在CBuilder中实现异常处理,并为Mp3Collect添加异常处理代码。 ●传统的异常处理方法 为了应付可能出现的不正常情况,传统的方法主要是通过条件判断语句来检查是否产生异常的事件。例如,在MP3Collect程序的SaveFile函数中,我们添加了如下的条件语句,以处理可能产生的打开文件错误: if(fp==NULL) { ShowMessage("不能打开文件Mp3Collect.sav,请检查是否为共享冲突"); return; } 在检测到了异常事件后,一般需要做两件事,一是显示错误的信息,例如以上代码中对ShowMessage()函数的调用,再一个就是中断程序原有的执行流程,因为异常的发生已经使得程序无法满足继续执行原有流程的条件,在SaveFile()函数中,如果文件打开失败,就不能继续后面的写文件操作,因此在异常处理中用return语句直接返回,中断了保存文件的操作。 这种异常处理的方法当然最容易理解,但在大型的软件开发项目中,需要考虑的异常情况非常多,如果每个地方都使用if语句来检查错误并处理异常,就会使编程工作变得非常繁杂,源代码的可读性也会大大降低。为了解决这一问题,人们在面向对象编程中找到了更加结构化和更简便的方法来实现异常处理。 ●CBuilder中的异常处理机制 CBuilder支持多种异常处理机制,其中包括符合ANSI标准的C++异常处理机制,微软公司提供的Win32结构化异常处理机制,以及基于VCL的异常处理机制,后者是Borland公司建议在CBuilder编程中采用的异常处理方式。 基于VCL的典型异常处理结构的形式如下所示: try{ //可能引起异常的代码段 } catch(Exception &e){ //对异常进行处理的代码 } 其中try和catch为C++关键字。try用于标志可能产生异常的代码段(Block),该代码段用try 后紧跟的一对大括号{}包括在内。如果这段程序在运行时产生了异常,系统会中止try代码段中的代码执行,并查找相应的catch代码段,如果找到了合适的catch代码段,即表示错误被捕捉到,这时相应的catch代码段被执行,如果没有找到合适的catch代码段,即错误始终没有被捕捉到,则系统会调用VCL库按照缺省的方法来处理异常。当然,如果try代码段在运行时一切正常,则catch代码段是不会被调用的。 在上面的异常处理结构中,我们看到,catch语句带有一个参数Exception &e,该参数是一个异

1.异常处理机制(精)

1. 异常机制 异常机制是指当程序出现错误后,程序如何处理。具体来说,异常机制提供了程序退出的安全通道。当出现错误后,程序执行的流程发生改变,程序的控制权转移到异常处理器。 传统的处理异常的办法是,函数返回一个特殊的结果来表示出现异常(通常这个特殊结果是大家约定俗称的),调用该函数的程序负责检查并分析函数返回的结果。这样做有如下的弊端:例如函数返回-1代表出现异常,但是如果函数确实要返回-1这个正确的值时就会出现混淆;可读性降低,将程序代码与处理异常的代码混爹在一起;由调用函数的程序来分析错误,这就要求客户程序员对库函数有很深的了解。 异常处理的流程: ①遇到错误,方法立即结束,并不返回一个值;同时,抛出一个异常对象。 ②调用该方法的程序也不会继续执行下去,而是搜索一个可以处理该异常的异常处理器,并执行其中的代码。 2 异常的分类 异常的分类: ①异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception,具体的RuntimeException继承RuntimeException。 ② Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。 每个类型的异常的特点 Error体系: Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。如果出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以,在进行程序设计时,应该更关注Exception体系。 Exception体系包括RuntimeException体系和其他非RuntimeException的体系: ① RuntimeException:RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等。处理RuntimeException的原则是:如果出现

Windows异常处理流程

Windows异常处理流程 作者:SoBeIt 出处:https://www.wendangku.net/doc/6414724979.html,/articles/200412/761.html 日期:2005-01-06 先来说说异常和中断的区别。中断可在任何时候发生,与CPU正在执行什么指令无关,中断主要由I/O设备、处理器时钟或定时器等硬件引发,可以被允许或取消。而异常是由于CPU执行了某些指令引起的,可以包括存储器存取违规、除0或者特定调试指令等,内核也将系统服务视为异常。中断和异常更底层的区别是当广义上的中断(包括异常和硬件中断)发生时如果没有设置在服务寄存器(用命令号0xb向8259-1中断控制器0x20端口读出在服务寄存器1,用0xb向8259-2中断控制器的0xa0端口读出在服务寄存器2)相关的在服务位(每个在服务寄存器有8位,共对应IRQ 0-15)则为CPU的异常,否则为硬件中断。 下面是WINDOWS2000根据INTEL x86处理器的定义,将IDT中的前几项注册为对应的异常处理程序(不同的操作系统对此的实现标准是不一样的,这里给出的和其它一些资料不一样是因为这是windows的具体实现): 中断号名字原因 0x0 除法错误1、DIV和IDIV指令除0 2、除法结果溢出 0x1 调试陷阱1、EFLAG的TF位置位 2、执行到调试寄存器(DR0-DR4)设置的断点 3、执行INT 1指令 0x2 NMI中断将CPU的NMI输入引脚置位(该异常为硬件发生非屏蔽中断而保留) 0x3 断点执行INT 3指令 0x4 整数溢出执行INTO指令且OF位置位 0x5 BOUND边界检查错误BOUND指令比较的值在给定范围外 0x6 无效操作码指令无法识别 0x7 协处理器不可用1、CR0的EM位置位时执行任何协处理器指令 2、协处理器工作时执行了环境切换 0x8 双重异常处理异常时发生另一个异常 0x9 协处理器段超限浮点指令引用内存超过段尾 0xA 无效任务段任务段包含的描述符无效(windows不 使用TSS进行环境切换,所以发生该异常说明有其它问题) 0xB 段不存在被引用的段被换出内存 0xC 堆栈错误1、被引用内存超出堆栈段限制 2、加载入SS寄存器的描述符的present位置0 0xD 一般保护性错误所有其它异常处理例程无法处理的异常 0xE 页面错误1、访问的地址未被换入内存 2、访问操作违反页保护规则 0x10 协处理器出错CR0的EM位置位时执行W AIT或ESCape指令 0x11 对齐检查错误对齐检查开启时(EFLAG对齐位置位)访问未对齐数据

质量异常处理管理办法

质量异常处理管理办法 1范围 为确保我司质量目标的实现,加强对生产过程的质量控制,特制定本管理规定,本办法围绕对产品质量的影响程度进行考评,并对考核对象、范围、扣分条件、责任连带条件、奖励方面等都进行明确,以确定对质量问题责任人及相关责任单位的考核比重。 本标准适用于公司产品生产过程质量异常情况对所有单位调查、处理和考核。 2职责公司所有员工均有责任对所发现的质量缺陷、质量异常问题进行反馈上报。 质控部负责对公司重大质量事故及恶性批量的质量问题进行通报处理。负责对产品生产过程(包括小批试生产)和售后反馈的质量异常情况进行调查处理和考核。负责对责任单位纠正及预防措施的制订、实施情况进行统计、跟踪和通报,确保形成闭环控制。 研究院、制造部、质控部负责对出现的质量异常进行深入的原因分析。质量异常问题的责任单位负责制订纠正及预防措施,并对其按时实施以及实施效果负责。绩效管理部负责监督责任单位判定或考核尺度有异议时进行裁决,同时督促各种纠正及预防行动的有效落实。 3引用标准(无) 4名词解释 A 类缺陷:涉及电气安全、产品可靠性的重大问题。如综合五项性能泄露、耐压等未通过;性能测试出现漏 水、批量噪音振动、不停机、不制冷等问题;压缩机、冷凝器、蒸发器等重要零部件问 题;批量性的泄漏等对售后有重大质量隐患的问题。 B 类缺陷:对产品性能、外观等有较大影响的问题。如较严重的外观问题,结构类问题(除涉及电气 安全的),认证类,较小质量隐患的客户化问题,工艺执行力等对质量、生产等影响较 大的质量问题。 C 类缺陷:对产品质量影响较小的轻微缺陷问题。如轻微的外观缺陷、周转过程物料摆放不合理、物料损坏 等一般性质量问题。 批质量事故:同批产品中满足以下条件之一的,即视为批质量事故: 1)A类缺陷比例达到%(含)以上; 2)B类缺陷比例达到 1%(含)以上; 3)C类缺陷比例达到 5%(含)以上; 4)除以上条件外,经质控部判断影响严重的其他质量异常情况。流程图或步骤(无) 6 管理程序

相关文档