SylixOS 热插拔系统

SPI全双工深度解析:从移位寄存器到时序实战,彻底搞懂主从同拍收发 在嵌入式系统中,串行通信协议是连接主控与外设的桥梁,而SPI凭借高速与全双工能力成为Flash、传感器和无线芯片的首选接口。全双工意味着主从设备在同一时钟节拍内既能发送又能接收,这种同步交换的底层机制源于两端移位寄存器构成的环形链路。理解CPOL/CPHA如何决定采样沿,掌握建立保持时间对信号完整性的影响,是解决乱码和数据错位的核心。从GPIO软件模拟到硬件外设的自动流水线,全双工在不同实现层次上有各自的收发逻辑与陷阱。实际调试W25Q64或NRF24L01时,读操作需要发送0xFF作为陪跑时钟,返回数据滞 阅读详情

1. 引入

所谓热插拔(hot-pluggin)即带电插拔,热插拔功能是允许用户在不关闭系统,不切断电源的情况下插入或拨出设备,例如:USB设备(U盘、USB鼠标等)SD卡设备。这个对用户看似简单的操作,在系统层面却有着复杂的处理。

2. SylixOS 热插拔系统简介

很早之前的计算机系统,程序员知道它们只需在启动时扫描所有的设备,并且他们从来不必关心设备消失直到整个机器被关闭。现在,随着USB设备、CardBus、PCI热插拔控制器的出现,SylixOS系统需要能够安全可靠的将硬件从系统中添加或者删除,这对驱动设计者无疑产生了额外的负担,因为现在他们必须处理一个突然冒出的或者突然消失的设备。

针对上面出现的情况好多操作系统增加了对热插拔的支持,如:Linux、Windows等,当然SylixOS也增加了自己的一套热插拔机制。

分两种情况来看待SylixOS热插拔,一种是内核看待热插拔是硬件,也即内核和设备驱动之间的交互;另一种是用户看待热插拔是“/dev/hotplug”设备文件,热插拔设备文件由内核创建。

3. SylixOS 热插拔系统原理分析


3.1 SylixOS 检测热插拔设备方法

  • 热插拔事件,例如: USB设备插入和拔出时可以通过API_HotplugEvent函数来异步的处理这两个事件.在事件处理函数中, 驱动程序可以使用oemDiskMount或其他挂载函数来挂载大容量设备.或者自行创建其他设备;
  • 循环检测,当有些热插拔设备不能产生事件时,(例如:没有插拔中断的设备)需要轮询检测某些事件标志,来获取设备的状态, 那么驱动程序并不需要自己创建线程或使用定时器来检查,只需要调用API_HotplugPollAdd函数将检测函数和参数插入hotplug循环检测队列即可,t_hotplug线程会定时调用检测函数.;
  • 热插拔消息,当设备热插拔操作结束时,可以通过API_HotplugEventMessage将热插拔的结果通知给应用程序,应用程序通过读取“/dev/hotplug”文件,即可获得驱动通知的热插拔消息.。

3.2 SylixOS热插拔系统分析

我们上面说过热插拔分两种情况来看,一是系统与驱动,二是系统与用户层。

3.2.1 系统与驱动层

系统与驱动层的交互,我们这里又分为热插拔事件和循环检查。热插拔事件是针对设备能够产生热插拔中断通知,这样SylixOS可将这个通知以异步的方式来处理;而循环检查是设备并不能产生一个热插拔中断通知,需要轮询检测某些事件标志,来获取设备的插入拔出状态。

1. 热插拔事件:

能够产生热插拔事件的设备,在驱动层只要调用函数API_HotplugEvent即可,SylixOS热插拔系统中对热插拔事件处理是通过我们之前博文中讲的JobQueue来实现的,这里我们不再做更多的解释。

2. 循环检测:

针对不能产生一个热插拔中断事件的设备,在驱动层可调用函数API_HotplugPollAdd来将驱动中的轮询检查函数来添加到系统中,这样系统会在一个确定的时间间隔轮询检查设备状态,这里我们介绍一下这种方法的原理。

typedef struct {
    LW_LIST_LINE    HPPN_lineManage;               /*  节点链表                    */
    VOIDFUNCPTR     HPPN_pfunc;                    /*  函数指针                    */
    PVOID           HPPN_pvArg;                    /*  函数参数                    */
    LW_RESOURCE_RAW HPPN_resraw;                   /*  资源管理节点                */
} LW_HOTPLUG_POLLNODE;
LW_LIST_LINE_HEADER   _G_plineHotplugPoll = LW_NULL;/*  热插拔循环检测链            */

