前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CubeFS - 新一代云原生存储系统

CubeFS - 新一代云原生存储系统

作者头像
我是阳明
发布于 2024-05-07 08:46:47
发布于 2024-05-07 08:46:47
1.3K00
代码可运行
举报
文章被收录于专栏:k8s技术圈k8s技术圈
运行总次数:0
代码可运行

CubeFS 是一种新一代云原生存储系统,支持 S3、HDFS 和 POSIX 等访问协议,支持多副本与纠删码两种存储引擎,为用户提供多租户、 多 AZ 部署以及跨区域复制等多种特性。

CubeFS 作为一个云原生的分布式存储平台,提供了多种访问协议,因此其应用场景也非常广泛,下面简单介绍几种比较典型的应用场景

  • 数据分析:兼容 HDFS 协议,为 Hadoop 生态(如 SparkHive)提供统一存储底座,为计算引擎提供无限的存储空间以及大带宽的数据存储能力。
  • 深度训练/机器学习:作为分布式并行文件系统,支撑 AI 训练、模型存储及分发、IO 加速等需求。
  • 容器共享存储:容器集群可以将容器镜像的配置文件或初始化加载数据存储在 CubeFS 上,在容器批量加载时实时读取。多 Pod 间通过 CubeFS 共享持久化数据,在 Pod 故障时可以进行快速故障切换。
  • 数据库&中间件:为数据库应用如 MySQL、ElasticSearch、ClickHouse 提供高并发、低时延云盘服务,实现彻底的存算分离。
  • 在线服务:为在线业务(如广告、点击流、搜索)或终端用户的图、文、音视频等内容提供高可靠、低成本的对象存储服务。
  • 传统 NAS 上云:替换线下传统本地存储及 NAS,助力 IT 业务上云。

特性

CubeFS 具有众多特性,包括:

多协议

兼容 S3、POSIX、HDFS 等多种访问协议,协议间访问可互通

  • POSIX 兼容:兼容 POSIX 接口,让上层应用的开发变得极其简单,就跟使用本地文件系统一样便捷。此外,CubeFS 在实现时放松了对 POSIX 语义的一致性要求来兼顾文件和元文件操作的性能。
  • 对象存储兼容:兼容 AWS 的 S3 对象存储协议,用户可以使用原生的 Amazon S3 SDK 管理 CubeFS 中的资源。
  • Hadoop 协议兼容:兼容 Hadoop FileSystem 接口协议,用户可以使用 CubeFS 来替换 HDFS,做到上层业务无感。

双引擎

支持多副本及纠删码两种引擎,用户可以根据业务场景灵活选择

  • 多副本存储引擎:副本之间的数据为镜像关系,通过强一致的复制协议来保证副本之间的数据一致性,用户可以根据应用场景灵活的配置不同副本数。
  • 纠删码存储引擎:纠删码引擎具备高可靠、高可用、低成本、支持超大规模(EB)的特性,根据不同 AZ 模型可以灵活选择纠删码模式。

多租户

支持多租户管理,提供细粒度的租户隔离策略

可扩展

可以轻松构建 PB 或者 EB 级规模的分布式存储服务,各模块可水平扩展

高性能

支持多级缓存,针对小文件特定优化,支持多种高性能的复制协议

  • 元数据管理:元数据集群为内存元数据存储,在设计上使用两个 B-Tree(inodeBTree 与 dentryBTree)来管理索引,进而提升元数据访问性能;
  • 强一致副本协议 :CubeFS 根据文件写入方式的不同采用不同的复制协议来保证副本间的数据一致性。(如果文件按照顺序写入,则会使用主备复制协议来优化 IO 吞吐量;如果是随机写入覆盖现有文件内容时,则是采用一种基于 Multi-Raft 的复制协议,来确保数据的强一致性);
  • 多级缓存:纠删码卷支持多级缓存加速能力,针对热点数据,提供更高数据访问性能:
  • 本地缓存:可以在 Client 机器上同机部署 BlockCache 组件,将本地磁盘作为本地缓存. 可以不经过网络直接读取本地 Cache, 但容量受本地磁盘限制;
  • 全局缓存:使用副本组件 DataNode 搭建的分布式全局 Cache, 比如可以通过部署客户端同机房的 SSD 磁盘的 DataNode 作为全局 cache, 相对于本地 cache, 需要经过网络, 但是容量更大, 可动态扩缩容,副本数可调。

