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/day5/MQTT.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/day5/MQTT.md" new file mode 100644 index 0000000000000000000000000000000000000000..36f4bf3a8828c5f064af85cce8bfa801ab798443 --- /dev/null +++ "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/day5/MQTT.md" @@ -0,0 +1,90 @@ +Day5作业:MQTT + +![1753434944991](images/MQTT/1753434944991.png) + +根据作业要求我们来查看以下源代码mqtt_test源代码 + +![1753435761949](images/MQTT/1753435761949.png) + +我们发现其中有两个函数其中绿色框是pub发布函数每四秒会调用一次用于像mqtt服务器上报数据,而红色框是sub订阅函数 会打印服务器下发的消息那么,现在我们需要做的工具就是将pub函数中的内容替换成JSON格式并加入我们想要的字段即可。 +添加如下代码并修改pub函数 + +``` +#ifndef PUB_NAME +#define PUB_NAME "XiyaoMa" +#endif +#ifndef PUB_STUDY +#define PUB_STUDY "keep up the good work" +#endif + + +//······· +//其余代码不变 +//······· + +static int mqtt_publish_handle1(mqtt_client_t *client) +{ + mqtt_message_t msg; + memset(&msg, 0, sizeof(msg)); + msg.qos = QOS0; +// 拼接修改后的JSON字符串(修正语法并调整键值对) +static const char *json_data = "{" \ + "\"name\": \"" PUB_NAME "\"," \ + "\"study\": \""PUB_STUDY "\"" +"}"; + // 赋值给msg.payload + msg.payload = (void *)json_data; + msg.payloadlen = strlen(json_data); + return mqtt_publish(client, KAWAII_MQTT_PUBTOPIC, &msg); +} + +``` + +![1753436918726](images/MQTT/1753436918726.png) + +然后编译先测试以下康康,是否正确。编译运行并打开MQTTX查看没有任何问题。 + +![1753437251330](images/MQTT/1753437251330.png) + +那么接下来我们就需要解决Kconfig语法配置name字段和study的字段问题啦,这里我们九二一把这个Kconfig配置放到driver目录下的Kconfig中也是可以的,因为我们只是用于实验,之研究语法所以不用刻意去设置,当然也可以参考我在上面讲到的操作将田间一个Kconfig文件然后将其纳入最外层Kconfig文件的搜索路径中,不过这里我想带大家尝试第三种就是直接修改我们下载的软件包中的Kconfig也可以让大家对软件包的开发有点感觉。 + +我们进入env工具的packegs目录下可以看到里面有一个Kconfig文件![1753437819390](images/MQTT/1753437819390.png) + +可以打开看一眼就只有语句,意思是将当前目录下的packegs目录下的Kconfig目录纳入搜索路径 + +![1753437896787](images/MQTT/1753437896787.png) + +进入packegs目录下可以看到里面还有一个Kconfig文件而当前目录下就是存放了我们之前所选择 的软件包的种类目录,那不用看也知道这个Kconfig是包含了不同中种类目录下的Kconfig文件,然后不同种类下的Kconfig文件又包含了具体软件包的Kconfig文件(俄罗斯套娃)那我们直接找到kawai_mqtt软件包的Kconfig文件打开。 + +![1753438404962](images/MQTT/1753438404962.png) + +在里面的使能test中添加如下代码然后保存 + +``` + config PUB_NAME + string "name" + default "xiaoming" + config PUB_STUDY + string "study" + default "Keep" +``` + +![1753438678985](images/MQTT/1753438678985.png) + +输入`menuconfig`打开配置界面找到mqtt软件包的配置发现我们添加的代码已经生效。 + +![1753439026038](images/MQTT/1753439026038.png) + +按后修改以以下这两个字段和我们上面宏定义相同 + +![1753439249021](images/MQTT/1753439249021.png) + +然后退出保存。到rtconfig.h中查看配置配置是否生效 + +![1753439354314](images/MQTT/1753439354314.png) + +然后编译运行,输入ka_mqtt启动,然后打开MQTTX查看运行结果和终端输出如下 + +![1753439709966](images/MQTT/1753439709966.png) + +![1753439818566](images/MQTT/1753439818566.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/day5/images/MQTT/1753434944991.png" "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/day5/images/MQTT/1753434944991.png" new file mode 100644 index 0000000000000000000000000000000000000000..93307a66bd64471868860086e836aa757188be18 Binary files /dev/null and "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/day5/images/MQTT/1753434944991.png" differ 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/day5/images/MQTT/1753435761949.png" "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/day5/images/MQTT/1753435761949.png" new file mode 100644 index 0000000000000000000000000000000000000000..52ba88e3324d8207418e9755fe6b35344a5e995e Binary files /dev/null and "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/day5/images/MQTT/1753435761949.png" differ 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/day5/images/MQTT/1753436918726.png" "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/day5/images/MQTT/1753436918726.png" new file mode 100644 index 0000000000000000000000000000000000000000..437b994af95e4420af5563fb4d0c139f582659ec Binary files /dev/null and "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/day5/images/MQTT/1753436918726.png" differ 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/day5/images/MQTT/1753437251330.png" "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/day5/images/MQTT/1753437251330.png" new file mode 100644 index 0000000000000000000000000000000000000000..e85088756fd317986c9aa019d4d2fb6de9a2c6ac Binary files /dev/null and "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/day5/images/MQTT/1753437251330.png" differ 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/day5/images/MQTT/1753437819390.png" "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/day5/images/MQTT/1753437819390.png" new file mode 100644 index 0000000000000000000000000000000000000000..62a37d94f8990390c8c84ed043f35d7490cf4b13 Binary files /dev/null and "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/day5/images/MQTT/1753437819390.png" differ 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/day5/images/MQTT/1753437896787.png" "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/day5/images/MQTT/1753437896787.png" new file mode 100644 index 0000000000000000000000000000000000000000..22165f40af887645d0bbd9578aa0f4277aa2a93f Binary files /dev/null and "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/day5/images/MQTT/1753437896787.png" differ 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/day5/images/MQTT/1753438404962.png" "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/day5/images/MQTT/1753438404962.png" new file mode 100644 index 0000000000000000000000000000000000000000..28663f25c703adfa9af2af0a7095d40dc2d56cf7 Binary files /dev/null and "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/day5/images/MQTT/1753438404962.png" differ 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/day5/images/MQTT/1753438678985.png" "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/day5/images/MQTT/1753438678985.png" new file mode 100644 index 0000000000000000000000000000000000000000..2c86245df56c1c3b934a0031f76e0dfdb4be01a6 Binary files /dev/null and "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/day5/images/MQTT/1753438678985.png" differ 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/day5/images/MQTT/1753439026038.png" "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/day5/images/MQTT/1753439026038.png" new file mode 100644 index 0000000000000000000000000000000000000000..23f45b97c671f0fd82e3a093e09cea28b813eae8 Binary files /dev/null and "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/day5/images/MQTT/1753439026038.png" differ 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/day5/images/MQTT/1753439249021.png" "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/day5/images/MQTT/1753439249021.png" new file mode 100644 index 0000000000000000000000000000000000000000..1ea59d601cba8591de2a8be566024eec9ee92a3e Binary files /dev/null and "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/day5/images/MQTT/1753439249021.png" differ 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/day5/images/MQTT/1753439354314.png" "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/day5/images/MQTT/1753439354314.png" new file mode 100644 index 0000000000000000000000000000000000000000..78a6013d1736092ae553ff6976aa83361eb4d342 Binary files /dev/null and "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/day5/images/MQTT/1753439354314.png" differ 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/day5/images/MQTT/1753439709966.png" "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/day5/images/MQTT/1753439709966.png" new file mode 100644 index 0000000000000000000000000000000000000000..737a3c8116c96c27afc485043626dfe2c8735e3a Binary files /dev/null and "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/day5/images/MQTT/1753439709966.png" differ 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/day5/images/MQTT/1753439818566.png" "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/day5/images/MQTT/1753439818566.png" new file mode 100644 index 0000000000000000000000000000000000000000..1641ad83b20d2b07dbf0c97969dbcc43efd90144 Binary files /dev/null and "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/day5/images/MQTT/1753439818566.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753426232711.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753426232711.png" new file mode 100644 index 0000000000000000000000000000000000000000..04fcf0771ad967d36edda7a4cf8e1cf7d0b7026f Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753426232711.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753428620261.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753428620261.png" new file mode 100644 index 0000000000000000000000000000000000000000..2870e31c6f6412038ebfb2ff932dd0d2dee01d47 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753428620261.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753429146564.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753429146564.png" new file mode 100644 index 0000000000000000000000000000000000000000..ce45f58ae8a22331cbf105df322a84c7105669c7 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753429146564.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753430302854.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753430302854.png" new file mode 100644 index 0000000000000000000000000000000000000000..3a43958798caf8ff43fdca64fb3f40b76c8ed57d Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753430302854.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753430511937.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753430511937.png" new file mode 100644 index 0000000000000000000000000000000000000000..c3989666d8063147e0d436b18744392cac7cad0e Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753430511937.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753430902190.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753430902190.png" new file mode 100644 index 0000000000000000000000000000000000000000..5b7f18f4734381af2ac0968220963646708c5e61 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753430902190.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431038811.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431038811.png" new file mode 100644 index 0000000000000000000000000000000000000000..65f12183d329ef8b8a1fcc5e794b077720fc1c36 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431038811.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431152132.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431152132.png" new file mode 100644 index 0000000000000000000000000000000000000000..9416916725677b0ddd8fb403bd9a9ff0c3325a3a Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431152132.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431251967.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431251967.png" new file mode 100644 index 0000000000000000000000000000000000000000..d51f81a44e7230ab4edcac2834003ec14ebbfe87 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431251967.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431327531.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431327531.png" new file mode 100644 index 0000000000000000000000000000000000000000..fc239ad78d3e6521e85aadbce1229b803b240a8d Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431327531.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431602791.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431602791.png" new file mode 100644 index 0000000000000000000000000000000000000000..51442b16609d45912bc7d936cd1fe5a8ccb76bdb Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431602791.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431646514.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431646514.png" new file mode 100644 index 0000000000000000000000000000000000000000..26d60f738e0efc89fe8f7c968d5d9dcef8da10ab Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431646514.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431813359.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431813359.png" new file mode 100644 index 0000000000000000000000000000000000000000..102ecc21aea8cd229a61a6548d1155b9cc5cba47 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431813359.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431886077.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431886077.png" new file mode 100644 index 0000000000000000000000000000000000000000..6b10e740a7fea37f7891d94cbda9f2b57109b869 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753431886077.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753432061113.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753432061113.png" new file mode 100644 index 0000000000000000000000000000000000000000..9f202e6f928d66bea91adb55fbfadf68509aaff0 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753432061113.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753432128450.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753432128450.png" new file mode 100644 index 0000000000000000000000000000000000000000..d95d826c84dbac226c88cfabdc2fa3c217f157e5 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753432128450.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753432823335.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753432823335.png" new file mode 100644 index 0000000000000000000000000000000000000000..1a5908095ad80335b2794768253304fecf9a3602 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753432823335.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433295046.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433295046.png" new file mode 100644 index 0000000000000000000000000000000000000000..f889d65c65b3efeb36a3d13b62fe35a75ffe9387 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433295046.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433620368.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433620368.png" new file mode 100644 index 0000000000000000000000000000000000000000..3afb801903e88134f877fb7be72ab18b9d9e535c Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433620368.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433797185.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433797185.png" new file mode 100644 index 0000000000000000000000000000000000000000..c839fed4b978820a8af63afe5efacd8bc9ae7d63 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433797185.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433876655.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433876655.png" new file mode 100644 index 0000000000000000000000000000000000000000..747fa9f499b1cd150d2f2e7ec6a34786dae660fc Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433876655.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433960461.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433960461.png" new file mode 100644 index 0000000000000000000000000000000000000000..e1f8d0304cc94cb66346e71a5c09149791bdab7d Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753433960461.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434035985.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434035985.png" new file mode 100644 index 0000000000000000000000000000000000000000..e5d7ea853f28557b19b7395faa7973392db8832f Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434035985.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434233532.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434233532.png" new file mode 100644 index 0000000000000000000000000000000000000000..1acc655c210bb91f2ac6f3938cfc04d525fd04c9 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434233532.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434291084.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434291084.png" new file mode 100644 index 0000000000000000000000000000000000000000..d2fc6091bb319b0dcaefde69431848e4fb6077cb Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434291084.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434532474.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434532474.png" new file mode 100644 index 0000000000000000000000000000000000000000..bd0df5e86f1aace2bad8b3b7f2c51d258ff6c92b Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434532474.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434579704.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434579704.png" new file mode 100644 index 0000000000000000000000000000000000000000..2fbae972d9001f5f08123664091c84fc56a1fb12 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434579704.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434619402.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434619402.png" new file mode 100644 index 0000000000000000000000000000000000000000..624c8a0be31d08cac2771c17c023bb44eb2244f0 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434619402.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434757421.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434757421.png" new file mode 100644 index 0000000000000000000000000000000000000000..7286ce48d940a445d5ac3ced5dbf619a88259ec6 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434757421.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434837756.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434837756.png" new file mode 100644 index 0000000000000000000000000000000000000000..bb7046a4354f609a3d7a879ab306e3fdbfb408df Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434837756.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434944991.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434944991.png" new file mode 100644 index 0000000000000000000000000000000000000000..93307a66bd64471868860086e836aa757188be18 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753434944991.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753435761949.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753435761949.png" new file mode 100644 index 0000000000000000000000000000000000000000..52ba88e3324d8207418e9755fe6b35344a5e995e Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753435761949.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753436918726.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753436918726.png" new file mode 100644 index 0000000000000000000000000000000000000000..437b994af95e4420af5563fb4d0c139f582659ec Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753436918726.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753437251330.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753437251330.png" new file mode 100644 index 0000000000000000000000000000000000000000..e85088756fd317986c9aa019d4d2fb6de9a2c6ac Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753437251330.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753437819390.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753437819390.png" new file mode 100644 index 0000000000000000000000000000000000000000..62a37d94f8990390c8c84ed043f35d7490cf4b13 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753437819390.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753437896787.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753437896787.png" new file mode 100644 index 0000000000000000000000000000000000000000..22165f40af887645d0bbd9578aa0f4277aa2a93f Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753437896787.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753438404962.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753438404962.png" new file mode 100644 index 0000000000000000000000000000000000000000..28663f25c703adfa9af2af0a7095d40dc2d56cf7 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753438404962.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753438678985.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753438678985.png" new file mode 100644 index 0000000000000000000000000000000000000000..2c86245df56c1c3b934a0031f76e0dfdb4be01a6 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753438678985.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439026038.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439026038.png" new file mode 100644 index 0000000000000000000000000000000000000000..23f45b97c671f0fd82e3a093e09cea28b813eae8 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439026038.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439249021.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439249021.png" new file mode 100644 index 0000000000000000000000000000000000000000..1ea59d601cba8591de2a8be566024eec9ee92a3e Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439249021.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439354314.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439354314.png" new file mode 100644 index 0000000000000000000000000000000000000000..78a6013d1736092ae553ff6976aa83361eb4d342 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439354314.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439709966.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439709966.png" new file mode 100644 index 0000000000000000000000000000000000000000..737a3c8116c96c27afc485043626dfe2c8735e3a Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439709966.png" 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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439818566.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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439818566.png" new file mode 100644 index 0000000000000000000000000000000000000000..1641ad83b20d2b07dbf0c97969dbcc43efd90144 Binary files /dev/null and "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\221Day5\350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237/1753439818566.png" 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/\343\200\220RSOC25\343\200\221Day3 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\272\277\347\250\213\351\227\264\347\232\204\345\220\214\346\255\245\345\222\214\351\200\232\350\256\257.md" "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/\343\200\220RSOC25\343\200\221Day3 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\272\277\347\250\213\351\227\264\347\232\204\345\220\214\346\255\245\345\222\214\351\200\232\350\256\257.md" index 77b14feac9c11cde06f99d71bd072abb19a051e1..7cd82d14d645f47828e25f2afd6fb679e3dca564 100644 --- "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/\343\200\220RSOC25\343\200\221Day3 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\272\277\347\250\213\351\227\264\347\232\204\345\220\214\346\255\245\345\222\214\351\200\232\350\256\257.md" +++ "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/\343\200\220RSOC25\343\200\221Day3 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\272\277\347\250\213\351\227\264\347\232\204\345\220\214\346\255\245\345\222\214\351\200\232\350\256\257.md" @@ -526,7 +526,11 @@ thread1 count : 9 ``` +<<<<<<< HEAD +## 3.课后作业 +======= ## 3.作业 +>>>>>>> ef7910801b7c58cabb5407d1e2c5ff219b8a312d 编写代码上传至git仓库,程序需要体现出信号量、互斥量、事件集、邮箱、消息队列、信号的作用(上传6个C文件,每个文件体现一种功能)。 @@ -555,7 +559,11 @@ static void producer_thread(void *param) { product_count++; rt_kprintf("Produced: %d\n", product_count); +<<<<<<< HEAD + +======= +>>>>>>> ef7910801b7c58cabb5407d1e2c5ff219b8a312d /* 每生产10个产品,释放一次信号量 */ if (product_count % 10 == 0) { @@ -686,7 +694,10 @@ int mutex_demo(void) MSH_CMD_EXPORT(mutex_demo, mutex demo); ``` +<<<<<<< HEAD +======= +>>>>>>> ef7910801b7c58cabb5407d1e2c5ff219b8a312d #### 3.1.3 事件集示例(event\_demo.c) **功能**:线程 1 等待特定事件组合(或 / 与逻辑),线程 2 发送事件触发线程 1。 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/\343\200\220RSOC25\343\200\221Day5 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237.md" "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/\343\200\220RSOC25\343\200\221Day5 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237.md" new file mode 100644 index 0000000000000000000000000000000000000000..b41d9e143dd9c1e7f1644b0d82292e3d003ed5e6 --- /dev/null +++ "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/\343\200\220RSOC25\343\200\221Day5 \350\257\276\347\250\213\347\254\224\350\256\260\357\274\232\347\273\204\344\273\266\344\270\216\350\275\257\344\273\266\345\214\205\345\217\212\346\236\204\345\273\272\347\263\273\347\273\237.md" @@ -0,0 +1,489 @@ +# 【RSOC25】Day5 课程笔记:组件与软件包及构建系统 + +## 1.构建与配置系统介绍 + +![1753426232711](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753426232711.png) + +### 1.1Kconfig工作机制 + +C语言项目的裁剪配置本质上通过条件编译和宏的展开来实现的,RT-Thread借助Kconfig这套机制更方便的实现了这一功能。当前以Windows下Env工具中的使用为例,简述Kconfig在RT-Thread的工作机制。 + +Kconfig机制包括了Kconfig文件和配置UI界面(如menuconfig,pyconfig等)。Kconfig机制有如下特点: + +Kconfig文件中的配置项会映射至rtconfig.h中 + +Kconfig文件可以随源码分散至各级子目录,便于灵活修改。 + +``` +# .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 + +``` + +当我们运行menuconfig图形化界面之后会遍历所有的kconfig文件待我们配置玩之后保存会生成新的.config文件和rtconfig.h文件。![构建配置系统](https://www.rt-thread.org/document/site/development-tools/build-config-system/figures/buildconfig2.png)Kconfig文件在源码中呈现树形结构,需要**在工程的根目录下存在一份顶层Kconfig文件**,顶层Kconfig文件在文件中通过source语句显示地调用各子目录下的Kconfig文件。Env在根目录下执行menuconfig命令后会递归解析各级Kconfig文件,然后提供如下配置界面,完成相应的配置后并保存,根目录下会存在一份.config文件保存当前选择的配置项,并将.config文件转为RT-Thread的系统配置文件rtconfig.h。 + +### 1.2 Kconfig示例讲解 + +这里我们可以打开工程最外层的kconfig文件查看可以看到这里标注了几个kconfig的字文件地址我们去看一看driver/kconfig(因为另外两个我没有找到) + +![1753428620261](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753428620261.png) + +看一下这些配置其实就是我们之前menconfig运行后的"Hardware Drivers Config"菜单关于Kconfig的语法[Kconfig在RTT中的使用](https://www.rt-thread.org/document/site/#/development-tools/build-config-system/Kconfig)自己查看即可,其实也很简单。![1753429146564](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753429146564.png) + +### 1.2 Scons构建系统 + +SCons 是一套由 Python 语言编写的开源构建系统,类似于 GNU Make。它采用不同于通常 Makefile 文件的方式,而是使用 SConstruct 和 SConscript 文件来替代。这些文件也是 Python 脚本,能够使用标准的 Python 语法来编写。所以在 SConstruct、SConscript 文件中可以调用 Python 标准库进行各类复杂的处理,而不局限于 Makefile 设定的规则。 + +关于这部分查看官网的[Scons构建工具](https://www.rt-thread.org/document/site/#/development-tools/build-config-system/SCons)没什么好讲的,后面会带大家编写一个代码实验。不懂得查看官网教程即可。 + +#### 1.2.1RT-Thread中Scons的脚本结构 + +SCons 使用 SConscript 和 SConstruct 文件来组织源码结构并进行构建,SConstruct是scons构建的主脚本,SConscript存放在源代码的子目录下,通常放在项目的子目录,以达到分层构建的目的。一个项目 (BSP) 只有一 SConstruct,但是会有多个 SConscript。一般情况下,每个存放有源代码的子目录下都会放置一个 SConscript。 + +``` +/ + -- 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提供的扩展接口,更方便的完成源码的组织与配置。 + +![构建配置系统](https://www.rt-thread.org/document/site/development-tools/build-config-system/figures/buildconfig19.png) + +为了使 RT-Thread 更好的支持多种编译器,以及方便的调整构建参数,RT-Thread 为每个 BSP 单独创建了一个名为 rtconfig.py 的配置文件。因此每一个 RT-Thread BSP 目录下都会存在下面三个文件:rtconfig.py、SConstruct 和 SConscript,它们控制 BSP 的构建。一个 BSP 中只有一个 SConstruct 文件,但是却会有多个 SConscript 文件,可以说 SConscript 文件是组织源码的主力军。 + +RT-Thread当前的构建系统由以下几个部分组成: + +``` +flowchart LR + A(RT-Thread构建系统)-->Kconfig + A(RT-Thread构建系统)-->rtconfig.py + A(RT-Thread构建系统)-->SCons + SCons --> SConscript + SCons --> SConstruct + SConscript --> Scons标准函数 + SConscript --> RT-Thread自定义函数 + SConscript --> Python函数 +``` + +#### 1.2.2 Scons 函数在 SConscript 中的经典示例 + +下面我们将以几个 SConscript 为例讲解 scons 构建工具的使用方法。 + +##### 1.2.2.1 构建一个基本的 Group + +导入RT-Thread的自定义构建函数,几乎每一个RT-Thread的Sconscript都需要这么做。 + +只有导入了building模块,才可以使用2.2.2介绍的RT-Thread自定义Scons函数 + +``` +from building import * + +cwd = GetCurrentDir() # 获取当前脚本的路径 +CPPPATH = [cwd] # 将当前路径加入构建搜索的头文件路径 +src = Split(''' +shell.c +msh.c +''') + +#也可以等效成:src = ['shell.c', 'msh.c'] + +if GetDepend('MSH_USING_BUILT_IN_COMMANDS'): # 判断是否启用MSH的内建命令 +src += ['cmd.c'] + +if GetDepend('DFS_USING_POSIX'): # 判断是否启用文件系统的POSIX接口 +src += ['msh_file.c'] +``` + +使用DefineGroup创建一个名为Finsh的组 + +该Group是否被添加到工程中,参与编译,取决于depend的宏是否在Kconfig中被使能。 + +即上述的头文件路径和C文件是否被编译,取决于用户在Kconfig中是否使能了RT_USING_FINSH + +group = DefineGroup('Finsh', src, depend = ['RT_USING_FINSH'], CPPPATH = CPPPATH) + +Return('group') # 将当前脚本指定的构建对象返回上级SCons脚本复制错误复制成功 +这里需要注意: + +1. src 和 depends参数是必选项,即便你不想添加任何C文件,也需要定义一个空的列表。例如: + ``` + src = [] + group = DefineGroup('Finsh', src, depend = [''], CPPPATH = CPPPATH) 复制错误复制成功 + ``` +2. 头文件路径的参数不是必选项,如果不想添加头文件目录,就不需要填写 `CPPPATH` 参数 +3. 最后一行使用 DefineGroup 创建一个名为 Finsh 的组,这个组也就对应 MDK 或者 IAR 中的分组。这个组的源代码文件为 src 指定的文件,如果 depend 为空表示该组不依赖任何 rtconfig.h 的宏。 +4. `CPPPATH =CPPPATH` 表示将当前路径添加到系统的头文件路径中。左边的 CPPPATH 是 DefineGroup 中内置参数,表示头文件路径。右边的 CPPPATH 是本文件上面一行定义的。这样我们就可以在其他源码中引用 drivers 目录下的头文件了。 +5. 如果有其他 Sconscript 文件也创建了相同的组名(例如,都叫 `Finsh`),Scons 会自动将这两个组的信息并入到一起。 + +##### 1.2.2.2 桥接文件 + +在一些文件夹内的 Sconscript 脚本中,会发现有如下的代码。这些代码并没有实际去将某些C文件或者头文件路径加入到工程中。它所起到的作用是桥接,即让 Scons 继续读取其子文件夹内的 Sconscript 脚本,进而继续构建工程: + +``` +# RT-Thread building script for bridge + +import os # 使用Python标准库,用于文件以及路径相关的操作 +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs')复制错误复制成功 +``` + +##### 1.2.2.3 全局宏定义的定义 + +下面的代码展示了如何定义全局宏定义: + +``` +from building import * + +src = ['ipc.c'] # 添加C文件 + +CPPDEFINES = ['__RTTHREAD__'] # 全局宏定义 + +# depend 为空表示该组不依赖任何 rtconfig.h 的宏 +group = DefineGroup('Kernel', src, depend = [''], CPPDEFINES = CPPDEFINES) + +Return('group')复制错误复制成功 +``` + +所谓全局宏定义,就是即便不引用任何 RT-Thread 的头文件,你也可以使用直接使用 `__RTTHREAD__` 这个宏定义。 + +##### 1.2.2.4 与编译器相关 + +如下的 Sconscript 脚本展示了如何判断不同的编译器,并根据不同的编译器来进行不同的处理: + +``` +if rtconfig.CROSS_TOOL == 'iar': # 判断是否使用IAR编译器 +if rtconfig.CROSS_TOOL == 'keil': # 判断是否使用Keil编译器 +if rtconfig.CROSS_TOOL == 'msvc': # 判断是否使用Visual Studio编译器 +if rtconfig.PLATFORM == 'armcc': # 判断是否使用Keil-AC5,即armcc编译工具链 +if rtconfig.PLATFORM == 'armclang': # 判断是否使用Keil-AC6,即armclang编译工具链 +if rtconfig.PLATFORM == 'iar': # 判断是否使用IAR编译器的工具链 +if rtconfig.PLATFORM == 'gcc': # 判断是否使用gcc编译工具链复制错误复制成功 +``` + +下面的例子中,展示了针对不同的编译器/工具链,来进行设置不同的编译标志: + +源码位置:[https://github.com/mysterywolf/RTduino/blob/master/core/SConscript](https://github.com/mysterywolf/RTduino/blob/master/core/SConscript) + +``` +from building import * +import rtconfig + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') +inc = [cwd] + +LOCAL_CCFLAGS = '' +LOCAL_CFLAGS = '' +LOCAL_CXXFLAGS = '' + +if rtconfig.PLATFORM == 'gcc' or rtconfig.PLATFORM == 'armclang': # GCC or Keil AC6 + LOCAL_CFLAGS += ' -std=c99' + LOCAL_CXXFLAGS += ' -std=c++11' # support C++11, like non-static data member initializers +elif rtconfig.PLATFORM == 'armcc': # Keil AC5 + LOCAL_CCFLAGS += ' --gnu -g -W' + LOCAL_CFLAGS += ' --c99' # cannot use --c99 symbol for C++ files, pertically in Keil + LOCAL_CXXFLAGS += ' --cpp11' # support C++11 + +group = DefineGroup('Arduino', src, + depend = ['PKG_USING_RTDUINO'], + CPPPATH = inc, + CPPDEFINES = ['ARDUINO=100', 'ARDUINO_ARCH_RTTHREAD'], + LOCAL_CCFLAGS = LOCAL_CCFLAGS, + LOCAL_CFLAGS = LOCAL_CFLAGS, + LOCAL_CXXFLAGS = LOCAL_CXXFLAGS) + +Return('group')复制错误复制成功 +``` + +##### 1.2.2.5 添加模块 + +前文提到在自己源代码文件不多的情况下,建议所有源代码文件都放在 applications 文件夹里面。如果用户源代码很多了,并且想创建自己的工程模块,或者需要使用自己获取的其他模块,怎么做会比较合适呢? + +同样以上文提到的 hello.c 和 hello.h 为例,这两个文件将会放到一个单独的文件夹里管理,并且在 MDK 工程文件里有自己的分组,且可以通过 menuconfig 选择是否使用这个模块。在 BSP 下新增 hello 文件夹。 + +![新增 hello 文件夹](https://www.rt-thread.org/document/site/development-tools/build-config-system/figures/f42ee8cdfd03c1782679c759f70f072f.png) + +大家注意到文件夹里多了一个 SConscript 文件,如果想要将自己的一些源代码加入到 SCons 编译环境中,一般可以创建或修改已有的 SConscript 文件。参考上文对 RT-Thread 源代码的一些对 SConscript 文件的分析,这个新增的 hello 模块 SConscript 文件内容如下所示: + +``` +from building import * + +cwd = GetCurrentDir() +include_path = [cwd] +src = [] + +if GetDepend(['RT_USING_HELLO']): + src += ['hello.c'] + +group = DefineGroup('hello', src, depend = [''], CPPPATH = include_path) + +Return('group')复制错误复制成功 +``` + +通过上面几行简单的代码,就创建了一个新组 hello,并且可以通过宏定义控制要加入到组里面的源文件,还将这个组所在的目录添加到了系统头文件路径中。那么自定义宏 RT\_USING\_HELLO 又是通过怎样的方式定义呢?这里要介绍一个新的文件 Kconfig。Kconfig 用来配置内核,使用 Env 配置系统时使用的 menuconfig 命令生成的配置界面就依赖 Kconfig 文件。menuconfig 命令通过读取工程的各个 Kconfig 文件,生成配置界面供用户配置内核,最后所有配置相关的宏定义都会自动保存到 BSP 目录里的 rtconfig.h 文件中,每一个 BSP 都有一个 rtconfig.h 文件,也就是这个 BSP 的配置信息。 + +在 stm32f10x-HAL BSP 目录下已经有了关于这个 BSP 的 Kconfig 文件,我们可以基于这个文件添加自己需要的配置选项。关于 hello 模块添加了如下配置选项,# 号后面为注释。 + +![hello 模块相关配置选项](https://www.rt-thread.org/document/site/development-tools/build-config-system/figures/caef0674c4a148411789c42f8f8b70b7.png) + +## 2.软件包介绍和使用实践 + +### 2.1 软件包介绍 + +关于软件包,其实就是官方和大佬写好的可以直接使用的库,当大家开使用RTT开发某项功能的古城中如果遇到了一些困难,大家可以尝试打开软件包搜索一下看看,希望大家也能够一起加入软件包的贡献和使用中来。 + +![1753430302854](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753430302854.png) + +![1753430511937](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753430511937.png) + +### 2.2 LLM软件包实践 + +#### 2.2.1 LLM软件包下载和配置 + +进入rt-thread的bsp目录找到如下平台然后在env中打开 + +![1753430902190](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753430902190.png) + +然后输入`menuconfig`打开图形化界面在软件包目录下找到LLM模型软件包目录如图并勾选 + +![1753431038811](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753431038811.png) + +然后进入配置选项如下。 + +![1753431152132](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753431152132.png) + +我们进入第一项是选择模型,我们选择qwen llm(通义千文) + +![1753431251967](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753431251967.png) + +然后返回接着填写apikey可以到[通义千文官网](https://bailian.console.aliyun.com/?tab=model#/model-market)获取,然后是大模型名称课随意填写,最后使能http流式对话,然后退到初始菜单界面。 + +![1753431327531](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753431327531.png) + +#### 2.2.2 LLM软件包依赖配置 + +因为LLM软件包还有一些依赖,所以我们也需要进行配置,如下面三图图所示照相相应配置选择即可。 + +![1753431602791](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753431602791.png) + +![1753431646514](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753431646514.png) + +![1753431813359](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753431813359.png) + +配置好直接保存退出即可系统会自动下载软件包和依赖包,等待下载完成即可。 + +![1753431886077](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753431886077.png) + +#### 2.2.3 LLM软件包使用实验演示 + +下载完整之后输入`scons-j4`编译等待编译完成然后`qemu-nographic.bat`回车运行然后tab键可以查看命令。我们看到llm命令就是例程启动命令。 + +![1753432061113](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753432061113.png) + +输入`llm`!然后对话框内输入对话内容并回车即可。 + +[1753432128450](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753432128450.png) + +## 3.组件介绍和使用实践 + +### 3.1 组件介绍 + +其实组件和软件包在功能上大同小异,只不过组件的来源都是官方,而软件包来自用户,但是组件和RT-thread操作系统息息相关,比如我们用的msh控制台,网络组件其实这都是属于RT-thread操作系统的一部分,类比linux操作系统来说桌面和网络功能都是操作系统完整的一部分,但是其实你不联网或者无桌面我们依旧可以使用我们的操作系统,这也就是为啥我说在功能上类似软件包,但实际性质上是不一样的,但既然是可有可无的东西,那么我们按自己的需求裁剪就可以啦,这就是RTT操作系统轻量化可裁剪的优势所在。 + +### 3.2 网络组件介绍与实践 + +#### 3.2.1 网络组件介绍 + +[RTT网络组件官方介绍](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/net/net_introduce) + +作为一款在 RTOS 领域对网络支持很丰富的 RT-Thread,对设备联网功能的支持的工具就是接下来要讨论的 net 组件。它位于 `./rt-thread/components/net` 路径下;作为一款基础组件, env 与 Studio 的工程配置界面的配置项都依赖该目录下的 Kconfig 文件。我们对网络功能的选择,或者其配置都属于该 Kconfig 的管理范畴。 + +![1753432823335](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753432823335.png) + +从图片中的信息也可以了解到,AT,Lwip,Netdev,SAL 这些我们相对熟悉的功能也位于该目录中。这四个基础组件,可以驱动的网络设备的种类多到各个方面。从有线网络的各种 ETH 的方式,带 PHY 的 enc28j60,纯接口的 RJ45,还有自带网络协议栈的 W5500都可以直接经过配置,通过我们的 net 组件实现设备联网的需求;除了有线网络的接入方式,无线网络的接入方式则更多,2G模块,3G模块,4G模块,Cat-1模块,Cat-4模块,NB-IOT模块,乃至 5G 模块这些依赖基站运营商的入网方式,例如 SIM800,EC20,AIR720,L610,N58,M5311 等,这些不同厂家,不同工作频率的模组均可以通过 NET 组件入网;WIFI 这种无需运营商直接提供的网络的入网方式,例如 ESP8266,W60x,rw007 等。 + +通过上面的简单介绍,大家应该可以基本了解 Net 组件的作用,即为使用 RT-Thread 的设备提供上网能力。上面的联网设备,品类繁多,方式各异,但其实追踪到依赖的基础 net 能力其实也没有多复杂。实际上大部分的功能依赖的基础能力,只有两组而已,即 AT ,Lwip;而到用户,也就开发者层面,大部分就只用到 SAL 这一个概念。 + +![](https://www.rt-thread.org/document/site/rt-thread-version/rt-thread-standard/programming-manual/net/docs/network_frame.jpg) + +相信大家看过这份[文档](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/sal/sal),主要描述了 SAL 提供的编程接口,也就是大家常用的 socket 接口;通过 SAL 接口大家已经可以实现 MQTT,NTP,TFTP,TCP Client,TCP Server,webclient,UDP Client,UDP Server,webnet 等这些大家经常会使用的工具。像浏览器一样访问网站,webclient;模拟一个网站,webnet;连接各种云平台,Mqtt;获取准确授时,NTP ;通过网络传输文件 ,TFTP ;诸如此类功能, SAL 提供了轻松访问网络的一把钥匙。你可以理解这把钥匙是向上的,但是这篇文章现在要讲的,是向下的,看看 SAL 这样组件,又是谁在支撑着它。 + +Net 组件的主要内容有 4 个方面,分别是 sal ,AT,lwip 与 netdev,我们先从 AT 和 lwIP 讲起,在不同的方式中介绍 sal 的用途;然后讲 netdev 的作用。 + +#### 3.2.2 网络组件实践 + +接下来我们介绍两个实践分别是网络管理器工具实践与MQTT连接实践,因为这两个实验都需要用到用到网络组件下的lwip协议的tcp/ip协议栈,我们`menuconfig`进入配置界面,进入组件—>网络—>lwip—>tcp/ip stack配置文件下做出修改如下: + +![1753433620368](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753433620368.png) + +##### 3.2.2.1 实践1:网络管理器工具 + +接着上一节的工程我们打开`menuconfig`到软件包找到网络管理器工具并选择。 + +![1753433295046](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753433295046.png) + +并进入配置文件选择所有功能 + +![1753433797185](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753433797185.png) + +然后退出保存,编译运行,对应功能可在pakges目录下的相应软件包目录下的remadme.md中查看。 + +![1753433876655](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753433876655.png) + +我们演示以下NTP功能和PING功能如下(图一的PIN运行结果是有点小问题原因是之前没有修改tcp/ip协议栈大小,剩余资源不够,正确运行结果一个如图二) + +![1753433960461](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753433960461.png) + +![1753434035985](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753434035985.png) + +##### 3.2.2.1 实践2:MQTT连接实践 + +MQTT在物联网中的作用就不需要多说了,话不多说,直接上操作,首先下载安装一下MQTTX工具https://mqttx.app/zh/downloads + +![1753434233532](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753434233532.png) + +然后创建服务器id,用户名,密码全为rtthread,然后连接。 +![1753434291084](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753434291084.png) + +输入`menuconfig`选择mqtt软件包。 + +![1753434532474](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753434532474.png) + +进入配置填写配置项如下 + +![1753434579704](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753434579704.png) + +然后编译运行代码,输入ka_mqtt启动例程 + +![1753434619402](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753434619402.png) + +订阅rtt-pub主题并且像rtt-sub发布消息 + +![1753434757421](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753434757421.png) + +终端输出消息如下 + +![1753434837756](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753434837756.png) + +## 4.课后作业 + +![1753434944991](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753434944991.png) + +根据作业要求我们来查看以下源代码mqtt_test源代码 + +![1753435761949](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753435761949.png) + +我们发现其中有两个函数其中绿色框是pub发布函数每四秒会调用一次用于像mqtt服务器上报数据,而红色框是sub订阅函数 会打印服务器下发的消息那么,现在我们需要做的工具就是将pub函数中的内容替换成JSON格式并加入我们想要的字段即可。 +添加如下代码并修改pub函数 + +``` +#ifndef PUB_NAME +#define PUB_NAME "XiyaoMa" +#endif +#ifndef PUB_STUDY +#define PUB_STUDY "keep up the good work" +#endif + + +//······· +//其余代码不变 +//······· + +static int mqtt_publish_handle1(mqtt_client_t *client) +{ + mqtt_message_t msg; + memset(&msg, 0, sizeof(msg)); + msg.qos = QOS0; +// 拼接修改后的JSON字符串(修正语法并调整键值对) +static const char *json_data = "{" \ + "\"name\": \"" PUB_NAME "\"," \ + "\"study\": \""PUB_STUDY "\"" +"}"; + // 赋值给msg.payload + msg.payload = (void *)json_data; + msg.payloadlen = strlen(json_data); + return mqtt_publish(client, KAWAII_MQTT_PUBTOPIC, &msg); +} + +``` + +![1753436918726](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753436918726.png) + +然后编译先测试以下康康,是否正确。编译运行并打开MQTTX查看没有任何问题。 + +![1753437251330](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753437251330.png) + +那么接下来我们就需要解决Kconfig语法配置name字段和study的字段问题啦,这里我们九二一把这个Kconfig配置放到driver目录下的Kconfig中也是可以的,因为我们只是用于实验,之研究语法所以不用刻意去设置,当然也可以参考我在上面讲到的操作将田间一个Kconfig文件然后将其纳入最外层Kconfig文件的搜索路径中,不过这里我想带大家尝试第三种就是直接修改我们下载的软件包中的Kconfig也可以让大家对软件包的开发有点感觉。 + +我们进入env工具的packegs目录下可以看到里面有一个Kconfig文件![1753437819390](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753437819390.png) + +可以打开看一眼就只有语句,意思是将当前目录下的packegs目录下的Kconfig目录纳入搜索路径 + +![1753437896787](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753437896787.png) + +进入packegs目录下可以看到里面还有一个Kconfig文件而当前目录下就是存放了我们之前所选择 的软件包的种类目录,那不用看也知道这个Kconfig是包含了不同中种类目录下的Kconfig文件,然后不同种类下的Kconfig文件又包含了具体软件包的Kconfig文件(俄罗斯套娃)那我们直接找到kawai_mqtt软件包的Kconfig文件打开。 + +![1753438404962](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753438404962.png) + +在里面的使能test中添加如下代码然后保存 + +``` + config PUB_NAME + string "name" + default "xiaoming" + config PUB_STUDY + string "study" + default "Keep" +``` + +![1753438678985](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753438678985.png) + +输入`menuconfig`打开配置界面找到mqtt软件包的配置发现我们添加的代码已经生效。 + +![1753439026038](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753439026038.png) + +按后修改以以下这两个字段和我们上面宏定义相同 + +![1753439249021](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753439249021.png) + +然后退出保存。到rtconfig.h中查看配置配置是否生效 + +![1753439354314](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753439354314.png) + +然后编译运行,输入ka_mqtt启动,然后打开MQTTX查看运行结果和终端输出如下 + +![1753439709966](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753439709966.png) + +![1753439818566](images/【RSOC25】Day5课程笔记:组件与软件包及构建系统/1753439818566.png)