上面的结构是轮询检测节点,函数指针和函数参数两个成员是驱动设计者所要关心的,也就是驱动的轮询检测函数,从下面的代码片段我们可以证实这一点,全局链表头_G_plineHotplugPoll是链接了所有的热插拔节点。

LW_API  
INT  API_HotplugPollAdd (VOIDFUNCPTR   pfunc, PVOID  pvArg)
{
    ...
    phppn->HPPN_pfunc = pfunc;
    phppn->HPPN_pvArg = pvArg;
    ...

    return  (ERROR_NONE);
}

在SylixOS系统层会通过“t_hotplug”线程循环检查热插拔节点链,从下面的代码片段我们可以证实这一点。

static VOID  _hotplugThread (VOID)
{
    ULONG  ulError;

    for (;;) {
        ...
            for (plineTemp  = _G_plineHotplugPoll;
                 plineTemp != LW_NULL;
                 plineTemp  = _list_line_get_next(plineTemp)) {

                phppn = _LIST_ENTRY(plineTemp, LW_HOTPLUG_POLLNODE, HPPN_lineManage);
                if (phppn->HPPN_pfunc) {
                    /*
                     *  调用先前安装的循环检测函数
                     */
                    phppn->HPPN_pfunc(phppn->HPPN_pvArg);
                }
            }
        ...
        }
    }
}
3.2.2 系统与用户层

系统与用户层的交互是系统将热插拔消息通知给用户层,这样用户层可以感知到设备的插入和拔出,通过调用函数API_HotplugEventMessage即可将热插拔消息通知出去,然后用户层通过读设备“/dev/hotplug”即可获得热插拔消息。

这里的实现原理分两部分,一是热插拔设备部分,二是消息传递部分:

1. 热插拔设备部分:

热插拔设备的创建涉及到了SylixOS设备驱动的知识,这里不再详述,在之后的文章中将做详细介绍。

2. 消息传递部分:

消息传递部分这里用到了之前博文中的块消息,从下面的代码片段可看出。

LW_API  
INT      API_HotplugEventMessage (INT       iMsg,
                                       BOOL      bInsert,
                                       CPCHAR    pcPath,
                                       UINT32    uiArg0,
                                       UINT32    uiArg1,
                                       UINT32    uiArg2,
                                       UINT32    uiArg3)
{
    ...
    _hotplugDevPutMsg(iMsg, ucBuffer, i);

    return  (ERROR_NONE);
}

VOID  _hotplugDevPutMsg (INT  iMsg, CPVOID pvMsg, size_t stSize)
{
    ...
    for (plineTemp  = _G_hotplugdev.HOTPDEV_plineFile;
         plineTemp != LW_NULL;
         plineTemp  = _list_line_get_next(plineTemp)) {

        photplugfil = _LIST_ENTRY(plineTemp, LW_HOTPLUG_FILE, HOTPFIL_lineManage);
        if ((photplugfil->HOTPFIL_iMsg == iMsg) ||
            (photplugfil->HOTPFIL_iMsg == LW_HOTPLUG_MSG_ALL)) {
            _bmsgPut(photplugfil->HOTPFIL_pbmsg, pvMsg, stSize);
            API_SemaphoreBPost(photplugfil->HOTPFIL_ulReadSync);
            bWakeup = LW_TRUE;
        }
    }
    ...
}

4. 应用实例

下面这段程序通过信号模仿硬件的中断以实现热插拔事件机制,程序中用信号SIGALRM模仿设备插入,用信号SIGUSR1模仿设备拔出,此例子仅供显示热插拔函数的使用。

#define __SYLIXOS_KERNEL
#include <SylixOS.h>
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <pthread.h>
#include <unistd.h>

static char      *msg = "Dev";
static pthread_t  tid;
static int        stop = 0;

void *process_thread (void *arg)
{
    int  *fd = (int *)arg;
    char buf[64];

    while (1) {
        memset(buf, 0, 64);
        read(*fd, buf, 64);

        if (buf[4] == 1) {
            fprintf(stdout, "%s insert.\n", buf + 5);
        } else {
            fprintf(stdout, "%s pullout.\n", buf + 5);
        }

        if (stop) {
            pthread_exit(NULL);
        }
    }

    return  NULL;
}

void send_event (void  *arg)
{
    int signum = (int)arg;

    if (signum == SIGALRM) {
        API_HotplugEventMessage(LW_HOTPLUG_MSG_ALL, 1, msg, 0, 0, 0, 0);
    } else if (signum == SIGUSR1){
        API_HotplugEventMessage(LW_HOTPLUG_MSG_ALL, 0, msg, 0, 0, 0, 0);
    }
}

