pcb结构定义

#include<stdio.h>
#include<stdio.h> #include<malloc.h>  
typedef struct ProcessNode{            //  进程结点的基本结构    
char name;           //进程名 
int service_time;    //服务时间 
int arrive_time;     //到达时间 
int priority;        //优先级   
struct FCFS_time{       //先到先服务  
int finish_time;      //完成时间      
int turnaround_time;  //周转时间   
float weigtharound_time;//带权周转时间 
}FCFS_time;       
struct SJF_time{       //短作业优先  
int finish_time;           
int turnaround_time;   
float weigtharound_time;   
int flag;   }SJF_time;       
struct RR_time{       //时间片轮转的结点  
int finish_time;            
int turnaround_time;    
float weigtharound_time;    
int flag_time;//赋值为进程的服务时间,为0则进程完成 
}RR_time;       
struct Pri_time{       //优先权非抢占式  
int finish_time;          
 int turnaround_time;     
float weigtharound_time; 
}Pri_time;   
struct ProcessNode*next;
}ProcessNode,*Linklist;   
void main() {         
int choice;
Linklist  p,head;
Linklist read_information(); 
Linklist FCFS_scheduling(Linklist  head);    
Linklist SJF_scheduling(Linklist  head);    
Linklist RR_scheduling(Linklist  head);    
Linklist Pri_scheduling(Linklist  head);   
head=read_information();//读入进程的基本信息 
do{             
p=head->next;        
printf("\n");   
printf("**********进程初始信息输出********** \n"); //输出初始化后的进程基本信息  
printf("\n");     
printf("进程名称  ");        
printf("到达时间  ");        
printf("服务时间  ");        
printf("优先级  ");        
printf("\n");  
while(p)   {          
printf("   %c ",p->name);      
printf("         %d     ",p->arrive_time);          
printf("    %d     ",p->service_time);         
printf("   %d ",p->priority);          
printf("\n");       p=p->next;   }      
printf("\n");        
printf("************************************ \n");//输出进程的调用选择项   
printf("\n");   
printf("1、FCFS----先到先服务\n");  
printf("2、SJF-----短作业优先\n");  
printf("3、RR------时间片轮转\n");  
printf("4、Pri-----优先权调度\n");        
printf("5、退出\n");    printf("\n");   
printf("************************************ \n"); 
printf("\n");   
printf("请在1—5之间选择:  "); 
scanf("%d",&choice);    
printf("\n");         
printf("\n");
switch(choice)    
{         
case 1:  FCFS_scheduling(head);            
break;      
case 2:  SJF_scheduling(head);           
break;       
case 3:  RR_scheduling(head);                  
break;      
case 4:  Pri_scheduling(head);                  
break;  
//      case 5:  exit();    
}   
}while(choice!=5);      
}   
Linklist read_information()//进程读入函数
{    
int i;    
int num;    
// ProcessNode  
 Linklist pro;  
Linklist p;    
Linklist head;    
printf("\n");     
printf("************进程调度算法************ \n"); 
printf("\n");  
printf("请输入进程的个数:");    
scanf("%d",&num);  
printf("\n");  
printf("*************初始化信息************* \n"); 
printf("\n");       
head=(Linklist)malloc(sizeof(ProcessNode));//头结点 
head->next=NULL; 
p=head;    
for(i=1;i<=num;i++)   {         
pro=(Linklist)malloc(sizeof(ProcessNode));//创建进程结点           
printf(" 输入第%d个进程信息:\n",i);
printf("    请输入进程名: ");  
fflush(stdin);   
scanf("%c",&pro->name);  
printf("        到达时间: ");  
scanf("%d",&pro->arrive_time);  
printf("        服务时间: ");       
scanf("%d",&pro->service_time);   
printf("        优先级↑: ");   
scanf("%d",&pro->priority);      
//pro->next=head->next;  head->next=pro;//逆序建链           
p->next=pro;  p=pro;//顺序建链  
//p++;    
pro->next=NULL;   
}     
printf("\n");    
return head;
}    
Linklist FCFS_scheduling(Linklist head)//先到先服务算法函数
{       
Linklist p;    
Linklist q;//指向前一进程    
p=head->next;        
while(p) //初始化进程的完成时间、周转时间、带权周转时间,初值均赋为0 
{    
p->FCFS_time.finish_time=0;  
 p->FCFS_time.turnaround_time=0;   
p->FCFS_time.weigtharound_time=0;      
p=p->next;  
}       
p=q=head->next;     
p->FCFS_time.finish_time=p->arrive_time;//避免第一个进程到达时间不为0    
while(p) 
{       
if(p->arrive_time<=q->FCFS_time.finish_time)//下一进程已到达,在等待中     
{          
p->FCFS_time.finish_time=(p->service_time)+(q->FCFS_time.finish_time);//服务时间
p->FCFS_time.turnaround_time=(p->FCFS_time.finish_time)-(p->arrive_time);//周转时间    
p->FCFS_time.weigtharound_time=(float)(p->FCFS_time.turnaround_time)/(p->service_time);//带权周转时间     
}     
else     
{    
p->FCFS_time.finish_time=p->service_time+p->arrive_time;//服务时间          
p->FCFS_time.turnaround_time=(p->FCFS_time.finish_time)-(p->arrive_time);//周转时间   
p->FCFS_time.weigtharound_time=(float)(p->FCFS_time.turnaround_time)/(p->service_time);//带权周转时间     
}   
q=p;   
p=p->next;      
}      
p=head->next;     
printf("******************************** FCFS ******************************** \n");//输出先到先服务调度后的进程信息  
printf("\n");     
printf("进程名称  ");        
printf("到达时间  ");        
printf("服务时间  ");        
printf("优先级  ");  
printf("完成时间  ");   
printf("周转时间  ");       
printf("带权周转时间  ");                  
printf("\n");    
while(p) 
{     
 printf("   %c ",p->name);    
printf("         %d     ",p->arrive_time);         
printf("    %d     ",p->service_time);        
printf("   %d ",p->priority);       
printf("       %d",p->FCFS_time.finish_time);        
printf("        %d",p->FCFS_time.turnaround_time);        
printf("          %0.2f",p->FCFS_time.weigtharound_time);        
printf("\n");  
p=p->next;    }    
printf("\n");    
printf("********************************************************************** \n");   
printf("\n");  
return head;
}     
Linklist SJF_scheduling(Linklist  head)//短作业优先算法
{   
Linklist p,r;   
Linklist q;//指向前一进程结点     
int num=0;//记录进程个数    
int add_flag=0;//进程完成服务个数 
int service_time_min; 
int arrive_time; 
int k;  
p=head->next;//首元结点      
while(p) //初始化进程的完成时间、周转时间、带权周转时间,初值均赋为0 
{    
p->SJF_time.finish_time=0;   
p->SJF_time.turnaround_time=0;   
p->SJF_time.weigtharound_time=0;  
p->SJF_time.flag=0;   
++num;   
q=p;      
p=p->next;   
}     
q->next=head->next;//将创建的进程队列变为循环队列    
p=head->next;
q=p;  
p->SJF_time.finish_time=p->arrive_time+p->service_time;     
p->SJF_time.turnaround_time=(p->SJF_time.finish_time)-(p->arrive_time);//周转时间     
p->SJF_time.weigtharound_time=(float)(p->SJF_time.turnaround_time)/(p->service_time);//带权周转时间 
q->SJF_time.finish_time=p->SJF_time.finish_time;     
p->SJF_time.flag=1;  add_flag=1;  
p=p->next;     
do{      
if(p->SJF_time.flag==1){p=p->next;}      
else if((p->arrive_time)>(q->SJF_time.finish_time))   
{           
service_time_min=p->service_time;      
arrive_time=p->arrive_time;        
while(p->arrive_time==arrive_time&&p->SJF_time.flag==0)//寻找最短的作业          
{
if((p->next->service_time)<(p->service_time)){service_time_min=p->next->service_time;p=p->next;
}                
else {p=p->next;}     
}               
p=q->next;         
r=q;             
while(p->service_time!=service_time_min){p=p->next;}//指针指向最短作业            
p->SJF_time.finish_time=p->arrive_time+p->service_time;            
p->SJF_time.flag=1;++add_flag;               
p->SJF_time.turnaround_time=(p->SJF_time.finish_time)-(p->arrive_time);//周转时间                  
p->SJF_time.weigtharound_time=(float)(p->SJF_time.turnaround_time)/(p->service_time);//带权周转时间                     
q=p;
p=r->next;   
}          
else     
{           
k=0;           
service_time_min=p->service_time;                     
while(((p->arrive_time)<=(q->SJF_time.finish_time))&&k<=num)//寻找最短的作业        
{                        
if(p->SJF_time.flag==1)
{p=p->next;++k;}          
else  if((p->SJF_time.flag!=1)&&((p->service_time)<service_time_min))               
{
service_time_min=p->service_time;                      
p=p->next;++k;
}                    
else { p=p->next;++k; }        
}                  
p=q->next;           
r=q;                   
while(p->service_time!=service_time_min){p=p->next;}//指针指向最短作业                                        
p->SJF_time.finish_time=q->SJF_time.finish_time+p->service_time;                        
p->SJF_time.turnaround_time=(p->SJF_time.finish_time)-(p->arrive_time);//周转时间                    
p->SJF_time.weigtharound_time=(float)(p->SJF_time.turnaround_time)/(p->service_time);//带权周转时间                       
p->SJF_time.flag=1;
++add_flag;               
//q=p;p=p->next;        
q=p;p=r->next;        
}     
}while(add_flag!=num);       
for(p=head->next;num>0;num--)//断开循环队列
{      
q=p;
p=p->next;  
}  
q->next=NULL;       
p=head->next;//指向链首,输出短作业调度后的进程信息    
printf("\n");     
printf("******************************** SJF ********************************* \n");  
printf("\n");    
printf("进程名称  ");        
printf("到达时间  ");        
printf("服务时间  ");        
printf("优先级  ");  
printf("完成时间  ");   
printf("周转时间  ");       
printf("带权周转时间  ");                  
printf("\n");    
while(p) 
{      
printf("   %c ",p->name);    
printf("         %d     ",p->arrive_time);         
printf("    %d     ",p->service_time);        
printf("   %d ",p->priority);       
printf("       %d",p->SJF_time.finish_time);        
printf("        %d",p->SJF_time.turnaround_time);        
printf("          %0.2f",p->SJF_time.weigtharound_time);        
printf("\n");   p=p->next;    }    
printf("\n");    
printf("********************************************************************** \n");   
printf("\n");    
return head;
}    
Linklist RR_scheduling(Linklist  head)//时间片轮转算法