云原生

基于 CSI 插件可以快速地在 Kubernetes 上使用 CubeFS。

整体架构

整体上 CubeFS 由元数据子系统(Metadata Subsystem)、数据子系统(Data Subsystem)和资源管理节点(Master)以及对象网关(Object Subsystem)组成,可以通过 POSIX/HDFS/S3 接口访问存储数据。

资源管理节点

由多个 Master 节点组成,负责异步处理不同类型的任务,如管理数据分片与元数据分片(包括创建、删除、更新以及一致性检查等),检查数据节点或者元数据节点的健康状态,维护管理卷信息等

Master 节点可以有多个,节点之间通过 Raft 算法保证元数据的一致性,并且持久化到 RocksDB 中。

元数据子系统

由多个 Meta Node 节点组成,多个元数据分片(Meta Partition)和 Raft 实例(基于 Multi-Raft 复制协议)组成,每个元数据分片表示一个 Inode 范围元数据,其中包含两棵内存 B-Tree 树:inode BTree 与 dentry BTree。

元数据实例最少需要 3 个,支持水平扩容。

数据子系统

分为副本子系统和纠删码子系统,两种子系统可同时存在,也都可单独存在:

  • 副本子系统由 DataNode 组成,每个节点管理一组数据分片,多个节点的数据分片构成一个副本组;
  • 纠删码子系统(Blobstore)主要由 BlobNode 模块组成,每个节点管理一组数据块,多个节点的数据块构成一个纠删码条带。

数据节点支持水平扩容。

对象子系统

由对象节点(ObjectNode)组成,提供了兼容标准 S3 语义的访问协议,可以通过 Amazon S3 SDK 或者是 s3cmd 等工具访问存储资源。

逻辑上的概念,由多个元数据和数据分片组成,从客户端的角度看,卷可以被看作是可被容器访问的文件系统实例。从对象存储的角度来看,一个卷对应着一个 bucket。一个卷可以在多个容器中挂载,使得文件可以被不同客户端同时访问。

安装

CubeFS 的安装方式有很多,包括 Docker、YUM 等等,由于我们这里直接直接在 Kubernetes 上使用,因此我们可以通过 Helm 来安装 CubeFS,各组件会直接使用宿主机网络,使用 hostPath 将磁盘映射到容器中。

在 Kubernetes 集群中部署 CubeFS 可以按照下图所示的架构进行部署:

CubeFS 目前由这四部分组成:

  • Master:资源管理节点,负责维护整个集群的元信息,部署为 StatefulSet 资源。
  • DataNode:数据存储节点,需要挂载大量磁盘负责文件数据的实际存储,部署为 DaemonSet 资源。
  • MetaNode:元数据节点,负责存储所有的文件元信息,部署为 DaemonSet 资源。
  • ObjectNode:负责提供转换 S3 协议提供对象存储的能力,无状态服务,部署为 Deployment 资源。

在部署之前,我们需要拥有一个至少有 3 个节点(最好 4 个以上,可以容灾)的 Kubernetes 集群,且集群版本需要大于等于 1.15。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get nodes
NAME     STATUS   ROLES           AGE   VERSION
master   Ready    control-plane   46d   v1.28.7
node1    Ready    <none>          46d   v1.28.7
node2    Ready    <none>          46d   v1.28.7

首先我们需要给节点打上各自的标签,标明这台机器要在 CubeFS 集群中承担的角色:

由于我们这里只有 3 个节点,所以需要这些节点承担一些共同的角色。

  • Master 节点,至少三个,建议为奇数个:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl label node master component.cubefs.io/master=enabled
kubectl label node node1 component.cubefs.io/master=enabled
kubectl label node node2 component.cubefs.io/master=enabled
  • MetaNode 元数据节点,至少 3 个,奇偶无所谓:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl label node master component.cubefs.io/metanode=enabled
kubectl label node node1 component.cubefs.io/metanode=enabled
kubectl label node node2 component.cubefs.io/metanode=enabled
  • Datanode 数据节点,至少 3 个,奇偶无所谓:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl label node master component.cubefs.io/datanode=enabled
kubectl label node node1 component.cubefs.io/datanode=enabled
kubectl label node node2 component.cubefs.io/datanode=enabled
  • ObjectNode 对象存储节点,可以按需进行标记,不需要对象存储功能的话也可以不部署这个组件:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl label node node1 component.cubefs.io/objectnode=enabled