void pullout_handler (int  signum)
{
    API_HotplugEvent((VOIDFUNCPTR)send_event, (void *)signum, 0, 0, 0, 0, 0);
}

void insert_handler (int  signum)
{
    API_HotplugEvent((VOIDFUNCPTR)send_event, (void *)signum, 0, 0, 0, 0, 0);
}

int main (int argc, char *argv[])
{
    int   fd;
    int   ret, i;

    fd = open("/dev/hotplug", O_RDONLY);
    if (fd < 0) {
        fprintf(stderr, "Open hotplug dev failed.\n");
        return -1;
    }

    ret = pthread_create(&tid, NULL, process_thread, (void *)&fd);
    if (ret < 0) {
        fprintf(stderr, "Create thread failed.\n");
        return -1;
    }

    if (signal(SIGALRM, insert_handler) == SIG_ERR) {
        fprintf(stderr, "Install signal handler failed.\n");
        return -1;
    }

    if (signal(SIGUSR1, pullout_handler) == SIG_ERR) {
        fprintf(stderr, "Install signal handler failed.\n");
        return -1;
    }

    for (i = 0; i < 16; ++i) {
        alarm(2);
        pause();
        pthread_kill(getpid(), SIGUSR1);
    }

    stop = 1;
    pthread_join(tid, NULL);

    return  0;
}
SPSS_Process—简单&平行&链式中介模型 本篇文章介绍采用SPSS的插件Process对简单中介、链式中介、平行中介模型进行检验的操作方法及结果解读。 阅读详情

相关推荐

PyTorch ModelNet点云数据集加载实战:从下载到Dataset类完整实现

在三维视觉与点云处理领域,数据集是算法研发的基石。ModelNet作为三维物体分类的基准数据集,其地位类似于图像领域的MNIST,是入门和评估模型性能的通用标准。理解其数据格式与加载原理,是进行点云分类、分割等任务的关键前置步骤。通过PyTorch的Dataset类,开发者可以构建高效的数据管道,将原始点云文件转换为神经网络可直接处理的张量格式,这一过程涉及数据采样、归一化、特征组装等核心操作,直接影响模型的训练效率和最终性能。本文聚焦于ModelNet10/40数据集,详细解析其目录结构,并提供一套稳健的

weixin_29032337的博客 280

SylixOS热插拔实现实例(四)

