STM32 USB HID 自定义设备 bulk 传输

2023-11-19

ST(意法半导体公司)为STM32系列处理器编写了外设USB的库,并提供了很好的参考例程,本文就是参考ST提供的例程,在STM32F4 discovery板子上实现usb bulk传输。Host端是在linux平台上利用libusb库函数写的读写USB应用。

本次实现在STM32 USB例程中的Device HID 鼠标例程基础上添加bulk传输端点修改而来。

usb_conf.h 文件中添加 bulk传输端点

/*
*   endpoint 0x80 and 0x00 are used for enumerating device.
*   endpoint 0x81 and 0x80 are used for control xfer.
*/
#define HID_IN_EP                    0x81
#define HID_OUT_EP                   0x01
#define HID_IN_PACKET                4
#define HID_OUT_PACKET               4

// add bulk xfer endpoint
#define HID_IN_BULK_EP               0x82 // endpoint in 
#define HID_OUT_BULK_EP              0x02 // endpoint out
// define endpoint max packet size
#define HID_IN_BULK_PACKET           64 
#define HID_OUT_BULK_PACKET          64
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

usb_desc.c 中修改设备描述符

把bDeviceClass值改为0xFF,表示用户自定义设备;修改VID 和 PID,例如以下程序中的值。

__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END =
  {
    // the size of device descriptor
    0x12,                       /*bLength */

    // descriptor type. device descripor type is 0x01
    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/

    // we use usb2.0
    0x00,                       /*bcdUSB */
    0x02,

    // user defined device
    0xff,                       /*bDeviceClass*/ 
    0x00,                       /*bDeviceSubClass*/

    0x00,                       /*bDeviceProtocol*/

    // endpoint 0 max packet size
    USB_OTG_MAX_EP0_SIZE,      /*bMaxPacketSize*/

    // vendor ID
    LOBYTE(USBD_VID),           /*idVendor*/
    HIBYTE(USBD_VID),           /*idVendor*/

    // Product ID
    LOBYTE(USBD_PID),           /*idVendor*/
    HIBYTE(USBD_PID),           /*idVendor*/

    // Device version
    0x00,                       /*bcdDevice rel. 2.00*/
    0x02,
    USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/
    USBD_IDX_PRODUCT_STR,       /*Index of product string*/
    USBD_IDX_SERIAL_STR,        /*Index of serial number string*/

    // the number of configurations 0x01
    USBD_CFG_MAX_NUM            /*bNumConfigurations*/
  } ; /* USB_DeviceDescriptor */
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

修改配置描述符

在原有的鼠标配置描述符中添加bulk xfer的两个端点描述符(IN and OUT)。最后, 记得修改配置描述符的长度,不然配置描述符传输不完整。

在usbd_hid_core.h 文件中修改配置描述符的大小 USB_HID_CONFIG_DESC_SIZ

        #define USB_HID_CONFIG_DESC_SIZ       46
 
 
  • 1

配置描述符中的接口描述符也要做相应的调整,将端点数目 bNumEndpoints 改为4个,将接口子类bInterfaceSubClass改成 0x00, 将接口协议改成0x00。nInterfaceProtocol 修改成0x00。具体描述见下面代码中的注释。