kubectl label node node2 component.cubefs.io/objectnode=enabled
  • CSI 组件,用于在 Kubernetes 中使用 CubeFS,需要在所有节点上部署:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl label node node1 component.cubefs.io/csi=enabled
kubectl label node node2 component.cubefs.io/csi=enabled

CubeFS 安装时会根据这些标签通过 nodeSelector 进行匹配,然后在机器创建起对应的 Pod。

接下来我们就可以通过 Helm 来安装 CubeFS 了,首先我们需要将 CubeFS 的 Helm Chart 下载到本地:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/cubefs/cubefs-helm
cd cubefs-helm

然后根据自身环境定制 values 文件,比如下面是一个简单的 values 文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cubefs-values.yaml
component:
  master: true
  datanode: true
  metanode: true
  objectnode: false
  client: false
  csi: true
  monitor: false
  ingress: true

image:
  # 3.3.0 版本之前会出现 /lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found 错误
  server: cubefs/cfs-server:v3.3.0
  client: cubefs/cfs-client:v3.3.0
  csi_driver: cnych/cubefs-cfs-csi-driver:3.2.0.150.0
  csi_provisioner: cnych/csi-provisioner:v2.2.2
  csi_attacher: cnych/csi-attacher:v3.4.0
  csi_resizer: cnych/csi-resizer:v1.3.0
  driver_registrar: cnych/csi-node-driver-registrar:v2.5.0

master:
  # The replicas of master component, at least 3, recommend to be an odd number
  replicas: 3
  tolerations:
    - key: "node-role.kubernetes.io/control-plane"
      operator: "Exists"
      effect: "NoSchedule"
  resources:
    enabled: true
    requests:
      memory: "512Mi"
      cpu: "500m"
    limits:
      memory: "512Mi"
      cpu: "500m"

metanode:
  total_mem: "4000000000"
  tolerations:
    - key: "node-role.kubernetes.io/control-plane"
      operator: "Exists"
      effect: "NoSchedule"
  resources:
    enabled: true
    requests:
      memory: "512Mi"
      cpu: "500m"
    limits:
      memory: "512Mi"
      cpu: "500m"

datanode:
  # DataNode 要使用的磁盘,可以挂载多块
  # 格式: 挂载点:保留的空间
  # 保留的空间: 单位字节,当磁盘剩余空间小于该值时将不会再在该磁盘上写入数据
  disks:
    - /data0:10000000000
  tolerations:
    - key: "node-role.kubernetes.io/control-plane"
      operator: "Exists"
      effect: "NoSchedule"
  resources:
    enabled: true
    requests:
      memory: "512Mi"
      cpu: "500m"
    limits:
      memory: "512Mi"
      cpu: "500m"

csi:
  driverName: csi.cubefs.com
  logLevel: error
  kubeletPath: /var/lib/kubelet
  controller:
    tolerations: []
    nodeSelector:
      component.cubefs.io/csi: "enabled"
  node:
    tolerations: []
    nodeSelector:
      component.cubefs.io/csi: "enabled"
    resources:
      enabled: true
      requests:
        memory: "512Mi"
        cpu: "500m"
      limits:
        memory: "512Mi"
        cpu: "500m"

  storageClass:
    setToDefault: false
    reclaimPolicy: "Delete"

# CSI 客户端配置
provisioner:
  # Kubelet 的主目录
  kubelet_path: /var/lib/kubelet

然后使用如下命令进行 CubeFS 部署:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
helm upgrade --install cubefs -n cubefs-system ./cubefs-helm/cubefs -f cubefs-values.yaml --create-namespace

部署完成后可以使用命令 kubectl get pods -n cubefs-system 等待所有组件状态变为 Running 即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pods -n cubefs-system
NAME                                  READY   STATUS     RESTARTS   AGE
cfs-csi-controller-66cdbb664f-pqkp6   4/4     Running    0          28m
cfs-csi-node-966t9                    2/2     Running    0          25m
cfs-csi-node-9f4ts                    2/2     Running    0          25m
datanode-4zfhc                        1/1     Running    0          28m
datanode-blc8w                        1/1     Running    0          28m
datanode-ldj72                        1/1     Running    0          28m
master-0                              1/1     Running    0          28m
master-1                              1/1     Running    0          23m
master-2                              1/1     Running    0          23m
metanode-5csgt                        1/1     Running    0          7m31s
metanode-jvqnl                        1/1     Running    0          7m31s
metanode-vpjtj                        1/1     Running    0          7m31s