Linklist q;//指向前一进程结点    
Linklist p;  
int q_time;//时间片大小  
int num=0;//记录进程个数    
int add_flag=0;//进程完成服务个数
printf("请输入时间片的大小:  "); 
scanf("%d",&q_time);       
p=head->next;     
while(p) //初始化进程的完成时间、周转时间、带权周转时间,初值均赋为0 
{    
p->RR_time.finish_time=0;   
p->RR_time.turnaround_time=0;   
p->RR_time.weigtharound_time=0;   
p->RR_time.flag_time=p->service_time;   
q=p;   
++num;      
p=p->next;   
}    
q->next=head->next;//将创建的进程队列变为循环队列    
p=head->next;     
q->RR_time.finish_time=p->arrive_time; 
do{        
/* printf("\n");          
printf("************************************************************** \n");             
printf("   %c ",p->name);        
printf("         %d     ",p->arrive_time);          
printf("    %d     ",p->service_time);          
printf("   %d ",p->priority);        
printf("       %d",p->RR_time.finish_time);          
printf("\n"); */        
if((p->RR_time.flag_time)>(q_time))//服务时间大于时间片   
{        
p->RR_time.finish_time=(q->RR_time.finish_time)+(q_time);//累加完成时间             
p->RR_time.flag_time=(p->RR_time.flag_time)-(q_time);     
if((p->next->arrive_time)<=(p->RR_time.finish_time))//有进程等待    
{
q=p;
p=p->next;
}     
else     //当前进程未完成,无进程等待,指针不向后移    
{ q=p; }    
}        
else if((p->RR_time.flag_time)==0)//进程已经完成     
{      
p=p->next;     
}            
else
{
p->RR_time.finish_time=(q->RR_time.finish_time)+(p->RR_time.flag_time);                
p->RR_time.flag_time=0; ++add_flag;                
p->RR_time.turnaround_time=(p->RR_time.finish_time)-(p->arrive_time);//周转时间            
p->RR_time.weigtharound_time=(float)(p->RR_time.turnaround_time)/(p->service_time);//带权周转时间                
if((p->next->arrive_time)<(p->RR_time.finish_time))//有进程等待    
{ q=p;p=p->next; }        
else     //当前进程完成,无进程等待,指针向后移     
//{  q=p; q->RR_time.finish_time=p->next->arrive_time;  }    
{p=p->next;q=p;q->RR_time.finish_time=p->arrive_time;}     
}    }while(add_flag!=num); 
//}while(p->RR_time.flag==0);        
for(p=head->next;num>0;num--)//断开循环队列 
{      
q=p;p=p->next;  
}  
q->next=NULL;       
p=head->next;//指向链首,输出时间片轮转调度后的进程信息    
printf("\n");     
printf("******************************** RR ********************************** \n");  
printf("\n");     
printf("进程名称  ");        
printf("到达时间  ");        
printf("服务时间  ");        
printf("优先级  ");  
printf("完成时间  ");   
printf("周转时间  ");       
printf("带权周转时间  ");                  
printf("\n");    
while(p) 
{      
printf("   %c ",p->name);    
printf("         %d     ",p->arrive_time);         
printf("    %d     ",p->service_time);        
printf("   %d ",p->priority);       
printf("       %d",p->RR_time.finish_time);        
printf("        %d",p->RR_time.turnaround_time);        
printf("          %0.2f",p->RR_time.weigtharound_time);        
printf("\n");
p=p->next;   
}    
printf("\n");    
printf("********************************************************************** \n");   
printf("\n");   
return head; }   
Linklist Pri_scheduling(Linklist  head)//优先权调度算法
{
printf("   优先权调度算法    \n");    
return head;
}

 

 