__ALIGN_BEGIN static uint8_t USBD_HID_CfgDesc[USB_HID_CONFIG_DESC_SIZ] __ALIGN_END =
{
  0x09, /* bLength: Configuration Descriptor size */
  USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
  USB_HID_CONFIG_DESC_SIZ,
  /* wTotalLength: Bytes returned */
  0x00,
  0x01,         /*bNumInterfaces: 1 interface*/
  0x01,         /*bConfigurationValue: Configuration value*/
  0x00,         /*iConfiguration: Index of string descriptor describing
  the configuration*/
  0xE0,         /*bmAttributes: bus powered and Support Remote Wake-up */
  0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/

  /************** Descriptor of Joystick Mouse interface ****************/
  /* 09 */
  0x09,         /*bLength: Interface Descriptor size*/
  USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
  0x00,         /*bInterfaceNumber: Number of Interface*/
  0x00,         /*bAlternateSetting: Alternate setting*/
  0x04,         /*bNumEndpoints*/
  0x00,         /*bInterfaceClass: HID*/
  0x00,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
  0x00,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
  0,            /*iInterface: Index of string descriptor*/
  /******************** Descriptor of Mouse endpoint ********************/
  /* 18 */
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

  HID_IN_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
  0x03,          /*bmAttributes: Interrupt endpoint*/
  HID_IN_PACKET, /*wMaxPacketSize: 4 Byte max */
  0x00,
  0x0A,          /*bInterval: Polling Interval (10 ms)*/
  /******************** Descriptor of Mouse endpoint ********************/
  /* 25 */
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

  HID_OUT_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
  0x03,          /*bmAttributes: Interrupt endpoint*/
  HID_IN_PACKET, /*wMaxPacketSize: 4 Byte max */
  0x00,
  0x0A,          /*bInterval: Polling Interval (10 ms)*/
  /******************** Descriptor of bulk xfer endpoint ********************/
  /* 32 */
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

  HID_IN_BULK_EP,     /*bEndpointAddress: Endpoint Address (IN)*/
  0x02,          /*bmAttributes: bulk endpoint*/
  HID_IN_BULK_PACKET, /*wMaxPacketSize: 64 Byte max */
  0x00,
  0x0A,          /*bInterval: Polling Interval (10 ms)*/
  /******************** Descriptor of bulk xfer endpoint ********************/
  /* 39 */
  0x07,          /*bLength: Endpoint Descriptor size*/
  USB_ENDPOINT_DESCRIPTOR_TYPE, /*bDescriptorType:*/

  HID_OUT_BULK_EP,     /*bEndpointAddress: Endpoint Address (OUT)*/
  0x02,          /*bmAttributes: bulk endpoint*/
  HID_OUT_BULK_PACKET, /*wMaxPacketSize: 64 Byte max */
  0x00,
  0x0A,          /*bInterval: Polling Interval (10 ms)*/
  /* 46 */
} ;
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

至此,描述符的修改就完成了。由于是bulk传输,所以不需要定义报告描述符,只有中断传输和控制传输需要定义报告描述符。接下来需要添加发送和接收数据的接口函数了。

初始化端点

usb_hid_core.c 中,HID 初始化函数中添加对 bulk I/O 端点的初始化,直接追加在鼠标所使用端点后面。在最后又添加了bulk xfer OUT 端口的发送初始化函数,以便让USB知道当接收到数据后数据该存储到哪儿。数组 USB_Rx_Buffer[HID_OUT_BULK_PACKET] 是用户自己定义的一个数据缓冲区,大小设为该端点的最大包长度即可。

static uint8_t  USBD_HID_Init (void  *pdev, 
                               uint8_t cfgidx)
{
  printf("%s\r\n", __FUNCTION__);
  /* Open EP IN */
  DCD_EP_Open(pdev,
              HID_IN_EP,
              HID_IN_PACKET,
              USB_OTG_EP_INT);

  /* Open EP OUT */
  DCD_EP_Open(pdev,
              HID_OUT_EP,
              HID_OUT_PACKET,
              USB_OTG_EP_INT);

  /* Open EP IN BULK */
  DCD_EP_Open(pdev,
              HID_IN_BULK_EP,
              HID_IN_BULK_PACKET,
              USB_OTG_EP_BULK);

  /* Open EP OUT BULK*/
  DCD_EP_Open(pdev,
              HID_OUT_BULK_EP,
              HID_OUT_BULK_PACKET,
              USB_OTG_EP_BULK);

   /* Prepare Out endpoint to receive next packet */
   DCD_EP_PrepareRx(pdev,
                    HID_OUT_BULK_EP,
                    (uint8_t*)(USB_Rx_Buffer),
                    HID_OUT_BULK_PACKET);

  return USBD_OK;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

添加 OUT 端点接收HOST发出数据的回调函数。类似地,添加 IN端点回调函数发送数据到HOST

在usb_hid_core.c 中,修改USB_HID_cb 函数数组中的函数指针。

USBD_Class_cb_TypeDef  USBD_HID_cb = 
{
  USBD_HID_Init,
  USBD_HID_DeInit,
  USBD_HID_Setup,
  NULL, /*EP0_TxSent*/  
  NULL, /*EP0_RxReady*/
  USBD_HID_DataIn, /* add your IN point callback to send data to HOST */
  USBD_HID_DataOut, /* add your OUT point callback to receive data from HOST*/
  NULL, /*SOF */
  NULL,
  NULL,      
  USBD_HID_GetCfgDesc,
#ifdef USB_OTG_HS_CORE  
  USBD_HID_GetCfgDesc, /* use same config as per FS */
#endif  
};

// USB OUT endpoint callback
static uint8_t USBD_HID_DataOut (void  *pdev, uint8_t epnum)
{
    uint16_t USB_Rx_Cnt;

    USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdev)->dev.out_ep[epnum].xfer_count;

    // add your own data to process the received data 
    /*    
    *    printf_the_received_data((char *)USB_Rx_Buffer, USB_Rx_Cnt);
    */

  /* Prepare Out endpoint to receive next packet */
    DCD_EP_PrepareRx(pdev,
                       HID_OUT_BULK_EP,
                       (uint8_t*)(USB_Rx_Buffer),
                       HID_OUT_BULK_PACKET);

  return USBD_OK;
}