各个组件的关键日志会在容器标准输出中输出。

此外还会自动创建一个 StorageClass 对象,可以通过 kubectl get sc 查看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get sc
NAME         PROVISIONER                                   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
cfs-sc       csi.cubefs.com                                Delete          Immediate           true                   29m

测试

现在我们有了一个可用的 StorageClass 对象了,接下来可以创建一个 PVC 对象来测试 CubeFS 的存储功能。如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cubefs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: cubefs-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: cfs-sc

上面的 PVC 对象中我们通过 storageClassName 指定了使用的 StorageClass 名称,这里是 cfs-sc,这个名称需要和我们之前创建的 StorageClass 名称一致,这样就会根据 cubefs-sc 中定义的参数来创建存储卷。当我们在编写 pvc yaml 主要注意一下参数:

  • metadata.name:pvc 的名称,可以按需修改,同一个 namespace 下 pvc 名称是唯一的,不允许有两个相同的名称。
  • metadata.namespace:pvc 所在的命名空间,按需修改
  • spec.resources.request.storage:pvc 容量大小。
  • storageClassName:这是 storage class 的名称。如果想知道当前集群有哪些 storageclass,可以通过命令 kubectl get sc 来查看。

这里直接应用这个 yaml 文件即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f cubefs-pvc.yaml

执行命令完成后,可以通过命令 kubectl get pvc -n 命名空间 来查看对应 pvc 的状态,Pending 代表正在等待,Bound 代表创建成功。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
cubefs-pvc   Bound    pvc-53cc95b7-8a05-43f8-8903-f1c6f7b11c05   5Gi        RWO            cfs-sc         3s

如果 PVC 的状态一直处于 Pending,可以通过命令查看原因:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl describe pvc -n 命名空间 PVC 名称

如果报错消息不明显或者看不出错误,则可以使用 kubectl logs 相关命令先查看 csi controller pod 里面的 csi-provisioner 容器的报错信息,csi-provisioner 是 k8s 与 csi driver 的中间桥梁,很多信息都可以在这里的日志查看。

如果 csi-provisioner 的日志还看不出具体问题,则使用 kubectl exec 相关命令查看 csi controller pod 里面的 cfs-driver 容器的日志,它的日志放在容器里面的 /cfs/logs 下。

这里不能使用 Kubectl logs 相关命令是因为 cfs-driver 的日志并不是打印到标准输出,而其它几个类似 csi-provisioner 的 sidecar 容器的日志是打印到标准输出的,所以可以使用 kubectl logs 相关命令查看。

有了 PVC 则接下来就可以在应用中挂载到指定目录了,比如我们这里有一个如下所示的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# cfs-csi-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cfs-csi-demo
  namespace: default
spec:
  selector:
    matchLabels:
      app: cfs-csi-demo-pod
  template:
    metadata:
      labels:
        app: cfs-csi-demo-pod
    spec:
      nodeSelector:
        component.cubefs.io/csi: enabled
      containers:
        - name: cfs-csi-demo
          image: nginx:1.17.9
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 80
              name: "http-server"
          volumeMounts:
            - mountPath: "/usr/share/nginx/html"
              mountPropagation: HostToContainer
              name: mypvc
      volumes:
        - name: mypvc
          persistentVolumeClaim:
            claimName: cubefs-pvc

上面的资源清单中我们将一个名称为 cubefs-pvc 的 PVC 挂载到 cfs-csi-demo 容器里面的 /usr/share/nginx/html 下。

同样直接创建这个资源清单即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f cfs-csi-demo.yaml

创建完成后可以通过 kubectl get pods 查看 Pod 的状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pods -owide
NAME                                      READY   STATUS    RESTARTS       AGE   IP           NODE    NOMINATED NODE   READINESS GATES
cfs-csi-demo-5d456c8d97-sjsvw             1/1     Running   0              78s   10.0.1.85    node1   <none>           <none>

