SylixOS热插拔概述

2023-10-14 11:50
文章标签 概述 热插拔 sylixos

本文主要是介绍SylixOS热插拔概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 1. 热插拔系统简介

  • 1.1 热插拔系统

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

                             

                                                           图 1-1热插拔系统结构

        如图 1-1所示,SylixOS 中有一个名称为"t_hotplug"的内核线程,设备的热插拔状态通过事件的方式报告给该线程。系统中还有一个名为"/dev/hotplug"的虚拟设备,它负责收集相关热插拔消息,应用程序可通过读取"/dev/hotplug"设备,获得自己关心的热插拔消息。

  • 1.2 实现原理

         在 SylixOS 中,可以使用如下两种方法获得热插拔事件:

         1.中断产生,例如"mini2440"开发板上SD卡热插拔操作,当SD卡插入或者拔出时会触发引脚中断,中断服务程序中会根据读取的引脚状态,产生相应的热插拔事件,将需要处理的事件加入到热插拔工作处理队列,等待内核线程处理。

         2. 轮询检测,当有些热插拔设备不产生中断(没有插拔中断功能的设备),则需要轮询检测某些事件标志。设备驱动程序需要将检测函数和参数注册到"hotplug"循环检测链表中,"t_hotplug"内核线程会定时调用检测函数,轮询检测函数会产生相应事件,等待内核线程处理。

         如图 1-1所示,当设备热插拔操作结束时,会产生一条热插拔消息存入缓存区,应用层程序可以通过读取虚拟设备"/dev/hotplug"(热插拔设备驱动创建),从缓存区中获取热插拔消息。

  • 2 读取热插拔消息

         前文提到,热插拔事件产生后会产生热插拔消息,存放在"/dev/hotplug"设备的缓存区中,则应用层可以对"/dev/hotplug"设备进行读取,获得应用层需要的热插拔消息。由于"/dev/hotplug"设备是字符设备,所以应用层可以对设备进行open、read、write、ioctl、close等操作,获得应用层所需的热插拔消息。

  • 2.1 获取热插拔消息实例

         SylixOS 中定义了当前常见的热插拔设备消息,如 USB、SD卡、PCI等,用户也可以自定义添加。此外,还有网卡的连接与断开等与热插拔行为相似的消息。

        下面举例说明如何获取网卡热插拔消息(本例程序是在mini2440开发板上测试运行),测试代码代码清单2-1所示。 

                                                            代码清单 2-1

    #include <stdio.h>
    #include <string.h>#define      MSG_LEN_MAX                (534)int main (int  argc, char  *argv[])
    {UINT8   pucMsgBuff[MSG_LEN_MAX];INT     iFd;INT32   iMsgType;BOOL    bInsert;ssize_t sstReadLen;CHAR   *pcDevName = NULL;UINT8  *pucArg    = NULL;UINT8  *pucTemp   = NULL;iFd = open("/dev/hotplug", O_RDONLY);                             /*  打开hotplug虚拟设备         */if (iFd < 0) {fprintf(stderr, "open /dev/hotplug failed.\n");return (-1);}ioctl(iFd, LW_HOTPLUG_FIOSETMSG, LW_HOTPLUG_MSG_NETLINK_CHANGE);  /* ioctl 设置关心网卡热插拔事件 */while (1) {sstReadLen = read(iFd, pucMsgBuff, MSG_LEN_MAX);              /* 读取热插拔消息               */if (sstReadLen < 0) {fprintf(stderr, "read hotplug message error.\n");close(iFd);return (-1);}if (sstReadLen < 5) {continue;}/** 解析热插拔消息*/pucTemp   = pucMsgBuff;iMsgType  = (pucTemp[0] << 24) | (pucTemp[1] << 16) | (pucTemp[2] << 8) | (pucTemp[3]);pucTemp  += 4;bInsert   = *pucTemp ? TRUE : FALSE;pucTemp  += 1;pcDevName = (CHAR *) pucTemp;pucArg    = pucTemp + strlen(pcDevName) + 1;printf("get new hotplug message >>\n"                         /*  打印热插拔消息             */" message type: %d\n""device status: %s\n"" device name: %s\n"" arg0: 0x%01x%01x%01x%01x\n"" arg1: 0x%01x%01x%01x%01x\n"" arg2: 0x%01x%01x%01x%01x\n"" arg3: 0x%01x%01x%01x%01x\n", iMsgType,bInsert ? "insert" : "remove", pcDevName, pucArg[0], pucArg[1],pucArg[2], pucArg[3], pucArg[4], pucArg[5], pucArg[6],pucArg[7], pucArg[8], pucArg[9], pucArg[10], pucArg[11],pucArg[12], pucArg[13], pucArg[14], pucArg[15]);}close(iFd);return (0);
    }

         如代码清单2-1所示,程序实现了应用层读取网卡热插拔消息的功能,在开发板上运行该程序,当发生网卡热插拔操作时,会得到网卡热插拔消息,实验现象如图 2-1所示。

                                           

                                                      图 2-1网卡热插拔消息

          通过分析代码清单2-1所示代码,用户在读取设备热插拔消息时应注意以下几点:

         1.以只读方式打开"/dev/hotplug"设备,SylixOS中热插拔消息在热插拔设备创建时产生,并且写入到设备中缓存区中。

         2.代码清单2-1中程序通过ioctl函数实现单独监听网卡热插拔消息的功能,应用程序可以根据需要设置ioctl函数中的参数来获取对应的消息。默认情况下是读取所有类型热插拔消息。

         3.代码清单2-1中read函数实现读取网卡热插拔消息的功能,读取消息后对获得的热插拔消息进行解析,然后输出打印。根据程序图 2-1输出结果可知,SylixOS中对热插拔消息格式进行特殊规定,格式分析参照2.2节。

  • 2.2 热插拔消息格式

         由2.1节中读取网卡热插拔消息实例可知,在SylixOS中热插拔消息有规定的格式。下面对SylixOS热插拔消息格式进行分析,如图 2-2所示。

                    

                                                              图 2-2热插拔消息格式

         参照图 2-2可知,消息的前4个字节标识了消息的类型。SylixOS中已经定义了USB键盘、USB鼠标、SD存储卡、SDIO无线网卡等热插拔类型。在实际的硬件平台上,设备驱动也可以定义自己的热插拔消息类型。

         第5个字节为设备状态,0表示拔出,1表示插入。

         从第 6 个字节开始,表示设备的名称,其内容为一个以'\0'结束的字符串,应用程序应该以此为结束符得到完整的名称。该名称为一个设备的完整路径名称,如"/dev/ttyUSB0"、"/media/sdcard0"等。由于SylixOS中,一个完整路径名称的最大长度为512,加上结束字符'\0',因此,dev name字段的最大长度为513。

         紧跟着设备名称('\0'字符结尾)的是 4 个可用于灵活扩展的参数,均为4字节长度。这4个参数可适应不同设备消息的特殊处理。SylixOS未规定每个参数的具体用法和存储格式(大端或小端),完全由设备驱动定义。

         综上论述,一个热插拔消息的最大长度为:4 + 1 + 513 + 4 + 4 + 4 + 4 = 534字节。

     

  • 3 热插拔消息产生

  • 3.1 网卡热插拔消息

          前文已经介绍了应用层如何获取热插拔消息,本章介绍SylixOS热插拔消息的产生流程。SylixOS中,热插拔消息在热插拔事件产生时产生,由热插拔设备驱动实现。

          下面以网卡热插拔为例,介绍网卡热插拔消息产生流程,如图 3-1所示(图中以网卡连接为例,网卡断开流程与此基本一致)。

                 

                                                   图 3-1网卡热插拔消息产生流程

          如图 3-1所示,在对网口进行必要的初始化后,将循环检测函数dm9000_watchdog注册到循环检测链表中,检测函数会根据网卡状态产生不同的热插拔消息,然后将热插拔消息存入缓存区。

  • 3.2 模拟热插拔实现

         下面通过信号模拟热插拔事件,用信号SIGALRM模拟设备插入,用信号SIGUSR1模拟设备拔出。示例代码清单3-1所示:

                                                               代码清单3-1 

    #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";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   i;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 < 8; ++i) {alarm(2);pause();kill(getpid(), SIGUSR1);}return  0;
    }

           本例利用信号模拟热插拔事件,运行2.1节中程序(注释掉ioctl函数,获取所有类型的热插拔消息),再执行代码清单3-1所示程序,会得到图 3-2所示结果。

                                                      

                                                  图 3-2模拟热插拔模拟结果

  • 4 小结

           本文档介绍了SylixOS下热插拔系统实现原理,以网卡热插拔为例,分析热插拔消息产生流程。最后通过信号模拟热插拔事件,打印出模拟的热插拔消息。