static uint8_t USBD_HID_DataIn(void  *pdev, uint8_t epnum)
{
    int USB_Tx_length = HID_IN_BULK_PACKET;

      // copy your data to buffer, then send through USB IN endpoint
      /*
      *   buffer_copy(APP_Rx_Buffer, USB_Tx_length);
      */
      /* Prepare the available data buffer to be sent on IN endpoint */
      DCD_EP_Tx (pdev,
                 CDC_IN_EP,
                 (uint8_t*)&APP_Rx_Buffer[USB_Tx_ptr],
                 USB_Tx_length);

     return USBD_OK;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

验证

将USB代码编译后下载到STM32F4Discovery 板子上运行,连接USB线到PC,windows操作系统下在设备管理器中可以看到HID设备,查看VID/PID 或者USB 显示出的Product string和你代码中设定的一致的就是我们的USB 设备。


STM32 USB 上位机软件实现

请查看 STM32 USB 上位机程序实现,利用 libusb 在 linux 平台上 使用 bulk xfer 和 STM32F4Discovery 传输数据。对应的源码在 http://download.csdn.net/detail/chengwenyang/9479835 可以下载。




from:http://blog.csdn.net/chengwenyang/article/details/51039741

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 USB HID 自定义设备 bulk 传输 的相关文章

  • USB 传输数据

    我正在尝试通过 USB 发送和接收数据 我的设备 Acer Iconia A500 拥有连接到设备所需的一切 一切都很好并且工作正常 但是当我尝试发送和接收数据时 它的行为并不像预期的 这是我的代码 for this is the main
  • 软件和与外部设备串行通信的波特率限制

    我使用 USB 端口作为虚拟 COM 端口运行 以使用 MATLAB 或 Visual Basic 6 实现与外部设备的串行通信 我面临波特率限制 具体取决于我用于与设备通信的软件 MATLAB 2018a 没有问题 因为它可以设置高波特率
  • Mac中如何获取usb设备的设备描述符和配置描述符?

    I have minimum exposure to xcode and I Okit framework I have seen device descriptor and configuration descriptor of a us
  • 无法使用 Android Studio、Windows 7 连接到 Samsung Galaxy Tab S

    我有一台漂亮的新三星 Galaxy Tab S 我正在尝试将其与 Android Studio 连接 我已在平板电脑上启用 USB 调试 并通过执行 SAMSUNG USB Driver for Mobile Phones v1 5 45
  • 不支持混合类型

    请看一下下面的头文件 pragma once using namespace UsbLibrary ref class MissileLauncher public MissileLauncher void private Bytes us
  • 在 Mac 上通过 USB 访问 iOS 设备

    我有一个移动应用程序需要将文件传输到数据库 然而 其规范之一是 如果用户没有设置无线网络 则应该能够将其插入 Mac 并将文件传输到数据库 然而 我遇到的问题是如何将上述文件从 iPad 上通过 USB 传输到计算机上 上周我研究了各种解决
  • Android:与充当主机的 USB 设备通信

    我们制作了一个可以充当 USB 主机或从机并处理其接收到的数据的设备 我想使用Android手机通过USB向其发送数据 我的研究使我得出结论 如果不修改硬件或操作系统 我们就无法在 USB 主机模式下使用 Android 设备 这样做不是一
  • libv4l2:打开流时出错:设备上没有剩余空间

    我尝试为 opencv 获取立体声对 我将 Logitech B910 和 Logitech C910 网络摄像头连接到 USB 但有这个错误 我玩弄了怪癖参数并设置outfmt mjpeg在mplayer中 但又出现此错误 在哪里可以找到
  • 使用Python直接向USB发送信号

    如何使用 Python 将 USB 端口连接设置为高或低 这可用于定制 USB 设备 例如 假设我有一个 LED 连接到 USB 端口 数据线 现在通过代码我想闪烁它或控制它 现在 这可以通过使用任何微控制器 Arduino Raspber
  • WriteFile 返回错误代码 87

    我正在开发一个写入 HID 设备的程序 但收到错误 87 WriteFile 函数参数无效 我从 Jan Axelson 的 USB Complete 获得了这些功能 所以我不确定为什么会收到错误 我用它来查找我的设备 private vo
  • Windows 8.1 上的 Pyusb - 没有可用的后端 - 如何安装 libusb?

    使用 pyinstaller 3 1 python 2 7 9 和 tkinter 尝试使用 pyusb 而不是 pyserial 但没有可用的后端 调查Windows 上的 Pyusb 没有可用的后端 https stackoverflo
  • 我无法找到 libftdi 的 mpsse (SPI) 模式的示例代码

    这不是一个家庭作业问题 尽管这是一个工作问题 几个月前 我刚写完一份规范 老板就会把它外包出去 因为资金紧张 所以我正在尝试自己做这件事 我是一个很弱的 C 编码员 如果 gcc 能输出一些运行时不会出现段错误的东西 或者有时根本没有任何东
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 使用 Windows 原始访问 API 直接访问 USB 驱动器

    在USB物理驱动器的末尾 我想使用Windows原始访问API直接写入数据 我不想使用内核驱动程序来做到这一点 据我所知 出于安全原因 Windows XP SP2 或 SP3 阻止了 HDD 直接访问 我不确定 USB 驱动器是否如此 请
  • 如何在 ADB 连接期间禁用电池充电?

    问题描述 每次我在电脑和手机之间连接 USB 线时 电池都会自动充电 我想使用 ADB 协议 但我不想在 ADB 连接期间为电池充电 是否可以关闭此充电功能 当然 我该怎么做呢 环境 Android 操作系统 4 及更高版本的手机 我只需要
  • Python:获取USB闪存驱动器设备的名称[windows]

    我正在尝试编写一个小程序 它将能够读取有关 REMOVEABLE DEVICE USB 的一些信息 我试过了pyusb https github com walac pyusb但我无法提取我需要的数据 我想从系统中读取 USB 设备的名称
  • Swift 上的 USB 连接委托

    Swift 中是否有一个代表可以让我的班级知道何时通过计算机的 USB 插入新设备 我想知道我的程序何时可以使用新设备 Eric Aya 的答案已经相当不错了 但这里有一个 Swift 3 的改编 我把大部分丑陋的东西包裹在一个USBWat
  • 作为附件的 Android 设备

    我有 2 个 Android 设备 我想用 USB OTG 电缆连接它们 并在两个设备之间进行来回通信 据我了解 一台 Android 设备将充当 USB 主机 运行 4 4 的 Nexus 7 另一台 Android 设备将充当 USB
  • 以编程方式连接和断开 USB,“无需拔出和重新插入”

    我需要以编程方式连接和断开 USB 也就是说 我已经插入了USB设备 我需要使用 C NET 应用程序传输文件 该应用程序将监视特定文件夹并将文件从该文件夹传输到 USB 驱动器 我需要在文件传输后断开 USB 设备的连接 并在需要时连接
  • Android USB Host 模式和 Accessory 模式

    我正在尝试学习 Android USB 主机 配件连接 我读到 Android 设备可以充当 USB 主机或 USB 配件 因此 我创建了两个项目 其中一个是 USB 主机项目 另一个是 USB 附件项目 我将这些项目安装到两个不同的 An

随机推荐

  • 基于矩阵求解多元线性回归

    多元线性回归法也是深度学习的内容之一 用java实现一下多元线性回归 一元线性回归的公式为 y a x b 多元线性回归的公式与一元线性回归的公式类似 不过是矩阵的形式 可以表示为Y AX b 其中 Y是样本输出的合集 X是样本输入的合集
  • 协议转换网关 通用服务器,数据采集、协议转换网关

    产品名称 数据采集 协议转换网关 产品链接 http cn trustexporter com cp luomicekong o4256770 htm 手机版链接 https m trustexporter com cz4256770 ht
  • 【Linux】安装Ubuntu18.04时常见的一些问题

    1 vim sudo apt get install vim 出现 Command vim not found 解决办法 输入sudo apt install vim即可 sudo apt install vim 如果安装失败最后一行显示
  • TCP对方关闭对应的进程,调用Send将会产生Broken pipe信号默认会关闭进程

    解决 Linux下send函数 Broken pipe错误的解决方法 http www xootus net cache shtml 52 content 491 htm
  • 郝斌老师C语言零基础自学专讲180集完整版

    从C语言基础到后面的指针之类的都有 讲得还不错 下载地址 http pan baidu com share link shareid 43714 uk 1711320320
  • 编写一套工具库并上传NPM

    你的 工具箱 开箱即可用的 directive utils 说明 vue3 directive tools 是一个方便在 Vue 3 Ts 项目中快速使用的 directive tool 的 npm 插件 它允许您轻松地在项目中添加多种功能
  • 【网站】浏览器页面文本如何禁止和解除

    2023年 第37周 给自己一个目标 然后坚持总会有收货 不信你试试 有时候 看法的网站 网页文本内容希望不能被复制 那么就需要对浏览器网页进行一些限制 是一种网站开发中的保护措施 有时候 又希望能够复制网页的一些文本 发现被禁止 这就有了
  • 1015-O专题三

    1 题号 1015 O 2 题意 十进制转换二进制 十进制数在0 1000之间 3 解题思路 十进制数1000的二进制数为1111101000 共10位 所以定义数组内存11就可以 除2 取余数分别标记 输出时要将数组从后往前输出 4 感想
  • python对MP4文件的音轨读取和整合

    工作中 使用opencv对视频的人脸做处理 但是发现处理完成后得到的视频文件并没有声音 为此 作者采用以下办法解决 1 安装moviepy库 pip install moviepy 2 导入moviepy库 from moviepy edi
  • 1.3 安卓应用目录结构

    一 安卓应用视图 打开之前我们创建的安卓应用 HelloWorld 1 Project视图 安卓项目默认是Android视图 需要切换到Project视图 2 Package视图 切换到Package视图 3 Android视图 切换到An
  • 如何实现随机生成坐标点,并且使每个坐标点之间的距离大于某个距离?(用于散点图的绘制,进行数据的处理)

    背景 最近需要开发一个新需求 需要绘制一个随机生成数字的散点图 要求点与点的距离要大于某个特定值 解决思路 通过循环获取每个坐标点 每获取一个新的坐标点 都要与之前生成的坐标点进行对比 如果大于指定距离 则符合条件 退出循环 如果小于或等于
  • found input variables with inconsistene numbers of samples:[] 报错处理

    在用train text spilt进行机器学习的训练时候 出现了以下的报错 代码检查发现错误 train x train y test x test y train test split train x train y的行数不一致 应该改
  • 1分钟教你配置好你的python环境

    欢迎来到我们的系列博客 Python360全景 在这个系列中 我们将带领你从Python的基础知识开始 一步步深入到高级话题 帮助你掌握这门强大而灵活的编程语法 无论你是编程新手 还是有一定基础的开发者 这个系列都将提供你需要的知识和技能
  • 详解移植mjpg_streamer到arm板

    介绍 Mjpg streamer是一个开源软件 用于从webcam摄像头采集图像 把它们以流的形式通过基于ip的网络传输到浏览器如Firefox Cambozola VLC播放器 Windows的移动设备或者其他拥有浏览器的移动设备 mjp
  • 从0到1搭建自己的脚手架(java后端)

    一 脚手架是什么 脚手架是一种基础设施工具 用于快速生成项目的框架代码和文件结构 它是一种标准化的开发工具 使开发人员能够在项目的早期阶段快速搭建出一个具备基本功能和结构的系统 二 脚手架的意义 主流的微服务架构体系下很多公司会将原有的单体
  • SPSS 24安装后怎么打开的问题

    本人安装完spss 24之后打开发现还是需要许可证 再次输入完成就会全部关闭 解决方法 安装的步骤基本不会有问题 主要是针对出现安装完成 也填好许可证了的情况 可以通过下图对应的文件位置 双击打开 就可以使用了 安装包和教程可参考 链接 l
  • 多线程2(同步代码块+同步方法+同步锁+死锁)

    一 多线程同步 多线程的并发执行可以提高程序的效率 但是当多个线程去访问同一个资源时 有时也会引发一些安全性问题 例如 统计一个班上的学生人数时 学生有进有出会影响最终学生人数 为了解决这样的问题 需要实现多线程的同步 即限制某个资源在同一
  • 夯实C++基础之刷题:链表——相交链表

    一点点进步计划 首先要坚持刷题 刷题是一个将思路用代码实现的过程 2要自己看知识点 平时也看看面经 这样才与时俱进 先从每天能做一道题开始把 题目 1 相交链表 2 思路 看问题解析都用到了数学的双指针的方法 我是想不明白 但看解题的意思是
  • 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型及原型设计...

    开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中 特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题 业务数据库中的一些数据发生了更改 到底要不要将这些变化也反映到数据仓库中 在数据仓库中 哪些数据应该随之变化
  • STM32 USB HID 自定义设备 bulk 传输

    ST 意法半导体公司 为STM32系列处理器编写了外设USB的库 并提供了很好的参考例程 本文就是参考ST提供的例程 在STM32F4 discovery板子上实现usb bulk传输 Host端是在linux平台上利用libusb库函数写