我们可以直接通过往 /usr/share/nginx/html 目录写入文件来测试 CubeFS 的存储功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl exec -it cfs-csi-demo-5d456c8d97-sjsvw -- /bin/bash
root@cfs-csi-demo-5d456c8d97-sjsvw:/# echo "Hello, CubeFS" > /usr/share/nginx/html/index.html
root@cfs-csi-demo-5d456c8d97-sjsvw:/#

然后我们可以将这个 Pod 删除重建,然后查看是否还有这个文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl delete pod cfs-csi-demo-5d456c8d97-sjsvw
$ kubectl get pods
NAME                                      READY   STATUS    RESTARTS       AGE
cfs-csi-demo-5d456c8d97-c245z             1/1     Running   0              3m22s
$ kubectl exec -it cfs-csi-demo-5d456c8d97-c245z -- ls /usr/share/nginx/html
index.html
$ kubectl exec -it cfs-csi-demo-5d456c8d97-c245z -- cat /usr/share/nginx/html/index.html
Hello, CubeFS

如果能够看到 Hello, CubeFS 则说明 CubeFS 的存储功能正常。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 k8s技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【STM32F407开发板用户手册】第1章 初学STM32F407的准备工作
最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第1章   初学STM32F407的准备工作 俗话说万事开头难,学习一门新
Simon223
2020/06/03
6.1K0
【安富莱STM32H7教程】第1章 初学STM32H7的准备工作
俗话说万事开头难,学习一门新的知识,难的往往不是知识本身,而是如何快速上手,需要什么资料和开发环境。一旦上手后,深入的学习就相对容易些了。
Simon223
2019/04/17
2K0
【安富莱STM32H7教程】第1章   初学STM32H7的准备工作
STM32F103C8T6单片机简介「建议收藏」
STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。除了被我们熟知的STM32,ST公司还有SPC5X系列、STM8系列等,具体参数如下:
全栈程序员站长
2022/08/10
12.1K0
STM32F103C8T6单片机简介「建议收藏」
STM32MP157D-DK1 STM32CubeID使用与M核开发
STM32MP157具有A7内核核M4内核,前面介绍的一些文章,都是在A7内核上进行的,本篇来介绍M4内核的开发,以及开发时要用到的STM32 CubeIDE软件的使用。
xxpcb
2024/01/10
3090
STM32MP157D-DK1 STM32CubeID使用与M核开发
【STM32】硬件资源及芯片介绍
以精英板STM32F103为例。STM32是Cortex M3架构,拥有更强劲的性能、更高的代码密度、位带操作、可嵌套中断、低成 本、低功耗等众多优势。
DevFrank
2024/07/24
2380
STM32介绍
什么是 STM32 STM32,从字面上来理解,ST 是意法半导体,M 是Microelectronics 的缩写,32 表示32 位,合起来理解,STM32 就是指 ST 公司开发的 32 位微控制器。STM32 是以32位为一个单位,同时能处理32位。比如51单片机就是一个同时处理8位的单片机。STM32中外设以4个位确定一个引脚功能。在如今的 32 位控制器当中,STM32 可以说是最璀璨的新星,大受工程师和市场的青睐,无芯能出其右。 CMSIS构架
跋扈洋
2021/01/29
2.5K1
STM32MP157开发环境搭建(A7核、M4核)
STM32MP157 微处理器基于灵活的双 Arm® Cortex®-A7 内核(工作频率 800 MHz)和 Cortex®-M4 内核(工作频率 209 MHz)架构,并配一个专用的 3D 图形处理单元(GPU)、MIPI-DSI 显示接口、以及一个 CAN FD 接口。
Mculover666
2021/12/20
4K0
STM32MP157开发环境搭建(A7核、M4核)
[评测]灵动半导体MM32W3蓝牙开发板开箱报告
前几天在面包板社区申请了一块灵动微电子的开发板——eMiniBoard-MB021,感谢面包板社区和灵动微电子的支持!在此之前,我只听过灵动微电子的大名,没有使用过灵动的MCU产品,这次收到的是基于MM32W373蓝牙MCU的开发板,今天先来个开箱报告!
单片机点灯小能手
2020/07/17
6610
[评测]灵动半导体MM32W3蓝牙开发板开箱报告
STM32F103开发环境的搭建
嵌入式系统开发不同于通用PC系统的开发。通用PC系统拥有强劲的处理器、充裕的内存和硬盘,且有鼠标键盘输入,显示屏查看,是理想的开发载体,因此PC程序也就直接在PC上开发。而嵌入式系统往往资源有限,输入显示也受限,不适合作为开发载体,因此嵌入式程序通常不在嵌入式系统中开发。而是将嵌入式程序放在PC上开发,然后将生成的可执行文件放在嵌入式系统运行,这种方式就叫交叉开发。
韦东山
2022/05/05
1.1K0
STM32F103开发环境的搭建
STM32F103系列开发_点亮LED灯
STM32目前市面上使用比较广泛,资料多,接下来就介绍如何快速入门STM32,进行基础开发。
DS小龙哥
2024/05/24
2750
STM32F103系列开发_点亮LED灯
STM32F103笔记(一)[通俗易懂]
stm32F1系列是来自ARM公司具有突破性的以ARM Cortex-M3为内核的32为微处理器,内核为ARM公司为要求高性能,低功耗,低成本,性价比高的嵌入式应用专门设计的Cortex-M内核。
全栈程序员站长
2022/11/07
2.9K0
STM32F103笔记(一)[通俗易懂]
TencentOS tiny 移植到STM32F103全教程(基于标准库)
STM32的裸机工程模板直接使用野火STM32开发板配套的固件库例程即可。可以从我github上获取https://github.com/jiejieTop/TencentOS-Demo
杰杰
2019/09/20
3K2
TencentOS tiny 移植到STM32F103全教程(基于标准库)
STM32入门培训
比如智能家居、智慧农业、工厂自动化这些,都可以使用STM32作为主控制器或者辅助控制器。
小锋学长生活大爆炸
2021/04/30
4K0
沁恒RISC-V开发板CH32V103-EVT评测
从2014年起,中国的互联网圈把10月24日定为程序员节,到今年2021年已经是第1000个程序员节了。祝各位开发者节日快乐!
单片机点灯小能手
2021/10/26
2.6K0
沁恒RISC-V开发板CH32V103-EVT评测
stm32编程入门书籍_STM32开发板
STM32系列专为要求高性能、低成本、低功耗的嵌入式应用设计的ARM Cortex®-M0,M0+,M3, M4和M7内核,按内核架构分为不同产品:主流产品(STM32F0、STM32F1、STM32F3)、超低功耗产品(STM32L0、STM32L1、STM32L4、STM32L4+)、高性能产品(STM32F2、STM32F4、STM32F7、STM32H7)。
全栈程序员站长
2022/10/04
1.5K0
stm32编程入门书籍_STM32开发板
ESP32与STM32哪种更适合初学者?
无论是刚入坑的小白,还是想扩展技术栈的老鸟,在选择主力 MCU 时,学习曲线绝对是重要的考量因素。
不脱发的程序猿
2025/04/13
2930
ESP32与STM32哪种更适合初学者?
说好的读源码变成了学习教程(无刷银剑固件)
本来是想写个源码分析的,结果分析了半道发现和我想的不一样,就当一个STM32的学习指南了。
云深无际
2021/12/20
5730
说好的读源码变成了学习教程(无刷银剑固件)
STM32中断系统
正常情况下,微处理器根据代码内容,按顺序执行指令。执行过程中,如果遇到其它紧急的事件需要处理,则先暂停当前任务,执行紧急事件,待紧急事件处理完后,再恢复到刚才暂停的地方继续执行。这个产生的紧急事件就叫做中断或异常,如图 10.1.1 所示。
韦东山
2022/05/05
7130
STM32中断系统
高手入门STM32总结+学习步骤
每当我们在入门之前(ARM是这样,DSP也一样),总会有很多疑问,会有很多顾虑。我们渴望知道学习STM32前景如何?需要啥基础?难不难?适不适合我?但是什么时候能心潮澎湃地、相当着急地开始学STM32?日子在一天一天过去!你开始行动了吗?没有行动的思索,永远都不可能入门!把这些时间用来看书吧,效果能好一万倍。
用户8811670
2021/07/07
1.9K0
STM32库开发实战指南 PDF+源码
还是哪个永恒的话题的,学习!(今天回家已经很晚了,本来不打算写东西的,不过一直读野火的书,赶紧很好,这里就分享一下)
云深无际
2022/02/09
3.1K0
STM32库开发实战指南 PDF+源码
相关推荐
【STM32F407开发板用户手册】第1章 初学STM32F407的准备工作
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档