SylixOS Zynq平台私有中断绑定

1. 概述

本篇主要介绍在Zynq平台编写中断相关的驱动程序时,涉及CPU私有中断的相关绑定办法。

2. 私有中断简介

私有中断是多核CPU上特有的中断,私有中断只能被其所有者核心获取和响应,不会被其他核发现。常见的私有中断有全局定时器,私有看门狗定时器,私有定时器等,Zynq平台上还有来自PL的FIQ\IRQ。

3. 私有中断的绑定方法

3.1      常规共享中断绑定

Zynq平台使用的是GIC通用中断框架,常规的共享中断绑定和普通的中断绑定没有区别,在SylixOS上直接调用API_InterVectorConnectAPI_InterVectorEnable这两个函数即可绑定,绑定后中断可由任意一个CPU核心响应。

3.2      私有中断绑定

私有中断只能有所有者核心获取和响应,因此对应的中断和中断服务是绑定在相关的CPU核心上。在SylixOS下绑定私有中断需要让常规共享中断的绑定流程在对应CPU核心上完成才能成功绑定。即在驱动绑定私有中断的时候创建一个绑定在对应CPU核心上的绑定线程,然后由这个绑定线程去完成私有中断绑定。绑定流程如图 3.1示。

图 3.1私有中断绑定流程

Zynq平台31号私有定时器中断绑定框架如程序清单 3.1所示。

程序清单 3.1 Zynq平台31号私有定时器中断绑定框架

#define ZYNQ_VECTOR_NIRQ     31         /* 31号私有中断           */
static LW_HANDLE  _G_bindthread       = LW_OBJECT_HANDLE_INVALID;
static LW_HANDLE  _G_syncSignal       = LW_OBJECT_HANDLE_INVALID; 
/***************************************************************************
** 函数名称: __nIrqIsr
** 功能描述: 中断服务程序
** 输 入  : pvArg
** 输 出  : NONE
** 返  回  : LW_NULL
***************************************************************************/
static irqreturn_t __nIrqIsr (PVOID  pvArg)
{
return  LW_IRQ_HANDLED;
}
/***************************************************************************
** 函数名称: __bindThread
** 功能描述: 私有中断绑定线程
** 输 入  : pvArg
** 输 出  : NONE
** 返  回  : LW_NULL
***************************************************************************/
static PVOID  __bindThread (PVOID  pvArg)
{
API_SemaphoreBPend(_G_syncSignal, 
LW_OPTION_WAIT_INFINITE);              /* 等待同步信号量      */
API_InterVectorConnect(ZYNQ_VECTOR_NIRQ,             /* 连接中断服务程序    */
                     (PINT_SVR_ROUTINE)__nIrqIsr,
                     (PVOID)NULL,
                     "nIrq");
API_InterVectorEnable(ZYNQ_VECTOR_NIRQ);             /* 使能中断            */
}
/***************************************************************************
** 函数名称: __nIrqInit
** 功能描述: 中断服务初始化
** 输 入  : NONE
** 输 出  : NONE
** 返  回  : 成功返回ERROR_NONE,失败返回PX_ERROR
***************************************************************************/
INT  __nIrqInit (VOID)
{
LW_CLASS_CPUSET            cpuset;
 
_G_syncSignal = API_SemaphoreBCreate("SYNCSEM",     /* 创建同步等待信号    */
                                            0,
                                            LW_OPTION_OBJECT_GLOBAL,
                                            LW_NULL);
if (_G_syncSignal == LW_OBJECT_HANDLE_INVALID) {    /*判断信号量创建是否成功*/
     printk ("BIND signal init failed !\r\n");
     return PX_ERROR;
}
/*
 *  设置线程CPU绑定属性
*/
LW_CPU_ZERO(&cpuset);
LW_CPU_SET(0, &cpuset);
_G_bindthread = API_ThreadCreate("bindThread",      /* 创建绑定线程          */
                                   __bindThread,
                                   LW_NULL,
                                      LW_NULL);
if (_G_bindthread == LW_OBJECT_HANDLE_INVALID) {  /*判断绑定线程是否创建成功*/
     printk ("BIND thread init failed !\r\n");
     return PX_ERROR;
}
 
API_ThreadSetAffinity(_G_bindthread,               /* 将绑定线程设置到CPU0上*/
sizeof(cpuset), 
&cpuset);    
API_SemaphoreBPost(_G_syncSignal);                 /* 发送信号启动绑定线程    */
}
时间: 2024-10-09 20:25:31

SylixOS Zynq平台私有中断绑定的相关文章

79.ZYNQ内部私有定时器中断

上篇文章实现了了PS接受来自PL的中断,本片文章将在ZYNQ的纯PS里实现私有定时器中断.每个一秒中断一次,在中断函数里计数加1,通过串口打印输出. *本文所使用的开发板是Miz702(兼容zedboard) PC 开发环境版本:Vivado 2015.2 Xilinx SDK 2015.2* 中断原理 中断对于保证任务的实时性非常必要,在ZYNQ里集成了中断控制器GIC(Generic Interrupt Controller).GIC可以接受I/O外设中断IOP和PL中断,将这些中断发给CP

