基础知识
arm体系架构的处理器中通常将低地址32字节作为中断向量表,当中断产生时会执行以下操作:
① 保存处理器当前状态,设置中断屏蔽位和各条件标志位
② 设置当前程序状态寄存器cpsr中相应位
③ 将lr_mode寄存器设置成返回地址
④ 跳转到中断向量地址执行,从而跳转到相应的中断程序中执行
⑤ 执行中断处理函数内容
⑥ 恢复被屏蔽的中断屏蔽位
⑦ 返回到被中断指令的下一条指令处继续执行
zynq中低32字节作为中断向量表,每个中断占据4字节,这4字节通常存储一个跳转指令,从而跳转到中断解析程序中。这低32字节中断向量表如:
本内容部分修改自《xilinx zynq soc与嵌入式linux设计实战指南——兼容arm cortex-a9的设计方法》
例程
vivado中ps部分配置如下图:
选中fabric interrupts和irq_f2p[15:0]
连接如下图:
其中concat模块只是简单的将多个信号合并为一个总线连接到zynq;而utility vector logic则是执行一些逻辑计算,这里选择not逻辑计算。
#include
#include platform.h
#include xscugic.h
#include xil_exception.h
#define int_cfg0_offset 0x00000c00
// parameter definitions
#define sw1_int_id 61
#define sw2_int_id 62
#define sw3_int_id 63
#define intc_device_id xpar_ps7_scugic_0_device_id
#define int_type_rising_edge 0x03
#define int_type_highlevel 0x01
#define int_type_mask 0x03
static xscugic intcinst;
static void sw_intr_handler(void *param);
static int interruptsystemsetup(xscugic *xscugicinstanceptr);
static int intcinitfunction(u16 deviceid);
static void sw_intr_handler(void *param)
{
int sw_id = (int)param;
printf(sw%d int/n/r, sw_id);
}
void intctypesetup(xscugic *instanceptr, int intid, int inttype)
{
int mask;
inttype &= int_type_mask;
mask = xscugic_distreadreg(instanceptr, int_cfg0_offset + (intid/16)*4);
mask &= ~(int_type_mask << (intid%16)*2);
mask |= inttype config->handlertable[int_id].handler = handler; // 即参数sw_intr_handler
instanceptr->config->handlertable[int_id].callbackref = callbackref;// 即参数1
即将处理函数(sw_intr_handler)及其参数(1)放到&intcinst中,
再次回到irq中断后会执行的xscugic_interrupthandler函数(在bsp目录下/ps7_cortexa9_0/libsrc/standalone_v5_2/src下xscugic_intr.c)中有以下语句:
tableptr = &(instanceptr->config->handlertable[interruptid]);
if(tableptr != null) {
tableptr->handler(tableptr->callbackref);
}
即当tableptr不为空时就执行了instanceptr->config->handlertable[interruptid]->handler(instanceptr->config->handlertable[interruptid]->callbackref);结合上一段说明即执行了sw_intr_handler(1)或参数为2、3。
综上,irq中断产生后跳转到0x18执行b irqhandler执行,在irqhandler下执行bl irqinterrupt;在函数irqinterrupt中xexc_vectortable[xil_exception_id_irq_int].handler(xexc_vectortable[xil_exception_id_irq_int].data);经过xil_exceptionregisterhandler函数后即xscugic_interrupthandler(&intcinst)再经过xscugic_connect函数这也即sw_intr_handler(1)或参数为2、3。最终irq中断执行了sw_intr_handler函数。
PLC到底是个啥呢 PLC SSD如何理解
为何中国大公司不开发Linux桌面应用呢
汽车自动驾驶催生芯片产业并购潮
箱式变压器开关跳闸的常见原因和处理方法
Introduction to medical instru
ARM体系架构处理器的中断程序分析
大功率电机如何选配变频器?
工业机器人市场发展前景广阔,未来或将成为制造业市场的主力军
博联智慧屏:内管全屋智能,外联智慧社区
KUKA KR C4系统还原/镜像U盘操作步骤
C语言代码优化的一些技巧
BBC虚拟现实工作室发布VR新品,成功地解决了尼罗河上建造水坝这一难题
中科曙光增持天津海光,加码国产X86处理器
TSMaster图形模块功能详解(三)—— 以CAN信号为例
生益电子112G的PCB产品有望在今年实现量产
应用于PCB丝网印刷的三种方式
电子节能灯预热软启动电路图
IPQ8074板载12天线符合802.1111ax标准双频工业级嵌入式无线AP主板
受益雪亮工程,海康威视2019 H1实现营收239.2亿
四个环节贯穿智能家居产业链上中下游