转载于:https://my.oschina.net/u/3248596/blog/832208

这篇关于SylixOS热插拔概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/210297

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

java集合的概述

集合就是一个容器,我们可以把多个对象放入的容器中。就像水杯(假设容量可以不断扩大)一样,你可以往水杯中不断地添加水,既然是水杯,你就不能往里添加沙子,也就是说集合中添加的对象必须是同一个类型的(引用类型,而不能是基本类型)。 看到集合的介绍会让我们的想起数组,那么集合和数组有什么区别呢? 首先,数组的大小是固定的,而集合理论上大小是不限的。 其次,数组既可以存储基本数据类型的数据,也可以存储

【CSS in Depth 2 精译_023】第四章概述 + 4.1 Flexbox 布局的基本原理

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

《计算机视觉工程师养成计划》 ·数字图像处理·数字图像处理特征·概述~

1 定义         从哲学角度看:特征是从事物当中抽象出来用于区别其他类别事物的属性集合,图像特征则是从图像中抽取出来用于区别其他类别图像的属性集合。         从获取方式看:图像特征是通过对图像进行测量或借助算法计算得到的一组表达特性集合的向量。 2 认识         有些特征是视觉直观感受到的自然特征,例如亮度、边缘轮廓、纹理、色彩等。         有些特征需要通

Unity Adressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。 您

Flutter 中的低功耗蓝牙概述

随着智能设备数量的增加,控制这些设备的需求也在增加。对于多种使用情况,期望设备在需要进行控制的同时连接到互联网会受到很大限制,因此是不可行的。在这些情况下,使用低功耗蓝牙(也称为 Bluetooth LE 或 BLE)似乎是最佳选择,因为它功耗低,在我们的手机中无处不在,而且无需连接到更广泛的网络。因此,蓝牙应用程序的需求也在不断增长。 通过阅读本文,您将了解如何开始在 Flutter 中开

类和对象的概述以及this指针的应用

定义 类是一种用户自定义的复合数据类型,即包括表达属性的成员变量,也包括表达行为的成员函数                                                                                                                                         类可用于表达那些不能直接与内置基