1.  网卡热插拔实现     SylixOS中,热插拔消息是在创建热插拔设备时产生,由热插拔设备驱动实现。下面介绍以网卡热插拔为例,介绍网卡热插拔消息产生流程。     以mini2440网卡驱动为例,驱动程序通过调用API_HotplugPollAdd函数将检测函数和参数插入hotplug循环检测队列,t_hotplug线程会定时调用检测函数。mini2440网卡驱动流程如图 1‑1所示(

渀波儿灞 514

[3D检测系列-PV-RCNN] PV-RCNN实战指南:从论文解析到代码调试全流程

本文提供了PV-RCNN在3D目标检测领域的实战全流程指南。文章深入解析了其Point-Voxel融合的核心思想,并详细演示了从环境搭建、数据准备、代码复现到模型训练与调试的具体步骤,特别针对常见的报错问题给出了解决方案,帮助开发者高效掌握这一经典算法。

weixin_29189381的博客 480

SylixOS xinput 系统

xinput系统简介SylixOS提供了一个xinput子系统,对键盘、鼠标、触摸屏等设备进行了一个统一管理,SylixOS的xinput系统支持热插拔,可随意添加删除输入设备,使用上很方便、很灵活,下面我们从一个框架图开始来开始学习SylixOS xinput子系统。xinput分析xinput系统框架图从图中看xinput系统分为3层:xinput设备层驱动层,xinput核心处理层,物理设备层

flags_s的博客 1133

告别报错!Win10下Autodock Vina 1.2.3保姆级安装与避坑指南

本文提供了Win10系统下Autodock Vina 1.2.3的完整安装与实战指南,涵盖环境配置、分子文件预处理、对接参数优化及结果分析等关键步骤。通过详细的避坑技巧和优化方案,帮助用户高效完成分子对接任务,特别适合生物信息学研究人员和药物发现领域的初学者。

weixin_29969209的博客 402

numeca linux 11,NUMECA FINE/Turbo16下载-NUMECA FINE/Turbo16官方版v16.0 最新版 - 起点软件园...

NUMECA FINE/Turbo16,空气动力学模拟工具,帮助小伙伴随时仿真模拟,让小伙伴可以模拟出最真实的环境,让小伙伴可以轻松完成环境模拟的服务,帮助小伙伴更好的解决自己的课题研究!NUMECA FINE/Turbo16说明1、支持在64位WINDOWS操作系统和LINUX操作系统下运行2、基于全二阶精度的数值格式,保证了计算精度3、采用先进的全多重网格技术和基于密度的求解方法保证了快速的流...

weixin_39858298的博客 1621

SylixOS热插拔驱动接口(三)

1. 热插拔设备驱动 SylixOS下创建插拔消息设备,应用程序可以读取此设备来获取系统热插拔消息。 1.   安装驱动程序 内核线程调用hotplugDrvInstall函数安装消息设备驱动程序。 #include INT _hotplugDrvInstall (VOID); 函数_hotplugDrvInstall原型分析: l 函数成功返回ERROR_NONE,失败返回P

渀波儿灞 360

3D视觉实战之双目相机物体尺寸实时测量

视差图滤波能够将稀疏视差转变为稠密视差,并在一定程度上降低视差图噪声,改善视差图的视觉效果,但是比较依赖初始视差图的质量。的目标是获得左右两个相机的内参、外参和畸变系数,其中内参包括左右相机的fx,fy,cx,cy,外参包括左相机相对于右相机的旋转矩阵和平移向量,畸变系数包括径向畸变系数(k1, k2,k3)和切向畸变系数(p1,p2)以及其他一些畸变类型。:相比于昂贵的专业设备,便宜的双目摄像头可以显著降低成本,使得实时点云生成技术更加普及和经济实惠。

qq_53545309的博客 2099

SylixOS热插拔概述

1. 热插拔系统简介 1.1 热插拔系统 热插拔设备指支持带电操作的一类设备,允许用户不关闭系统、不切断电源情况下取出或更换设备。热插拔系统用于管理系统中所有热插拔设备的插入、拔出状态,从而能够让系统内部自动完成此类设备的创建、删除工作而无需用户手动处理。同时,热插拔...

cidian6347的博客 216

Deep SHAP 深度学习模型的可解释性分析

Deep SHAP 算法是一种用于解释深度学习模型的技术, 该算法通过将每个特征的重要性与输出值相关联来进行解释。本博客对深度学习的模型可解释性进行了分析。

cnjs1994的博客 5119

YOLOv8首发优化:遥感目标检测 | 专为低质量遥感图像设计的边缘 - 高斯聚合(EGA)模块,解决低空间分辨率、传感器噪声、目标模糊、低光照退化和部分遮挡等限制

一种轻量级网络,其创新性地整合了专为低质量遥感图像设计的边缘 - 高斯聚合(EGA)模块。

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 489

linux 实现监听热插拔事件

在一些跑linux 系统的平台上,比如故事机,会支持sdcard 热插拔的功能,也就是在sdcard 插入后,把sdcard mount到文件系统中,sdcard拔出后移除。上层应用要怎么知道这个事件呢,应用层可以注册监听uevent 事件即可,下面给出对应的实现。 ​ #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &l...

xiongtiancheng的博客 3519

海波龙(Hyperion,现属 Oracle)合并报表以 HFM(Hyperion Financial Management)为核心系统,方法论核心是以控制为基础确定合并范围,通过维度建模统一数据口径

摘要:海波龙合并报表系统(HFM)采用"规则驱动、维度建模"的方法论,通过四个核心环节实现自动化合并:确定合并范围、数据标准化、自动抵销调整及报表生成。系统支持多会计准则,以控制为基础划分合并方法(完全合并/权益法/成本法),通过维度建模统一数据口径,自动处理内部交易抵销、外币折算等复杂操作。业务操作流程涵盖数据采集、转换、抵销调整到报表生成全过程,关键控制点包括内部交易匹配、股权变动处理等。最终输出合规合并报表及完整审计线索,满足监管与管理需求。(150字)

金牌架构师 1304

SylixOS -- 热插拔子系统

本文只收集SylixOS热插拔子系统相关文章:SylixOS 热插拔系统(原理介绍)SylixOS热插拔概述(热插拔消息实例)

诸葛一帆丶的博客 634

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SylixOS热插拔子系统分析(二)

1. 系统与驱动 热插拔子系统中,系统与驱动层的交互分为热插拔事件和循环检测。热插拔事件是针对设备能够产生热插拔中断通知的情况,SylixOS可以将通知以异步的方式来处理;而循环检测是设备不能产生一个热插拔中断通知的情况,需要轮询检测某些事件标志,来获取设备的插入或拔出状态。 1.1 热插拔事件 能够产生热插拔事件的设备,在驱动层调用API_HotplugEvent函数即可,Sy

渀波儿灞 378

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

SylixOS热插拔概述(一)

热插拔系统简介 热插拔系统 热插拔设备指支持带电操作的一类设备,允许用户不关闭系统、不切断电源情况下取出或更换设备。热插拔系统用于管理系统中所有热插拔设备的插入、拔出状态,从而能够让系统内部自动完成此类设备的创建、删除工作而无需用户手动处理。同时,热插拔系统还会收集热插拔相关信息,供应用程序使用。SylixOS热插拔系统结构如图 1-1所示。 图 1-1 热插拔

渀波儿灞 724

SylixOS基于Nuc970平台的SD驱动移植

1. 适用范围 本文档为实现Nuc970平台的SD驱动总结,提供一些SylixOS SD驱动移植方法的参考。2. 原理概述2.1控制器类型 SD控制器有两种类型,分为SD标准控制器(SDHCI)和SD非标准控制器。 SylixOS Base代码中实现了SDHCI的驱动,但Nuc970的SD控制器是非标准控制器,其功能都需要在BSP中单独实现。2.2 命令、...

weixin_34236497的博客 137

SylixOS中AHCI驱动框架分析

SATA

li5830的博客 534

SylixOS的初探

SylixOS是第一个国产开源嵌入式实时操作系统,能够支持smp对称多核处理器的运行。它是目前国内唯一可以和vxworks抗衡的系统,也被视为将来在国内可以替换掉vxworks系统的希望。 在此对SylixOS系统做一个最初的了解。

贴吧尚书的博客 7551

SylixOS里的错误号【3】--- 系统错误号

SylixOS里的系统错误号定义位于libsylixos\SylixOS\system\include\s_error.h文件中。 /********************************************************************************************************* ** ** 中国软件开源组织 ** **

ScilogyHunter的博客 570

SylixOS 技术简介

以下是SylixOS基本特性,SylixOS源码大家可以到官方网站下载。 基本功能 1. 支持任务管理,支持256个任务调度优先级,实现基于优先级的抢占式调度和同优先级的时间片轮转调度算法; 2. 支持多核SMP软件架构,支持任务统一管理,并支持任务对特定核的亲和度调度策略; 3. 支持中断管理; 4. 支持信号量、消息队列、管道、共享数据结构、事件和异步信号机制,满足任务间通信以及同步和互斥; 5. 支持MMU内存管理; 6. 支持时钟和定时器管理; 7. 支持异常管理..

xian_gw的博客 3679

SylixOS介绍

SylixOS是一款大型嵌入式实时操作系统,诞生于2006年,起初它只是一个小型多任务调度器,经过多年开发,SylixOS目前已经成为一个功能完善、性能卓越、可靠稳定的嵌入式系统软件开发平台。 与SylixOS类似的实时操作系统中,全球比较知名的有VxWorks(主要应用于航空航天、军事与工业自动化领域)、RTEMS(起源于美国国防部导弹与火箭控制实时系统)等。 SylixOS作为实时操作系统的后来者,在设计思路上借鉴了众多实时操作系统的设计思想,使得SylixOS在功能和具体性能上达到或超过了众多实时操.

ScilogyHunter的博客 2657

SylixOS---SD协议栈之二:系统框架

1. 历史背景 为了让读者在整体上对SylixOS SD 协议栈(以下称作SD Stack)有更深的理解,本篇将会把早期SD Stack与最新的进行对比说明。第一版本始于2010年,该版仅支持SD存储卡(SD Memory),同时支持SPI和SD传输模式。后来由于项目需求,需要支持SDIO WIFI设备,这就带来了多设备类支持的需求。原SD Stack 在这方面并未有相应的功能,并且存在诸多不足或缺陷,因此需要一个更加丰富和完善的SD Stack。 2. 原有SD Stack分析 2.1 原有SD S

陈言陈语的小陈 568

linux ahci 驱动下载,linux ahci驱动分析 SylixOS中AHCI驱动框架分析

1、概述SylixOS中AHCI驱动框架分析。本文档介绍SATA和AHCI相关协议,以IMX6Q实验平台为基础,分析SylixOS中AHCI驱动框架的具体实现。2、SATA简介2.1 SATA硬盘串口硬盘SATA(Serial ATA)与以往的并口硬盘PATA(Parallel ATA)相比,数据传输速度更加快捷,并支持热插拔;同时,SATA总线使用了嵌入式时钟频率信号,具备了比以往更强的纠错能力...

weixin_36165323的博客 713
上一篇: SylixOS线程间通信-SylixOS信号量
下一篇: SylixOS I/O系统
flags_s
博客等级 码龄11年 15粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值