Linux平台双网卡绑定技术实现负载均衡(网卡聚合)bonding

Linux平台双网卡绑定技术实现负载均衡 保持服务器的高可用性是企业级 IT 环境的重要因素.其中最重要的一点是服务器网络连接的高可用性.网卡(NIC)绑定技术有助于保证高可用性特性并提供其它优势以提高网络性能. 双网卡绑定实现就是使用两块网卡虚拟成为一块网卡,这个聚合起来的设备看起来是一个单独的以太网接口设备,通俗点讲就是两块网卡具有相同的IP地址而并行链接聚合成一个逻辑链路工作.其实这项技术在Sun和Cisco中早已存在,被称为Trunking和Etherchannel技术,在Linux的2

基于Zynq平台的EtherCAT主站方案实现

作者:陈秋苑 谢晓锋 陈海焕 广州虹科电子科技有限公司 摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发.EtherCAT 具有高性能.低成本.容易使用等特点,目前在工业自动化领域有着广泛的应用.Zynq-7000 是赛灵思公司(Xilinx)推出的行业第一个全可编程 SoC 产品, 它将双核 ARM Cortex-A9 处理器,低功耗可编程逻辑以及常用的外设紧密集成在一起.ZedBoard 是基于 XC7Z020 器件的低成本开发板,此板可以运行基于 Linu

SylixOS中GIC通用中断控制器(二)——GIC实现

1.概述 本篇文档主要介绍IMX6UL平台上基于SylixOS集成开发环境中GIC通用中断控制器的实现流程和方法. 2.GIC控制器基地址获取 GIC控制器基地址通过调用armPrivatePeriphBaseGet函数获得.如图 2.1所示,Ctrl+h局搜索armPrivatePeriphBaseGet函数,搜索结果如图 2.2所示. 图 2.1全局搜索armPrivatePeriphBaseGet函数 图 2.2 armPrivatePeriphBaseGet函数搜索结果 参考DDI046

SylixOS NUC970平台SPI总线数据传输

概述 本文档是对NUC970平台上的SylixOS SPI总线数据传输的详细分析. SPI总线数据传输流程 NUC970平台上SPI总线数据传输流程如图 21所示. 当一个消息准备传输时,第一步判断发送和接收缓存区是否为空,若为空,就没有要接收或发送的数据,直接返回. 第二步,判断消息长度是否大于指定的值(可以改变,但要大于16个字节),若大于,以16字节为单位传输数据,否则以单字节为单位传输数据. 图21 SPI数据传输流程图 SPI总线的消息类型 在SylixOS中,SPI总线的消息类型,如

SylixOS iMX6平台I2C总线驱动

原理概述 I2C总线驱动概述 I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通信的能力,比如起始,停止,应答信号和MasterXfer的实现函数.驱动程序包含初始化I2C总线控制器__i2cHwInit函数,操作函数集(总线传输__i2cTransfer函数,总线控制__i2cMasterCtl函数). Imx6ul控制器的硬件描述 imx6ul处理器内部集成了一个I2C控制器,通过五个寄存器来进行控制. I2Cx_IADR I2C地址寄存器 I2Cx_IFDR I2

SylixOS中GIC通用中断控制器(一)——GIC简介

1. GIC简介 操作系统中,中断是很重要的组成部分.有了中断系统才可以不用一直轮询(polling)是否有事件发生,系统效率才得以提高.一般在系统中,中断控制分为三个部分:模块.中断控制器和处理器.其中模块通常由寄存器控制是否使能中断和中断触发条件等:中断控制器可以管理中断的优先级等,而处理器则由寄存器设置用来响应中断. 1.1 GIC结构 作为 ARM 系统中通用中断控制器的是 GIC(Generic Interrupt Controller),目前有四个版本,V1-V4(V2最多支持8个A

SylixOS ARM平台下的内存对齐访问

1.内存对齐1.1 内存对齐概要现代计算机中内存空间都是按照byte划分的,从理论上讲对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 1.2 内存对齐作用和原因各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率

SylixOS x86平台C++符号表

1.C++跨平台问题说明在x86平台下编译C++工程过程后,运行编译好的C++共享库时出现符号表__atomic_fetch_sub_4找不到的问题,如图 1.1所示. 图 1.1 符号表缺失 2.问题解决符号表缺失的原因是由于在跨平台编译时要加对应的平台编译选项,在x86平台下要增加-march=i686选项,如图 2.1所示. 图 2.1 增加Makefile编译选项 编译上传后,再运行动态库,发现动态库没有出现符号表未定义的问题,如图 2.2所示. 图 2.2 动态库正常运行截图 原文地址