diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/main.c" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/main.c" new file mode 100644 index 0000000000000000000000000000000000000000..0ce0f07b5a14ba437b6345c5b6af20128278a092 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/main.c" @@ -0,0 +1,26 @@ +#include +#include +#include +#ifndef RT_USING_NANO +#include + +int main(void) +{ + rt_device_t vir = rt_device_find("vir"); + if (vir == RT_NULL) + { + rt_kprintf("find vir dev err\n"); + return -RT_ERROR; + } + rt_uint32_t val = 1000; + rt_uint32_t ret = 0; + rt_device_open(vir, RT_DEVICE_FLAG_RDWR); + rt_device_write(vir, 0, &val, 4); + rt_device_read(vir, 0, &ret, 4); + rt_kprintf("ret :%d\n", ret); + rt_device_close(vir); + val = 333; + rt_vir_wirte((rt_vir_device_t)vir, val); + rt_vir_read((rt_vir_device_t)vir, &ret); + rt_kprintf("ret :%d\n", ret); +} diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/vir.h" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/vir.h" new file mode 100644 index 0000000000000000000000000000000000000000..2963b5505e2ebbebf2ac4c30648c49d4a9daa7a9 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/vir.h" @@ -0,0 +1,14 @@ +#ifndef __DRV_VIR_H__ +#define __DRV_VIR_H__ +#include +#include + +struct vir_test +{ + + struct rt_vir_device parent; + rt_uint32_t val; + char *info; +}; + +#endif diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/\346\241\206\346\236\266\345\261\202.c" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/\346\241\206\346\236\266\345\261\202.c" new file mode 100644 index 0000000000000000000000000000000000000000..213be094b2cbeb76a7d007e5ef69a9d54ca68d77 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/\346\241\206\346\236\266\345\261\202.c" @@ -0,0 +1,88 @@ +#include +#include + +#if defined(RT_USING_VIR) + +rt_err_t _vir_init(rt_device_t dev) +{ + rt_kprintf("vir init \n"); + return RT_EOK; +} +rt_err_t _vir_open(rt_device_t dev, rt_uint16_t oflag) +{ + rt_kprintf("vir open\n"); + return RT_EOK; +} +rt_err_t _vir_close(rt_device_t dev) +{ + rt_kprintf("vir close\n"); + return RT_EOK; +} +rt_ssize_t _vir_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + rt_vir_device_t device = (rt_vir_device_t)dev; + if (device->ops->vir_get_val) + { + device->ops->vir_get_val(dev, (rt_uint32_t *)buffer); + return RT_EOK; + } + return -RT_ERROR; +} + +rt_ssize_t _vir_wirte(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + rt_vir_device_t device = (rt_vir_device_t)dev; + if (device->ops->vir_set_val) + { + device->ops->vir_set_val(dev, *(rt_uint32_t *)buffer); + return RT_EOK; + } + return -RT_ERROR; +} +rt_err_t _vir_control(rt_device_t dev, int cmd, void *args) +{ + rt_kprintf("vir control %d\n", cmd); + return RT_EOK; +} + +rt_err_t rt_hw_vir_register(rt_vir_device_t device, const char *name, const struct rt_vir_ops *ops, const void *user_data) +{ + RT_ASSERT(ops != RT_NULL); + rt_err_t result; + device->ops = ops; + device->parent.init = _vir_init; + device->parent.open = _vir_open; + device->parent.close = _vir_close; + device->parent.read = _vir_read; + device->parent.write = _vir_wirte; + device->parent.control = _vir_control; + result = rt_device_register(&device->parent, name, RT_DEVICE_FLAG_RDWR); + return result; +} + +rt_err_t rt_vir_read(rt_vir_device_t device, rt_uint32_t *val) +{ + RT_ASSERT(device != RT_NULL && device->ops != RT_NULL); + rt_device_t dev = (rt_device_t)device; + + if (device->ops->vir_get_val) + { + device->ops->vir_get_val(dev, val); + return RT_EOK; + } + return -RT_ERROR; +} + +rt_err_t rt_vir_wirte(rt_vir_device_t device, rt_uint32_t val) +{ + RT_ASSERT(device != RT_NULL && device->ops != RT_NULL); + rt_device_t dev = (rt_device_t)device; + if (device->ops->vir_set_val) + { + device->ops->vir_set_val(dev, val); + return RT_EOK; + } + return -RT_ERROR; +} + +#endif \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/\346\241\206\346\236\266\345\261\202.h" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/\346\241\206\346\236\266\345\261\202.h" new file mode 100644 index 0000000000000000000000000000000000000000..fd4a8e06aef46c3b10a5b3613c81097ebfe96247 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/\346\241\206\346\236\266\345\261\202.h" @@ -0,0 +1,26 @@ +#ifndef __VIR_H__ +#define __VIR_H__ + +#include +#include +struct rt_vir_ops +{ + void (*printfinfo)(struct rt_device *device, rt_uint8_t *str); + void (*vir_set_val)(struct rt_device *device, rt_uint32_t val); + void (*vir_get_val)(struct rt_device *device, rt_uint32_t *val); +}; +/** + * @brief adc device + */ +struct rt_vir_device +{ + struct rt_device parent; + const struct rt_vir_ops *ops; +}; +typedef struct rt_vir_device *rt_vir_device_t; + +rt_err_t rt_hw_vir_register(rt_vir_device_t device, const char *name, const struct rt_vir_ops *ops, const void *user_data); +rt_err_t rt_vir_read(rt_vir_device_t device, rt_uint32_t *val); +rt_err_t rt_vir_wirte(rt_vir_device_t device, rt_uint32_t val); + +#endif \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/\351\251\261\345\212\250\345\261\202.h" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/\351\251\261\345\212\250\345\261\202.h" new file mode 100644 index 0000000000000000000000000000000000000000..1408267f3c8540da1e13f758b7b6f775cbb77882 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0724/\351\251\261\345\212\250\345\261\202.h" @@ -0,0 +1,14 @@ +#ifndef __DRV_VIR_H__ +#define __DRV_VIR_H__ +#include +#include + +struct vir_test +{ + + struct rt_vir_device parent; + rt_uint32_t val; + char *info; +}; + +#endif \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0725/Snipaste_2025-07-29_12-30-41.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0725/Snipaste_2025-07-29_12-30-41.png" new file mode 100644 index 0000000000000000000000000000000000000000..98ac355cb2f2541c191da1a6fd4c766a722ebd50 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\344\275\234\344\270\232/0725/Snipaste_2025-07-29_12-30-41.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724202453284.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724202453284.png" new file mode 100644 index 0000000000000000000000000000000000000000..81fc9ca57e50c067a59ceb0368b6c396db18135f Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724202453284.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231023343.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231023343.png" new file mode 100644 index 0000000000000000000000000000000000000000..2a3eb571a60eaa998ff9f4b998550ec498c0fbd6 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231023343.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231358565.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231358565.png" new file mode 100644 index 0000000000000000000000000000000000000000..7d1775e1b42b3f20db34469187a6f2e51e98c5bf Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231358565.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231800046.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231800046.png" new file mode 100644 index 0000000000000000000000000000000000000000..82de348dbebb2f0fba2b9c8b68ba5280eec04696 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231800046.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231812252.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231812252.png" new file mode 100644 index 0000000000000000000000000000000000000000..bab9dbab8536053015c9a927a78c34627a94822a Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231812252.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231955043.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231955043.png" new file mode 100644 index 0000000000000000000000000000000000000000..9160d1d31ac8f9267cc27b6f39f81d9bd3bc0a8a Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724231955043.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724235819190.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724235819190.png" new file mode 100644 index 0000000000000000000000000000000000000000..89d9ab66d3815f0e9a3f50025fd73a1ec6d922a1 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250724235819190.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729173458238.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729173458238.png" new file mode 100644 index 0000000000000000000000000000000000000000..ad5319920ac273a11785000e89783f0f6d676e32 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729173458238.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729173514117.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729173514117.png" new file mode 100644 index 0000000000000000000000000000000000000000..516e4eefa77263535e7b6d8c13623f5767d2f77b Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729173514117.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729173534760.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729173534760.png" new file mode 100644 index 0000000000000000000000000000000000000000..09a606bb75835c19d9eefa21c904eae9680d53ae Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729173534760.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729215654163.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729215654163.png" new file mode 100644 index 0000000000000000000000000000000000000000..81fc9ca57e50c067a59ceb0368b6c396db18135f Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729215654163.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729215711601.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729215711601.png" new file mode 100644 index 0000000000000000000000000000000000000000..7d1775e1b42b3f20db34469187a6f2e51e98c5bf Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729215711601.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729215731005.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729215731005.png" new file mode 100644 index 0000000000000000000000000000000000000000..2a3eb571a60eaa998ff9f4b998550ec498c0fbd6 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250729215731005.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730105627793.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730105627793.png" new file mode 100644 index 0000000000000000000000000000000000000000..560ddc849e69975f57528cca0ba464633645f479 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730105627793.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114213493.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114213493.png" new file mode 100644 index 0000000000000000000000000000000000000000..5105561a916f7374ef2bdf1a7682841010edc658 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114213493.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114224501.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114224501.png" new file mode 100644 index 0000000000000000000000000000000000000000..efbd3b77476bc3d90256aa93ad3482c202516af4 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114224501.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114233185.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114233185.png" new file mode 100644 index 0000000000000000000000000000000000000000..654d9ab3eaca5a29166bc70daa43fe6306d614e2 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114233185.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114240172.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114240172.png" new file mode 100644 index 0000000000000000000000000000000000000000..654d9ab3eaca5a29166bc70daa43fe6306d614e2 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114240172.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114244107.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114244107.png" new file mode 100644 index 0000000000000000000000000000000000000000..afee0750e3b05c44031795ed34a7f825a180c5b5 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114244107.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114252728.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114252728.png" new file mode 100644 index 0000000000000000000000000000000000000000..7c5e376746e67f0c0802000401ce73c1436457c5 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114252728.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114259644.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114259644.png" new file mode 100644 index 0000000000000000000000000000000000000000..560ddc849e69975f57528cca0ba464633645f479 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114259644.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114319560.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114319560.png" new file mode 100644 index 0000000000000000000000000000000000000000..5f1c34a462ebcf44332e86b56941fc6b1af9c8e5 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250730114319560.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731112656842.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731112656842.png" new file mode 100644 index 0000000000000000000000000000000000000000..3cb54af2f8245816680571284facfc4827dc2ab9 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731112656842.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731195958377.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731195958377.png" new file mode 100644 index 0000000000000000000000000000000000000000..7c492bca50362cb5d64b440d9eb83b7487977d64 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731195958377.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731200010035.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731200010035.png" new file mode 100644 index 0000000000000000000000000000000000000000..b78903f8b3cdb76a0f6d1b3514fc1c0f72f4ab38 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731200010035.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731225957331.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731225957331.png" new file mode 100644 index 0000000000000000000000000000000000000000..b9d88124caafdddb554a757d3b76a77ebb1bcf5f Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731225957331.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731231221745.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731231221745.png" new file mode 100644 index 0000000000000000000000000000000000000000..2750787362d72f64f753a927854066962ed5a93c Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250731231221745.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801000515707.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801000515707.png" new file mode 100644 index 0000000000000000000000000000000000000000..0b5d0780d1f7b4860f0207bc1d7ffb1ceaa218b4 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801000515707.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801000537942.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801000537942.png" new file mode 100644 index 0000000000000000000000000000000000000000..2e01c6e0c42a91d5b8d55f47d665cdcb355dd4bb Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801000537942.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801002024779.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801002024779.png" new file mode 100644 index 0000000000000000000000000000000000000000..8f13922119f8492779b6d3bc00db1aca8e7199c6 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801002024779.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801002044089.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801002044089.png" new file mode 100644 index 0000000000000000000000000000000000000000..b78903f8b3cdb76a0f6d1b3514fc1c0f72f4ab38 Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/image-20250801002044089.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-01 000711.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-01 000711.png" new file mode 100644 index 0000000000000000000000000000000000000000..5e57cc98c4ca56780daf1b2984dc934dbb8f59ac Binary files /dev/null and "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/figures/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-01 000711.png" differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day4 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\256\276\345\244\207\345\222\214\351\251\261\345\212\250.md" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day4 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\256\276\345\244\207\345\222\214\351\251\261\345\212\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..c4ffafa19f70fecce97c986cd95ed356a6377180 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day4 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\256\276\345\244\207\345\222\214\351\251\261\345\212\250.md" @@ -0,0 +1,491 @@ +# 【RSOC25】Day4 课程笔记:设备和驱动 + +## 1. I/O设备 + +### 1.1 I/O介绍 + +大部分嵌入式系统都包括一些 I/O(Input/Output,输入/输出)设备,例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上用于保存数据的 Flash 或 SD卡,以及网络设备的以太网接口等。 + +#### 1.1.1 框架 + +![image-20250729215654163](figures/image-20250729215654163.png) + +应用程序通过图中的"I/O设备管理层"提供的标准接口访问底层设备,设备驱动程序的升级、更替不会对上层应用产生影响。这种方式使得设备的硬件操作相关的代码能够独立于应用程序而存在,双方只需关注各自的功能实现,从而降低了代码的耦合性、复杂性,提高了系统的可靠性。 + +设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。 + +![image-20250729215711601](figures/image-20250729215711601.png) + +图中各类里的c文件是各类对应的管理接口所在,比如设备基类rt_device的管理接口在device.c中。 + +图中设备驱动框架层有很多 RT-Thread 写好的类,图中只列出2类,其他类用 “xxx” 来表示,这些省略的类及其管理接口可以在 RT-Thread 源码 components/drivers 目录下找寻,比如该目录下可以找到serial/i2c/spi/sensor/can 等等相关目录。 + +图中设备驱动层的 “xxx” ,是 RT-Thread 支持的各 BSP 平台,在源码的 src/bsp 目录下找寻,比如stm32/gd32/at32/avr32/k210 等等。各个平台各自实现各个设备类型的硬件驱动能力,比如 STM32分别实现了 stm32_uart 类/stm32_adc 类等及其对应的管理接口;同样的,其他平台也分别各自实现了诸多对应类别及管理接口。 + +#### 1.1.2 类型 + +RT-Thread 支持多种 I/O 设备类型,主要设备类型如下所示: + +```c +RT_Device_Class_Char /* 字符设备 */ +RT_Device_Class_Block /* 块设备 */ +RT_Device_Class_NetIf /* 网络接口设备 */ +RT_Device_Class_MTD /* 内存设备 */ +RT_Device_Class_RTC /* RTC 设备 */ +RT_Device_Class_Sound /* 声音设备 */ +RT_Device_Class_Graphic /* 图形设备 */ +RT_Device_Class_I2CBUS /* I2C 总线设备 */ +RT_Device_Class_USBDevice /* USB device 设备 */ +RT_Device_Class_USBHost /* USB host 设备 */ +RT_Device_Class_SPIBUS /* SPI 总线设备 */ +RT_Device_Class_SPIDevice /* SPI 设备 */ +RT_Device_Class_SDIO /* SDIO 设备 */ +RT_Device_Class_Miscellaneous /* 杂类设备 */ +``` + +### 1.2 创建和注册 I/O 设备 + +驱动层负责创建设备实例,并注册到 I/O 设备管理器中,可以通过静态申明的方式创建设备实例,也可以用下面的接口进行动态创建: + +```c +rt_device_t rt_device_create(int type, int attach_size); +``` + +当一个动态创建的设备不再需要使用时可以通过如下函数来销毁: + +```c +void rt_device_destroy(rt_device_t device); +``` + +设备被创建后,需要注册到 I/O 设备管理器中,应用程序才能够访问,注册设备的函数如下所示: + +```c +rt_err_t rt_device_register(rt_device_t dev, const char* name, rt_uint8_t flags); +``` + +### 1.3 访问 I/O 设备 + +应用程序通过 I/O 设备管理接口来访问硬件设备,当设备驱动实现后,应用程序就可以访问该硬件。I/O 设备管理接口与 I/O 设备的操作方法的映射关系下图所示: + +![image-20250729215731005](figures/image-20250729215731005.png) + +#### 1.3.1 查找设备 + +应用程序根据设备名称获取设备句柄,进而可以操作设备。查找设备函数如下所示: + +```c +rt_device_t rt_device_find(const char* name); +``` + +#### 1.3.2 初始化设备 + +获得设备句柄后,应用程序可使用如下函数对设备进行初始化操作: + +```c +rt_err_t rt_device_init(rt_device_t dev); +``` + +#### 1.3.3 打开和关闭设备 + +通过设备句柄,应用程序可以打开和关闭设备,打开设备时,会检测设备是否已经初始化,没有初始化则会默认调用初始化接口初始化设备。通过如下函数打开设备: + +```c +rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags); +``` + +应用程序打开设备完成读写等操作后,如果不需要再对设备进行操作则可以关闭设备,通过如下函数完成: + +```c +rt_err_t rt_device_close(rt_device_t dev); +``` + +#### 1.3.4 控制设备 + +通过命令控制字,应用程序也可以对设备进行控制,通过如下函数完成: + +```c +rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void* arg); +``` + +#### 1.3.5 读写设备 + +应用程序从设备中读取数据可以通过如下函数完成: + +```c +rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos,void* buffer, rt_size_t size); +``` + +向设备中写入数据,可以通过如下函数完成: + +```c +rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos,const void* buffer, rt_size_t size); +``` + +## 2. SPI设备 + +### 2.1 SPI 简介 + +SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步通信总线,常用于短距离通讯,主要应用于 EEPROM、FLASH、实时时钟、AD 转换器、还有数字信号处理器和数字信号解码器之间。SPI 一般使用 4 根线通信,如下图所示: + +![image-20250724231800046](figures/image-20250724231800046.png) + +- MOSI –主机输出 / 从机输入数据线(SPI Bus Master Output/Slave Input)。 +- MISO –主机输入 / 从机输出数据线(SPI Bus Master Input/Slave Output)。 +- SCLK –串行时钟线(Serial Clock),主设备输出时钟信号至从设备。 +- CS –从设备选择线 (Chip select)。也叫 SS、CSB、CSN、EN 等,主设备输出片选信号至从设备。 + +SPI 以主从方式工作,通常有一个主设备和一个或多个从设备。通信由主设备发起,主设备通过 CS 选择要通信的从设备,然后通过 SCLK 给从设备提供时钟信号,数据通过 MOSI 输出给从设备,同时通过 MISO 接收从设备发送的数据。 + +如下图所示芯片有 2 个 SPI 控制器,SPI 控制器对应 SPI 主设备,每个 SPI 控制器可以连接多个 SPI 从设备。挂载在同一个 SPI 控制器上的从设备共享 3 个信号引脚:SCK、MISO、MOSI,但每个从设备的 CS 引脚是独立的。 + +![image-20250724231812252](figures/image-20250724231812252.png) + +主设备通过控制 CS 引脚对从设备进行片选,一般为低电平有效。任何时刻,一个 SPI 主设备上只有一个 CS 引脚处于有效状态,与该有效 CS 引脚连接的从设备此时可以与主设备通信。 + +从设备的时钟由主设备通过 SCLK 提供,MOSI、MISO 则基于此脉冲完成数据传输。SPI 的工作时序模式由 CPOL(Clock Polarity,时钟极性)和 CPHA(Clock Phase,时钟相位)之间的相位关系决定,CPOL 表示时钟信号的初始电平的状态,CPOL 为 0 表示时钟信号初始状态为低电平,为 1 表示时钟信号的初始电平是高电平。CPHA 表示在哪个时钟沿采样数据,CPHA 为 0 表示在首个时钟变化沿采样数据,而 CPHA 为 1 则表示在第二个时钟变化沿采样数据。根据 CPOL 和 CPHA 的不同组合共有 4 种工作时序模式:①CPOL=0,CPHA=0、②CPOL=0,CPHA=1、③CPOL=1,CPHA=0、④CPOL=1,CPHA=1。如下图所示: + +![image-20250724231955043](figures/image-20250724231955043.png) + +### 2.2 挂载 SPI 设备 + +SPI 驱动会注册 SPI 总线,SPI 设备需要挂载到已经注册好的 SPI 总线上。 + +```c +rt_err_t rt_spi_bus_attach_device_cspin(struct rt_spi_device *device, + const char *name, + const char *bus_name, + rt_base_t cs_pin, + void *user_data) +``` + +此函数用于挂载一个 SPI 设备到指定的 SPI 总线,并向内核注册 SPI 设备。并且可以依赖RT-Thread的PIN框架来绑定SPI的片选引脚(cs_pin),避免了不同bsp的上层应用对片选引脚操作不统一的问题。 + +一般 SPI 总线命名原则为 spix, SPI 设备命名原则为 spixy ,如 spi10 表示挂载在 spi1 总线上的 0 号设备。cs_pin可以通过PIN框架`rt_pin_get`函数来获取,也可以使用BSP级提供的`GET_PIN`宏定义来获取。user_data 在用户使用不到的情况下可以设置为`RT_NULL`。 + +### 2.3 应用实例 + +SPI 设备的具体使用方式可以参考如下的示例代码,示例代码首先查找 SPI 设备获取设备句柄,然后使用 rt_spi_transfer_message() 发送命令读取 ID信息。 + +```c +/* + * 程序清单:这是一个 SPI 设备使用例程 + * 例程导出了 spi_w25q_sample 命令到控制终端 + * 命令调用格式:spi_w25q_sample spi10 + * 命令解释:命令第二个参数是要使用的SPI设备名称,为空则使用默认的SPI设备 + * 程序功能:通过SPI设备读取 w25q 的 ID 数据 +*/ +#include +#include + +#define W25Q_SPI_DEVICE_NAME "qspi10" + +static void spi_w25q_sample(int argc, char *argv[]) +{ + struct rt_spi_device *spi_dev_w25q; + char name[RT_NAME_MAX]; + rt_uint8_t w25x_read_id = 0x90; + rt_uint8_t id[5] = {0}; + + if (argc == 2) + { + rt_strncpy(name, argv[1], RT_NAME_MAX); + } + else + { + rt_strncpy(name, W25Q_SPI_DEVICE_NAME, RT_NAME_MAX); + } + + /* 查找 spi 设备获取设备句柄 */ + spi_dev_w25q = (struct rt_spi_device *)rt_device_find(name); + if (!spi_dev_w25q) + { + rt_kprintf("spi sample run failed! can't find %s device!\n", name); + } + else + { + /* 方式1:使用 rt_spi_send_then_recv()发送命令读取ID */ + rt_spi_send_then_recv(spi_dev_w25q, &w25x_read_id, 1, id, 5); + rt_kprintf("use rt_spi_send_then_recv() read w25q ID is:%x%x\n", id[3], id[4]); + + /* 方式2:使用 rt_spi_transfer_message()发送命令读取ID */ + struct rt_spi_message msg1, msg2; + + msg1.send_buf = &w25x_read_id; + msg1.recv_buf = RT_NULL; + msg1.length = 1; + msg1.cs_take = 1; + msg1.cs_release = 0; + msg1.next = &msg2; + + msg2.send_buf = RT_NULL; + msg2.recv_buf = id; + msg2.length = 5; + msg2.cs_take = 0; + msg2.cs_release = 1; + msg2.next = RT_NULL; + + rt_spi_transfer_message(spi_dev_w25q, &msg1); + rt_kprintf("use rt_spi_transfer_message() read w25q ID is:%x%x\n", id[3], id[4]); + + } +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(spi_w25q_sample, spi w25q sample); +``` + +![image-20250724235819190](figures/image-20250724235819190.png) + +## 3. I2C总线设备 + +### 3.1 I2C简介 + +I2C(Inter Integrated Circuit)总线是 PHILIPS 公司开发的一种半双工、双向二线制同步串行总线。I2C 总线传输数据时只需两根信号线,一根是双向数据线 SDA(serial data),另一根是双向时钟线 SCL(serial clock)。SPI 总线有两根线分别用于主从设备之间接收数据和发送数据,而 I2C 总线只使用一根线进行数据收发。 + +I2C 和 SPI 一样以主从的方式工作,不同于 SPI 一主多从的结构,它允许同时有多个主设备存在,每个连接到总线上的器件都有唯一的地址,主设备启动数据传输并产生时钟信号,从设备被主设备寻址,同一时刻只允许有一个主设备。如下图所示: + +![image-20250729173458238](figures/image-20250729173458238.png) + +如下图所示为 I2C 总线主要的数据传输格式: + +![image-20250729173514117](figures/image-20250729173514117.png) + +当总线空闲时,SDA 和 SCL 都处于高电平状态,当主机要和某个从机通讯时,会先发送一个开始条件,然后发送从机地址和读写控制位,接下来传输数据(主机发送或者接收数据),数据传输结束时主机会发送停止条件。传输的每个字节为8位,高位在前,低位在后。数据传输过程中的不同名词详解如下所示: + +- **开始条件:** SCL 为高电平时,主机将 SDA 拉低,表示数据传输即将开始。 + +- **从机地址:** 主机发送的第一个字节为从机地址,高 7 位为地址,最低位为 R/W 读写控制位,1 表示读操作,0 表示写操作。一般从机地址有 7 位地址模式和 10 位地址模式两种,如果是 10 位地址模式,第一个字节的头 7 位 是 11110XX 的组合,其中最后两位(XX)是 10 位地址的两个最高位,第二个字节为 10 位从机地址的剩下8位,如下图所示: + + ![image-20250729173534760](figures/image-20250729173534760.png) + +- **应答信号:** 每传输完成一个字节的数据,接收方就需要回复一个 ACK(acknowledge)。写数据时由从机发送 ACK,读数据时由主机发送 ACK。当主机读到最后一个字节数据时,可发送 NACK(Not acknowledge)然后跟停止条件。 +- **数据:** 从机地址发送完后可能会发送一些指令,依从机而定,然后开始传输数据,由主机或者从机发送,每个数据为 8 位,数据的字节数没有限制。 +- **重复开始条件:** 在一次通信过程中,主机可能需要和不同的从机传输数据或者需要切换读写操作时,主机可以再发送一个开始条件。 +- **停止条件:** 在 SDA 为低电平时,主机将 SCL 拉高并保持高电平,然后在将 SDA 拉高,表示传输结束。 + +### 3.2 I2C访问 + +#### 3.2.1 I2C查找 + +在使用 I2C 总线设备前需要根据 I2C 总线设备名称获取设备句柄,进而才可以操作 I2C 总线设备,查找设备函数如下所示, + +```c +rt_device_t rt_device_find(const char* name); +``` + +一般情况下,注册到系统的 I2C 设备名称为 i2c0 ,i2c1等,使用示例如下所示: + +```c +#define AHT10_I2C_BUS_NAME "i2c1" /* 传感器连接的I2C总线设备名称 */ +struct rt_i2c_bus_device *i2c_bus; /* I2C总线设备句柄 */ + +/* 查找I2C总线设备,获取I2C总线设备句柄 */ +i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); +``` + +#### 3.2.2 I2C数据传输 + +获取到 I2C 总线设备句柄就可以使用 `rt_i2c_transfer()` 进行数据传输。函数原型如下所示: + +```c +rt_size_t rt_i2c_transfer(struct rt_i2c_bus_device *bus, + struct rt_i2c_msg msgs[], + rt_uint32_t num); +``` + +和 SPI 总线的自定义传输接口一样,I2C 总线的自定义传输接口传输的数据也是以一个消息为单位。参数 msgs[] 指向待传输的消息数组,用户可以自定义每条消息的内容,实现 I2C 总线所支持的 2 种不同的数据传输模式。如果主设备需要发送重复开始条件,则需要发送 2 个消息。 + +I2C 消息数据结构原型如下: + +```c +struct rt_i2c_msg +{ + rt_uint16_t addr; /* 从机地址 */ + rt_uint16_t flags; /* 读、写标志等 */ + rt_uint16_t len; /* 读写数据字节数 */ + rt_uint8_t *buf; /* 读写数据缓冲区指针 */ +} +``` + +#### 3.2.3 读写API + +向 I2C 从设备发送数据: + +```c +rt_size_t rt_i2c_master_send(struct rt_i2c_bus_device *bus, + rt_uint16_t addr, + rt_uint16_t flags, + const rt_uint8_t *buf, + rt_uint32_t count); +``` + +从 I2C 从设备读取数据,数据会放在缓冲区中: + +```c +rt_size_t rt_i2c_master_recv(struct rt_i2c_bus_device *bus, + rt_uint16_t addr, + rt_uint16_t flags, + rt_uint8_t *buf, + rt_uint32_t count); +``` + +### 3.3 应用实例 + +1. 首先根据 I2C 设备名称查找 I2C 名称,获取设备句柄,然后初始化 aht10 传感器。 +2. 控制传感器的两个函数为写传感器寄存器 write_reg() 和读传感器寄存器 read_regs(),这两个函数分别调用了 rt_i2c_transfer() 传输数据。读取温湿度信息的函数 read_temp_humi() 则是调用这两个函数完成功能。 + +```c +/* + * 程序清单:这是一个 I2C 设备使用例程 + * 例程导出了 i2c_aht10_sample 命令到控制终端 + * 命令调用格式:i2c_aht10_sample i2c1 + * 命令解释:命令第二个参数是要使用的I2C总线设备名称,为空则使用默认的I2C总线设备 + * 程序功能:通过 I2C 设备读取温湿度传感器 aht10 的温湿度数据并打印 +*/ + +#include +#include + +#define AHT10_I2C_BUS_NAME "i2c1" /* 传感器连接的I2C总线设备名称 */ +#define AHT10_ADDR 0x38 /* 从机地址 */ +#define AHT10_CALIBRATION_CMD 0xE1 /* 校准命令 */ +#define AHT10_NORMAL_CMD 0xA8 /* 一般命令 */ +#define AHT10_GET_DATA 0xAC /* 获取数据命令 */ + +static struct rt_i2c_bus_device *i2c_bus = RT_NULL; /* I2C总线设备句柄 */ +static rt_bool_t initialized = RT_FALSE; /* 传感器初始化状态 */ + +/* 写传感器寄存器 */ +static rt_err_t write_reg(struct rt_i2c_bus_device *bus, rt_uint8_t reg, rt_uint8_t *data) +{ + rt_uint8_t buf[3]; + struct rt_i2c_msg msgs; + rt_uint32_t buf_size = 1; + + buf[0] = reg; //cmd + if (data != RT_NULL) + { + buf[1] = data[0]; + buf[2] = data[1]; + buf_size = 3; + } + + msgs.addr = AHT10_ADDR; + msgs.flags = RT_I2C_WR; + msgs.buf = buf; + msgs.len = buf_size; + + /* 调用I2C设备接口传输数据 */ + if (rt_i2c_transfer(bus, &msgs, 1) == 1) + { + return RT_EOK; + } + else + { + return -RT_ERROR; + } +} + +/* 读传感器寄存器数据 */ +static rt_err_t read_regs(struct rt_i2c_bus_device *bus, rt_uint8_t len, rt_uint8_t *buf) +{ + struct rt_i2c_msg msgs; + + msgs.addr = AHT10_ADDR; + msgs.flags = RT_I2C_RD; + msgs.buf = buf; + msgs.len = len; + + /* 调用I2C设备接口传输数据 */ + if (rt_i2c_transfer(bus, &msgs, 1) == 1) + { + return RT_EOK; + } + else + { + return -RT_ERROR; + } +} + +static void read_temp_humi(float *cur_temp, float *cur_humi) +{ + rt_uint8_t temp[6]; + + write_reg(i2c_bus, AHT10_GET_DATA, RT_NULL); /* 发送命令 */ + rt_thread_mdelay(400); + read_regs(i2c_bus, 6, temp); /* 获取传感器数据 */ + + /* 湿度数据转换 */ + *cur_humi = (temp[1] << 12 | temp[2] << 4 | (temp[3] & 0xf0) >> 4) * 100.0 / (1 << 20); + /* 温度数据转换 */ + *cur_temp = ((temp[3] & 0xf) << 16 | temp[4] << 8 | temp[5]) * 200.0 / (1 << 20) - 50; +} + +static void aht10_init(const char *name) +{ + rt_uint8_t temp[2] = {0, 0}; + + /* 查找I2C总线设备,获取I2C总线设备句柄 */ + i2c_bus = (struct rt_i2c_bus_device *)rt_device_find(name); + + if (i2c_bus == RT_NULL) + { + rt_kprintf("can't find %s device!\n", name); + } + else + { + write_reg(i2c_bus, AHT10_NORMAL_CMD, temp); + rt_thread_mdelay(400); + + temp[0] = 0x08; + temp[1] = 0x00; + write_reg(i2c_bus, AHT10_CALIBRATION_CMD, temp); + rt_thread_mdelay(400); + initialized = RT_TRUE; + } +} + +static void i2c_aht10_sample(int argc, char *argv[]) +{ + float humidity, temperature; + char name[RT_NAME_MAX]; + + humidity = 0.0; + temperature = 0.0; + + if (argc == 2) + { + rt_strncpy(name, argv[1], RT_NAME_MAX); + } + else + { + rt_strncpy(name, AHT10_I2C_BUS_NAME, RT_NAME_MAX); + } + + if (!initialized) + { + /* 传感器初始化 */ + aht10_init(name); + } + if (initialized) + { + /* 读取温湿度数据 */ + read_temp_humi(&temperature, &humidity); + + rt_kprintf("read aht10 sensor humidity : %d.%d %%\n", (int)humidity, (int)(humidity * 10) % 10); + if( temperature >= 0 ) + { + rt_kprintf("read aht10 sensor temperature: %d.%d°C\n", (int)temperature, (int)(temperature * 10) % 10); + } + else + { + rt_kprintf("read aht10 sensor temperature: %d.%d°C\n", (int)temperature, (int)(-temperature * 10) % 10); + } + } + else + { + rt_kprintf("initialize sensor failed!\n"); + } +} +/* 导出到 msh 命令列表中 */ +MSH_CMD_EXPORT(i2c_aht10_sample, i2c aht10 sample); +``` \ No newline at end of file diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day5 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\275\257\344\273\266\345\214\205.md" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day5 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\275\257\344\273\266\345\214\205.md" new file mode 100644 index 0000000000000000000000000000000000000000..796ddeb3695e44f678ffd1d1af34216c25047d74 --- /dev/null +++ "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\346\235\216\344\270\234\346\265\251/\347\254\224\350\256\260/\343\200\220RSOC25\343\200\221Day5 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\350\275\257\344\273\266\345\214\205.md" @@ -0,0 +1,143 @@ +# 【RSOC25】Day5 课程笔记:软件包 + +## 1. 软件包使用与配置 + +![image-20250730114213493](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250730114213493.png) + +![image-20250730114224501](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250730114224501.png) + +![image-20250730114233185](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250730114233185.png) + +![image-20250730114240172](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250730114240172.png) + +![image-20250730114244107](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250730114244107.png) + +![image-20250730114252728](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250730114252728.png) + + + +更新软件包索引 + +![image-20250730105627793](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250730105627793.png) + +![image-20250730114319560](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250730114319560.png) + +![image-20250731112656842](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250731112656842.png) + + + +## 2. Kconfig + +### 2.1 Kconfig在RT-Thread中的工作机制 + +C语言项目的裁剪配置本质上通过条件编译和宏的展开来实现的,RT-Thread借助Kconfig这套机制更方便的实现了这一功能。当前以Windows下Env工具中的使用为例,简述Kconfig在RT-Thread的工作机制。 + +Kconfig机制包括了Kconfig文件和配置UI界面(如menuconfig,pyconfig等)。Kconfig机制有如下特点: + +- Kconfig文件中的配置项会映射至rtconfig.h中 +- Kconfig文件可以随源码分散至各级子目录,便于灵活修改。 + +```Ini +# .config片段 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 +CONFIG_RT_DEBUG=y +复制错误复制成功 +// 相对应的rtconfig.h片段 +#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 +#define RT_DEBUG +``` + +### 2.2 Kconfig语法及示例 + +Kconfig源于Linux内核的配置构建系统,当前只介绍RT-Thread中的常用语法。 + +### 注释 + +Kconfig 采用 `#` 作为注释标记符,例如: + +```C +# This is a comment复制错误复制成功 +``` + +### config语句 + +config 定义了一组新的配置选项 + +以下为 RT-Thread 系统中 config 语句的示例 + +```C +config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + help + config gpio +``` + +## 3. SCons + +### 3.1 构建工具(系统) + +#### 3.1.1 什么是构建工具(系统) + +构建工具 (software construction tool) 是一种软件,它可以根据一定的规则或指令,将源代码编译成可执行的二进制程序。这是构建工具最基本也是最重要的功能。实际上构建工具的功能不止于此,通常这些规则有一定的语法,并组织成文件。这些文件用来控制构建工具的行为,在完成软件构建之外,也可以做其他事情。 + +目前最流行的构建工具是 GNU Make。很多知名开源软件,如 Linux 内核就采用 Make 构建。Make 通过读取 Makefile 文件来检测文件的组织结构和依赖关系,并完成 Makefile 中所指定的命令。 + +由于历史原因,Makefile 的语法比较混乱,不利于初学者学习。此外在 Windows 平台上使用 Make 也不方便,需要安装 Cygwin 环境。为了克服 Make 的种种缺点,人们开发了其他构建工具,如 CMake 和 SCons 等。 + +#### 3.1.2 RT-Thread 构建工具 + +RT-Thread 早期使用 Make/Makefile 构建。从 RT-Thread 0.3.0 开始,RT-Thread 开发团队逐渐引入了 SCons 构建系统,引入 SCons 唯一的目是:使大家从复杂的 Makefile 配置、IDE 配置中脱离出来,把精力集中在 RT-Thread 功能开发上。 + +有些读者可能会有些疑惑,这里介绍的构建工具与 IDE 有什么不同呢?IDE 通过图形化界面的操作来完成构建。大部分 IDE 会根据用户所添加的源码生成类似 Makefile 或 SConscript 的脚本文件,在底层调用类似 Make 或 SCons 的工具来构建源码。 + +### 3.2 SCons 简介 + +SCons 是一套由 Python 语言编写的开源构建系统,类似于 GNU Make。它采用不同于通常 Makefile 文件的方式,而是使用 SConstruct 和 SConscript 文件来替代。这些文件也是 Python 脚本,能够使用标准的 Python 语法来编写。所以在 SConstruct、SConscript 文件中可以调用 Python 标准库进行各类复杂的处理,而不局限于 Makefile 设定的规则。 + +#### 3.2.1 RT-Thread中Scons的脚本结构 + +SCons 使用 SConscript 和 SConstruct 文件来组织源码结构并进行构建,SConstruct是scons构建的主脚本,SConscript存放在源代码的子目录下,通常放在项目的子目录,以达到分层构建的目的。一个项目 (BSP) 只有一 SConstruct,但是会有多个 SConscript。一般情况下,每个存放有源代码的子目录下都会放置一个 SConscript。 + +```Markdown +/ + -- rtconfig.py ---- 控制SCons构建的配置文件,存放了如工具链,构建参数等配置。 + -- SConscript + -- SConstruct ---- SCons的入口脚本,初始化了SCons构建rt-thread所需的必要环境 + -- Kconfig ---- 顶层Kconfig文件,menuconfig的入口Kconfig文件 + -- rt-thread/ + --- src/ + ---- SConscript ---- 各级源码的scons子脚本,控制当前级别下的源码构建行为 + ---- Kconfig ---- 各级源码的Kconfig子脚本,存放当前级别下的配置项 + ---- **.c +``` + +如上图所示,为了方便开发者使用SCons,RT-Thread搭建了如图所示的构建框架,其中包括了一份SCons的入口脚本(SConstruct),以及分散在各级源码的SCons子脚本(SConscript),还有一份便于配置构建行为的配置脚本(rtconfig.py)同时,RT-Thread也在SCons标准接口的基础上,提供了一组用于组织源码工程的扩展接口。开发者在使用时,可以借助RT-Thread提供的扩展接口,更方便的完成源码的组织与配置。 + +![image-20250731200010035](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250731200010035.png) + +为了使 RT-Thread 更好的支持多种编译器,以及方便的调整构建参数,RT-Thread 为每个 BSP 单独创建了一个名为 rtconfig.py 的配置文件。因此每一个 RT-Thread BSP 目录下都会存在下面三个文件:rtconfig.py、SConstruct 和 SConscript,它们控制 BSP 的构建。一个 BSP 中只有一个 SConstruct 文件,但是却会有多个 SConscript 文件,可以说 SConscript 文件是组织源码的主力军。 + +### 3.3 SCons 基本命令 + +RT-Thread 构建系统支持多种编译器。目前支持的编译器包括 ARM GCC、MDK、IAR、VisualStudio、Visual DSP。主流的 ARM Cortex M0、M3、M4 平台,基本上 ARM GCC、MDK、IAR 都是支持的。有一些 BSP 可能仅支持一种,读者可以阅读该 BSP 目录下的 rtconfig.py 里的 CROSS_TOOL 选项查看当前支持的编译器。 + +打开 Env 工具,如果是 ARM 平台的芯片,输入 scons 命令直接编译 BSP,这时候默认使用的是 ARM GCC 编译器,因为 Env 工具带有 ARM GCC 编译器。 如下图所示使用 `scons` 命令编译 BSP。 + +![image-20250731195958377](D:/my_note/rsoc-rtt/2025/%E7%AC%AC5%E7%BB%84(CanMV-K230)/%E6%9D%8E%E4%B8%9C%E6%B5%A9/%E7%AC%94%E8%AE%B0/figures/image-20250731195958377.png) + +#### *![image-20250731231221745](figures/image-20250731231221745.png) + +## 4. MQTT + +### 4.1 + +![image-20250731225957331](figures/image-20250731225957331.png) + +![image-20250801000537942](figures/image-20250801000537942.png) + diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\344\275\234\344\270\232/\347\254\254\344\270\200\345\244\251\344\275\234\344\270\232.md" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\344\275\234\344\270\232/\347\254\254\344\270\200\345\244\251\344\275\234\344\270\232.md" deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093139645.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093139645.png" deleted file mode 100644 index 04a4aef23ac4cd0f03c1ad6841111197797a08bc..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093139645.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093218923.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093218923.png" deleted file mode 100644 index cdc6f9379edd4a33d7c170b4bacde15d4370ae5f..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093218923.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093251733.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093251733.png" deleted file mode 100644 index eb1a06d5a15873990ee5f5771393dd6c86e3ae26..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093251733.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093413668.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093413668.png" deleted file mode 100644 index 2c5c2723fde10cf040f09ff2afcdb39cd277eb6e..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093413668.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093446924.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093446924.png" deleted file mode 100644 index b672c5d24da77551df2dfcf81274fe76980d2132..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093446924.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093598609.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093598609.png" deleted file mode 100644 index 39f9f95c15da5358792185dce3ebe432ad3082f3..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093598609.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093728528.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093728528.png" deleted file mode 100644 index a5d6daf4772a1236cf0baf445bfdaf57e50e5a68..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093728528.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093761169.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093761169.png" deleted file mode 100644 index 4e5bfa6549a00e96faeb012c4a409f9cd27c9c55..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753093761169.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094072773.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094072773.png" deleted file mode 100644 index ae8e19eefa420c998bc6601949ac9601ca4fcac7..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094072773.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094178375.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094178375.png" deleted file mode 100644 index 9d4ae4714e311428d0cffb079ff0a1e346464919..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094178375.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094269113.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094269113.png" deleted file mode 100644 index 4ac86e6013c2674b6a56d4255b21e05f74e5cdcd..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094269113.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094435751.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094435751.png" deleted file mode 100644 index 227f18d8a95d80dfbcf2a02d7aaabaee50ac8195..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094435751.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094632755.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094632755.png" deleted file mode 100644 index 0e126f788c95bf167183d40860d0c48409616656..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094632755.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094809575.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094809575.png" deleted file mode 100644 index 4b27ae59fe3dd90dbfda514440f60fabebc58885..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753094809575.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095064469.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095064469.png" deleted file mode 100644 index 983db99f26d9156bdab3374e99057798712f7cae..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095064469.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095285943.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095285943.png" deleted file mode 100644 index 4fad6298219de1b9d04dc3f653f43162601f6acd..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095285943.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095516501.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095516501.png" deleted file mode 100644 index fb04fff3fd9847dfce7f977beed83e66ac6838d3..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095516501.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095757317.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095757317.png" deleted file mode 100644 index 5f6ea5f590f20b4e7676c33e60ae33f76f2ab3ae..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095757317.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095976025.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095976025.png" deleted file mode 100644 index 577eec06a53cd830da1db29328081204fcb661ec..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753095976025.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753096272836.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753096272836.png" deleted file mode 100644 index d235e2a132bbbb7f338060693ebd81c43bc2622a..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753096272836.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753096544142.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753096544142.png" deleted file mode 100644 index 7c3072b6be395bdc4f1879d7cf8afc541e6720b7..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753096544142.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753096839775.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753096839775.png" deleted file mode 100644 index 982fc7d4eaf42afc65aa5d4f1410c25e7735cfa8..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753096839775.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753099222978.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753099222978.png" deleted file mode 100644 index d406922ff4444b956d930414e60f66290be95982..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753099222978.png" and /dev/null differ diff --git "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753099645884.png" "b/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753099645884.png" deleted file mode 100644 index 351f65985aa0a32e61ab4bef2f6758b5fb6a6f0e..0000000000000000000000000000000000000000 Binary files "a/2025/\347\254\2545\347\273\204(CanMV-K230)/\351\251\254\351\224\241\345\260\247/\347\254\224\350\256\260/images/\343\200\220RSOC25\343\200\221Day1\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\345\274\200\345\217\221\347\216\257\345\242\203\346\220\255\345\273\272\344\270\216GIT\344\275\277\347\224\250/1753099645884.png" and /dev/null differ