转载于:https://www.cnblogs.com/money1995/p/5359506.html

<think> 嗯,用户的问题是关于PCB结构定义。根据用户提供的引用内容,我需要整理出一个清晰、准确的定义。 用户引用的资料很全面:[1]提到了PCB板面设计和布局,[2]介绍了阻焊层的作用,[3]详细说明了各层的功能。这些内容都很关键。 PCB结构定义应该包含这几个核心要素: - 物理堆叠:就像引用[3]说的"导电层-绝缘层"交替叠加构成 - 功能分层:信号层、电源/地层、阻焊层、丝印层等各有特定作用 - 机械结构:板框、安装孔等机械定位元素 - 安全设计:阻焊层防止短路,就像引用[2]强调的保护功能 用户可能是电子工程新手,所以定义要避免太专业的术语。上次回答已经提到过叠层设计,这次可以延续"三明治"这个比喻。 需要特别注意引用[3]里的设计要点,尤其是多层板的规划逻辑,这对理解结构意义很重要。不过用户当前只问定义,这些细节可以放在后续问题里。 安全方面要突出阻焊层的作用,引用[2]说得很清楚:不仅是绝缘,还能保护铜层不被氧化。这点在定义里必须包含。 用户没明确说学习目的,但引用[3]提到"入门建议",可能暗示需要实践指导。所以定义之后可以补充些设计注意事项,比如板框层决定外形这种实用知识。 </think> PCB结构(Printed Circuit Board Structure)指印刷电路板的物理组成和分层设计,其核心定义可概括为: ### **PCB结构定义** PCB结构是指由**导电层(铜箔)**、**绝缘基材**和**功能性涂层**按特定顺序堆叠构成的复合体,通过精确的层间定位实现电气互连与机械支撑。其本质是**电气功能与物理结构的集成设计**,包含以下关键要素: --- ### **核心组成(参考引用[2][3])** 1. **导电层(信号/电源层)** - **信号层**(如顶层/底层):布设导线、焊盘,实现元器件互连。 - **电源/地层**:多层板中专设的完整铜平面,提供低阻抗供电回路(如VCC/GND层)[^3]。 2. **绝缘基材** - 常用FR-4环氧树脂等材料,隔离导电层并提供机械强度。 3. **功能性涂层** - **阻焊层**:覆盖非焊接区域的绝缘油墨(如绿色/黑色),防止短路和氧化[^2][^3]。 - **丝印层**:标注元件参数、极性标记(如白色文字/符号)。 - **钢网层**:定义锡膏涂覆区域,用于贴片焊接[^3]。 4. **机械结构** - **板框层**:精确标注PCB外形切割边界(如浅紫色线条)。 - **安装孔/定位孔**:固定螺丝孔、接插件定位孔等[^1][^3]。 --- ### **设计逻辑(引用[1][3])** - **分层规划**:根据电路复杂度设计叠层(如4层板典型结构:`信号-地-电源-信号`),优化信号完整性与EMC性能[^3]。 - **区域划分**:区分布线区与非布线区(如螺丝孔周围禁止布线)[^1]。 - **3D集成**:通过3D外壳层预览装配干涉,确保与外部结构兼容[^3]。 --- ### **PCB结构示意图(简化)** ```plain |-----------------------------| | 丝印层 (元件标识) | |-----------------------------| | 阻焊层 (开窗露出焊盘) | |-----------------------------| | 顶层信号层 (导线/焊盘) | |-----------------------------| | 绝缘基材 (FR-4) | |-----------------------------| | 内部电源层 (完整铜平面) | ← 多层板特有 |-----------------------------| | 内部地层 (完整铜平面) | |-----------------------------| | 绝缘基材 (FR-4) | |-----------------------------| | 底层信号层 (导线/焊盘) | |-----------------------------| | 阻焊层 + 钢网层 | |-----------------------------| ``` --- ### **设计意义** PCB结构直接影响电路的**电气性能**(如阻抗控制)、**散热效率**(铜厚与层数)和**可靠性**(机械应力分布)[^3]。例如: - 高频电路需增加地层减少干扰; - 大电流设计需加厚铜箔或开窗散热。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值