diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day2.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day2.c" new file mode 100644 index 0000000000000000000000000000000000000000..841f4d02496ad092062da1857336c6cdd5f7a395 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day2.c" @@ -0,0 +1,99 @@ +#include +#include +#include + +/* defined the LED0 pin: PF9 */ +#define LED0_PIN GET_PIN(F, 9) + +#define THREAD_PRIORITY_1 20 // 低优先级 +#define THREAD_PRIORITY_2 15 // 中优先级 +#define THREAD_PRIORITY_3 10 // 高优先级 +#define THREAD_STACK_SIZE 512 +#define THREAD_TIMESLICE 10 +//线程1入口函数 +void thread1_entry(void) +{ + int count = 0; + + while (1) + { + rt_kprintf("thread1 running\n"); + rt_thread_mdelay(100); + } +} +//线程2入口函数 +void thread2_entry(void) +{ + int count = 0; + while (1) + { + rt_kprintf("thread2 running\n"); + if (count % 5 == 0) + { + rt_thread_mdelay(50); + } + } +} +//线程3入口函数 +void thread3_entry(void) +{ + int count = 0; + while (1) + { + rt_kprintf("thread3 running\n"); + rt_thread_mdelay(50); + } +} + +int main(void) +{ + rt_thread_t tid1, tid2, tid3; + // 创建线程1 + tid1 = rt_thread_create("thread1", + thread1_entry, + RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY_1, + THREAD_TIMESLICE); + // 创建线程2 + tid2 = rt_thread_create("thread2", + thread2_entry, + RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY_2, + THREAD_TIMESLICE); + // 创建线程3 + tid3 = rt_thread_create("thread3", + thread3_entry, + RT_NULL, + THREAD_STACK_SIZE, + THREAD_PRIORITY_3, + THREAD_TIMESLICE); + // 如果线程创建成功,则启动线程 + if (tid1 != RT_NULL) + rt_thread_startup(tid1); + + if (tid2 != RT_NULL) + rt_thread_startup(tid2); + + if (tid3 != RT_NULL) + rt_thread_startup(tid3); + + return 0; + + + +// int count = 1; +// /* set LED0 pin mode to output */ +// rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); +// +// while (count++) +// { +// rt_pin_write(LED0_PIN, PIN_HIGH); +// rt_thread_mdelay(500); +// rt_pin_write(LED0_PIN, PIN_LOW); +// rt_thread_mdelay(500); +// } +// +// return RT_EOK; +} \ No newline at end of file diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-1.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-1.c" new file mode 100644 index 0000000000000000000000000000000000000000..3f2beb06bacb7e7589c33def2c485d2b868129b9 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-1.c" @@ -0,0 +1,48 @@ +//第一个: 信号量 +#include + +// 信号量控制块 +static struct rt_semaphore sem; + +//线程1:发送信号量 +static void thread1_entry(void *param) +{ + int count = 0; + while (1) + { + rt_thread_mdelay(1000); + count++; + rt_kprintf("Thread1: Send signal %d\n", count); + rt_sem_release(&sem); // 释放信号量 + } +} + +// 线程2:等待信号量 +static void thread2_entry(void *param) +{ + while (1) + { + rt_sem_take(&sem, RT_WAITING_FOREVER); + rt_kprintf("Thread2: Receive signal\n"); + } +} + +int main(void) +{ + // 初始化信号量 + rt_sem_init(&sem, "sem", 0, RT_IPC_FLAG_FIFO); + + // 创建并启动线程 + rt_thread_t t1 = rt_thread_create("t1", thread1_entry, RT_NULL, 512, 8, 10); + rt_thread_t t2 = rt_thread_create("t2", thread2_entry, RT_NULL, 512, 8, 10); + if (t1) rt_thread_startup(t1); + if (t2) rt_thread_startup(t2); + + while (1) + { + rt_thread_mdelay(1000); + } + return 0; +} + + diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-2.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-2.c" new file mode 100644 index 0000000000000000000000000000000000000000..cc6fab56f6e4f3b990bfe124ecb9bdec5c45ec2e --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-2.c" @@ -0,0 +1,57 @@ +//互斥量 +#include + +static struct rt_mutex mutex; +static int shared_counter = 0; + +//线程1入口函数 +static void thread1_entry(void *param) +{ + while (1) + { + // 获取互斥量 + rt_mutex_take(&mutex, RT_WAITING_FOREVER); + shared_counter++; + rt_kprintf("Thread1: Counter = %d\n", shared_counter); + rt_mutex_release(&mutex); + rt_thread_mdelay(500); + } +} + +// 线程2入口函数 +static void thread2_entry(void *param) +{ + while (1) + { + //获取互斥量 + rt_mutex_take(&mutex, RT_WAITING_FOREVER); + shared_counter++; + rt_kprintf("Thread2: Counter = %d\n", shared_counter); + rt_mutex_release(&mutex); + rt_thread_mdelay(700); + } +} + +int main(void) +{ + rt_thread_t t1, t2; + + //初始化互斥量 + rt_mutex_init(&mutex, "mutex", RT_IPC_FLAG_FIFO); + + //创建线程1 + t1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 8, 10); + if (t1 != RT_NULL) + rt_thread_startup(t1); + + //创建线程2 + t2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 512, 8, 10); + if (t2 != RT_NULL) + rt_thread_startup(t2); + + while (1) + { + rt_thread_mdelay(1000); + } + return 0; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-3.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-3.c" new file mode 100644 index 0000000000000000000000000000000000000000..81c4db9b42cf0085952779faaa5843dc2e95a8de --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-3.c" @@ -0,0 +1,72 @@ +//事件集 +#include + +static struct rt_event event; + +#define EVENT_FLAG1 (1 << 0) // 事件标志1 +#define EVENT_FLAG2 (1 << 1) // 事件标志2 + +//线程1:等待事件 +static void thread1_entry(void *param) +{ + rt_uint32_t a; + + while (1) + { + // 等待事件:等待标志1或标志2 + rt_event_recv(&event, + EVENT_FLAG1 | EVENT_FLAG2, + RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, // 逻辑或,接收后清除标志 + RT_WAITING_FOREVER, // 永久等待 + &a); // 接收的事件 + + if (a & EVENT_FLAG1) + rt_kprintf("Thread1: Received EVENT_FLAG1\n"); + if (a & EVENT_FLAG2) + rt_kprintf("Thread1: Received EVENT_FLAG2\n"); + + rt_thread_mdelay(100); + } +} +//线程2:发送事件 +static void thread2_entry(void *param) +{ + int count = 0; + while (1) + { + count++; + if (count % 2 == 0) + { + rt_event_send(&event, EVENT_FLAG1); + rt_kprintf("Thread2: Send event1\n"); + } + else + { + rt_event_send(&event, EVENT_FLAG2); + rt_kprintf("Thread2: Send event2\n"); + } + rt_thread_mdelay(1000); + } +} + +int main(void) +{ + rt_thread_t t1, t2; + rt_event_init(&event, "event", RT_IPC_FLAG_FIFO); + + //创建线程1 + t1 = rt_thread_create("thread1", thread1_entry, RT_NULL, 512, 8, 10); + if (t1 != RT_NULL) + rt_thread_startup(t1); + + //创建线程2 + t2 = rt_thread_create("thread2", thread2_entry, RT_NULL, 512, 8, 10); + if (t2 != RT_NULL) + rt_thread_startup(t2); + + while (1) + { + rt_thread_mdelay(1000); + } + return 0; +} \ No newline at end of file diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-4.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-4.c" new file mode 100644 index 0000000000000000000000000000000000000000..775366639b44228b0f68343a9e394e46eecce50c --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-4.c" @@ -0,0 +1,77 @@ +//邮箱 +#include +#include // 包含NULL定义的头文件 + +static struct rt_mailbox mb; + +static char mb_pool[4 * sizeof(rt_uint32_t)]; + +// 线程1:发送邮件 +static void sender_thread_entry(void *param) +{ + rt_uint32_t mail = 0; + + while (1) + { + mail++; + rt_mb_send(&mb, mail); + rt_kprintf("Sender: Send mail %d\n", mail); + rt_thread_mdelay(1000); + } +} +//线程2:接收邮件 +static void receiver_thread_entry(void *param) +{ + rt_err_t result; + rt_uint32_t mail; + + while (1) + { + result = rt_mb_recv(&mb, &mail, RT_WAITING_FOREVER); + if (result == RT_EOK) + { + rt_kprintf("Receiver: Get mail %d\n", mail); + } + else + { + rt_kprintf("Receiver: Receive mail failed\n"); + } + } +} +int main(void) +{ + rt_thread_t sender_tid, receiver_tid; + + rt_mb_init(&mb, + "mb", // 邮箱名称 + &mb_pool[0], + sizeof(mb_pool)/sizeof(rt_uint32_t), + RT_IPC_FLAG_FIFO); + + sender_tid = rt_thread_create("sender", + sender_thread_entry, + RT_NULL, + 512, + 8, + 10); + if (sender_tid != RT_NULL) + { + rt_thread_startup(sender_tid); + } + //创建接收者线程 + receiver_tid = rt_thread_create("receiver", + receiver_thread_entry, + RT_NULL, + 512, + 8, + 10); + if (receiver_tid != RT_NULL) + { + rt_thread_startup(receiver_tid); + } + while (1) + { + rt_thread_mdelay(1000); + } + return 0; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-5.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-5.c" new file mode 100644 index 0000000000000000000000000000000000000000..1ee2d031e48eb752930851e19fbe0a085eb25a4b --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-5.c" @@ -0,0 +1,55 @@ +#include + +#ifndef RT_VERSION_CHECK +#define RT_VERSION_CHECK(major, minor, patch) ((major)*10000 + (minor)*100 + (patch)) +#endif +// 消息结构体 +struct msg_data { + rt_uint8_t type; + rt_uint32_t value; +}; +// 全局变量:消息队列和缓冲区 +static struct rt_messagequeue mq; +static rt_uint8_t msg_pool[2048]; +// 发送线程 +static void sender_thread(void *param) { + struct msg_data msg = {0, 0}; + while (1) { + // 循环生成消息类型,递增消息值 + msg.type = msg.value % 3; + msg.value++; + // 发送消息 + rt_mq_send(&mq, &msg, sizeof(msg)); + rt_kprintf("Send: type=%d, value=%d\n", msg.type, msg.value); + + rt_thread_mdelay(1000); + } +} +// 接收线程 +static void receiver_thread(void *param) { + struct msg_data msg; + while (1) { + // 接收消息 + if (rt_mq_recv(&mq, &msg, sizeof(msg), RT_WAITING_FOREVER) == RT_EOK) { + rt_kprintf("Recv: type=%d, value=%d\n", msg.type, msg.value); + } + } +} +int main(void) { + // 初始化消息队列 + if (rt_mq_init(&mq, "mq", msg_pool, sizeof(struct msg_data), + sizeof(msg_pool), RT_IPC_FLAG_FIFO) != RT_EOK) { + rt_kprintf("消息队列初始化失败!\n"); + return -1; + } + // 创建并启动线程 + rt_thread_t tid; + tid = rt_thread_create("sender", sender_thread, RT_NULL, 512, 8, 10); + if (tid) rt_thread_startup(tid); + + tid = rt_thread_create("receiver", receiver_thread, RT_NULL, 512, 8, 10); + if (tid) rt_thread_startup(tid); + + while (1) rt_thread_mdelay(1000); + return 0; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-6.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-6.c" new file mode 100644 index 0000000000000000000000000000000000000000..154e9e86bbbebc03ef337def71bd377bbcbc4a46 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day3-6.c" @@ -0,0 +1,87 @@ +//信号 +#include + +#define SIGNAL_USER1 SIGUSR1 // 自定义信号1 +#define SIGNAL_USER2 SIGUSR2 //自定义信号2 + +static rt_thread_t signal_thread; + +static void signal_handler(int signo) +{ + switch (signo) + { + case SIGNAL_USER1: + rt_kprintf("Received SIGNAL_USER1\n"); + break; + case SIGNAL_USER2: + rt_kprintf("Received SIGNAL_USER2\n"); + break; + default: + rt_kprintf("Received unknown signal: %d\n", signo); + break; + } +} +//接收信号的线程入口函数 +static void signal_thread_entry(void *param) +{ + rt_kprintf("Signal thread started, waiting for signals...\n"); + + while (1) + { + rt_thread_mdelay(1000); // 模拟线程正常工作 + } +} +// 发送信号的线程入口函数 +static void sender_thread_entry(void *param) +{ + int count = 0; + + while (1) + { + count++; + if (count % 2 == 0) + { + rt_kprintf("Sending SIGNAL_USER1...\n"); + rt_thread_kill(signal_thread, SIGNAL_USER1); // 发送信号1 + } + else + { + rt_kprintf("Sending SIGNAL_USER2...\n"); + rt_thread_kill(signal_thread, SIGNAL_USER2); // 发送信号2 + } + + rt_thread_mdelay(2000); // 每2秒发送一次 + } +} +int main(void) +{ + // 创建接收信号的线程 + signal_thread = rt_thread_create("sig_thread", + signal_thread_entry, + RT_NULL, + 512, + 8, + 10); + if (signal_thread != RT_NULL) + { + // 为线程安装信号处理函数 + rt_signal_install(signal_thread, signal_handler); + rt_thread_startup(signal_thread); + } + // 创建发送信号的线程 + rt_thread_t sender_tid = rt_thread_create("sender", + sender_thread_entry, + RT_NULL, + 512, + 8, + 10); + if (sender_tid != RT_NULL) + { + rt_thread_startup(sender_tid); + } + while (1) + { + rt_thread_mdelay(1000); + } + return 0; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-1.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-1.c" new file mode 100644 index 0000000000000000000000000000000000000000..c31e9a19c32ad84a03ab529b1e290108f803d40e --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-1.c" @@ -0,0 +1,32 @@ +#include +#include "th_frame.h" + +static void th_thread_entry(void *parameter) +{ + const th_ops_t *ops = th_get_ops("vir_th"); + th_data_t data; + + if (!ops || ops->init() != RT_EOK) + { + rt_kprintf("th device init failed\n"); + return; + } + + while (1) + { + if (ops->read(&data) == RT_EOK) + { + rt_kprintf("T:%.1f℃, H:%.1f%%\n", data.temp, data.humi); + } + rt_thread_mdelay(2000); + } +} + +int main(void) +{ + rt_thread_t tid = rt_thread_create("th", th_thread_entry, + RT_NULL, 512, 25, 5); + if (tid) rt_thread_startup(tid); + + return 0; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-2.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-2.c" new file mode 100644 index 0000000000000000000000000000000000000000..ce1ac138e30ffed1bb6e475b01cb7acd0b8318e3 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-2.c" @@ -0,0 +1,42 @@ +#include "th_frame.h" +#include + +#define MAX_DEVICES 5 + +// 设备结构体 +typedef struct { + char name[32]; + const th_ops_t *ops; +} th_device_t; + +// 设备列表 +static th_device_t th_devices[MAX_DEVICES] = {0}; + +// 注册设备 +void th_register(const char *name, const th_ops_t *ops) +{ + rt_base_t i; + for (i = 0; i < MAX_DEVICES; i++) + { + if (!th_devices[i].ops) + { + rt_strncpy(th_devices[i].name, name, sizeof(th_devices[i].name) - 1); + th_devices[i].ops = ops; + break; + } + } +} + +// 获取设备操作接口 +const th_ops_t *th_get_ops(const char *name) +{ + rt_base_t i; + for (i = 0; i < MAX_DEVICES; i++) + { + if (th_devices[i].ops && rt_strcmp(th_devices[i].name, name) == 0) + { + return th_devices[i].ops; + } + } + return RT_NULL; +} diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-3.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-3.c" new file mode 100644 index 0000000000000000000000000000000000000000..deed34c0f3fb7e6c363b593f6764a74b3ffdb277 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-3.c" @@ -0,0 +1,25 @@ +#ifndef __TH_FRAME_H__ +#define __TH_FRAME_H__ + +#include + +// 温湿度数据结构 +typedef struct { + float temp; // 温度(℃) + float humi; // 湿度(%) +} th_data_t; + +// 设备操作接口 +typedef struct { + rt_err_t (*init)(void); + rt_err_t (*read)(th_data_t *data); + rt_err_t (*deinit)(void); +} th_ops_t; + +// 注册设备 +void th_register(const char *name, const th_ops_t *ops); + +// 获取设备操作接口 +const th_ops_t *th_get_ops(const char *name); + +#endif diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-4.c" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-4.c" new file mode 100644 index 0000000000000000000000000000000000000000..b071a5d6d0a648d1451eaaec71abd1628df9c82a --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day4-4.c" @@ -0,0 +1,35 @@ +#include "th_frame.h" +#include + +static rt_err_t vir_init(void) +{ + rt_kprintf("virtual th device init\n"); + return RT_EOK; +} + +static rt_err_t vir_read(th_data_t *data) +{ + // 模拟温湿度数据 + data->temp = 25.0 + (rand() % 100) / 10.0; // 25.0-35.0℃ + data->humi = 40.0 + (rand() % 400) / 10.0; // 40.0-80.0% + return RT_EOK; +} + +static rt_err_t vir_deinit(void) +{ + return RT_EOK; +} + +static const th_ops_t vir_th_ops = { + .init = vir_init, + .read = vir_read, + .deinit = vir_deinit +}; + +// 注册设备 +int vir_th_init(void) +{ + th_register("vir_th", &vir_th_ops); + return RT_EOK; +} +INIT_APP_EXPORT(vir_th_init); diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day5.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day5.md" new file mode 100644 index 0000000000000000000000000000000000000000..9b35dfd324659919ef45dda9af5bda216af81d2e --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/day5.md" @@ -0,0 +1 @@ +![alt text](<屏幕截图 2025-08-03 021557.png>) ![alt text](<屏幕截图 2025-08-03 021538.png>) ![alt text](<屏幕截图 2025-08-03 021415.png>) ![alt text](<屏幕截图 2025-08-02 235209.png>) \ No newline at end of file diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-02 235209.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-02 235209.png" new file mode 100644 index 0000000000000000000000000000000000000000..3c62f96c0cef1d80834661eb19360be12af7b3d6 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-02 235209.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-03 021415.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-03 021415.png" new file mode 100644 index 0000000000000000000000000000000000000000..2321960821ee815a11728ab18cc9c74a1a51cc87 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-03 021415.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-03 021538.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-03 021538.png" new file mode 100644 index 0000000000000000000000000000000000000000..f0f8163ab5ab2891376305856940435056457a77 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-03 021538.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-03 021557.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-03 021557.png" new file mode 100644 index 0000000000000000000000000000000000000000..0d00f9648197ddac2253057abff50e5adff2d2aa Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\344\275\234\344\270\232/\345\261\217\345\271\225\346\210\252\345\233\276 2025-08-03 021557.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day1.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day1.md" new file mode 100644 index 0000000000000000000000000000000000000000..962118aaadd7cb25aaf5f4f039678fb08fb25079 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day1.md" @@ -0,0 +1,27 @@ +环境搭建核心步骤 +安装 Git:用于拉取 RT-Thread 代码仓库(支持 GitHub 或国内镜像)。https://https://git-scm.com/ 选择合适版本安装 + +配置 ENV 工具:用于构建与配置 RT-Thread,需注册到系统(右键文件夹可直接打开),通过pkgs --update更新软件包。使用官网的安装包安装 + +安装 VS Code:用于代码编辑,右键文件夹可通过 VS Code 打开进行代码修改。 +代码拉取与编 +拉取代码:通过 Git 克隆 RT-Thread 仓库(git clone [https://gitee.com/rtthread/rt-thread.git])。 +编译步骤:进入 BSP(开发板支持包)目录 +右键打开 ENV,输入menuconfig配置(首次直接保存) +再输入scons -j4(根据线程数调整)编译,生成 ELF 文件后可通过终端运行。 + +新增文件 / 目录时,需创建SConscript脚本(定义编译规则),确保新文件被纳入构建系统,可通过递归搜索或直接指定文件路径实现。 + +git上传 +git init 初始化 +git status 查看当前管理文件的状态 +git add 添加要管理的文件 +git add . 暂存 +git commit -m 把文件提交到仓库 +git log 查看历史记录 +git branch 创建分支 +git checkout <分支名> 切换分支 +git remote add origin 《地址》添加存储仓库 +git push origin master 把本地仓库推到远程存储仓库中 + + diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day2.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day2.md" new file mode 100644 index 0000000000000000000000000000000000000000..43583f463482f75f7549e0c5d81f8fe62e7b3304 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day2.md" @@ -0,0 +1,58 @@ +rt thread内核入门 + RT-thread启动流程:rtthread_startup() 函数是 RT-Thread 规定的统一启动入口,所以一般执行顺序是:系统先从启动文件开始运行,然后进入 RT-Thread 的启动函数 rtthread_startup() ,最后进入用户入口函数 main()。 + ![alt text](image-1.png) + 为了在进入 main() 之前完成 RT-Thread 系统功能初始化,我们使用了 MDK 的扩展功能 $Sub$$ 和 $Super$$。可以给 main 添加 $Sub$$ 的前缀符号作为一个新功能函数 $Sub$$main,这个 $Sub$$main 可以先调用一些要补充在 main 之前的功能函数(这里添加 RT-Thread 系统启动,进行系统一系列初始化),再调用 $Super$$main 转到 main() 函数执行,这样可以让用户不用去管 main() 之前的系统初始化操作。 + /* $Sub$$main 函数 */ +int $Sub$$main(void) +{ + rtthread_startup(); + return 0; +} +在这里 $Sub$$main 函数调用了 rtthread_startup() 函数,其中 rtthread_startup() 函数的代码如下所示: +![alt text]({42EEAFD0-2927-49DB-8DF5-9289A90007F0}.png) + +启动代码,大致可以分为四个部分: +(1)初始化硬件; +(2)初始化系统内核对象,例如定时器、调度器、信号; +(3)创建 main 线程,在 main 线程中对各类模块依次进行初始化; +(4)初始化定时器线程、空闲线程,并启动调度器。 +启动调度器之前,系统所创建的线程在执行 rt_thread_startup() 后并不会立马运行,它们会处于就绪状态等待系统调度;待启动调度器之后,系统才转入第一个线程开始运行,根据调度规则,选择的是就绪队列中优先级最高的线程。 + +rt_hw_board_init() 中完成系统时钟设置,为系统提供心跳、串口初始化,将系统输入输出终端绑定到这个串口,后续系统运行信息就会从串口打印出来。 + +main() 函数是 RT-Thread 的用户代码入口,用户可以在 main() 函数里添加自己的应用。 + +线程的工作机制 +线程控制块 +在 RT-Thread 中,线程控制块由结构体 struct rt_thread 表示,线程控制块是操作系统用于管理线程的一个数据结构,它会存放线程的一些信息,例如优先级、线程名称、线程状态等,也包含线程与线程之间连接用的链表结构,线程等待事件集合等。 +其中 init_priority 是线程创建时指定的线程优先级,在线程运行过程当中是不会被改变的(除非用户执行线程控制函数进行手动调整线程优先级)。cleanup 会在线程退出时,被空闲线程回调一次以执行用户设置的清理现场等工作。最后的一个成员 user_data 可由用户挂接一些数据信息到线程控制块中,以提供一种类似线程私有数据的实现方式 +线程状态切换 +![alt text](image.png) +线程通过调用函数 rt_thread_create/init() 进入到初始状态(RT_THREAD_INIT);初始状态的线程通过调用函数 rt_thread_startup() 进入到就绪状态(RT_THREAD_READY);就绪状态的线程被调度器调度后进入运行状态(RT_THREAD_RUNNING);当处于运行状态的线程调用 rt_thread_delay(),rt_sem_take(),rt_mutex_take(),rt_mb_recv() 等函数或者获取不到资源时,将进入到挂起状态(RT_THREAD_SUSPEND);处于挂起状态的线程,如果等待超时依然未能获得资源或由于其他线程释放了资源,那么它将返回到就绪状态。挂起状态的线程,如果调用 rt_thread_delete/detach() 函数,将更改为关闭状态(RT_THREAD_CLOSE);而运行状态的线程,如果运行结束,就会在线程的最后部分执行 rt_thread_exit() 函数,将状态更改为关闭状态。 + +线程管理方式 +![alt text](image-2.png) +线程创建 rt_thread_create() 的参数和返回值见下表: +![alt text]({5981996A-A6F9-479E-AB3F-CCFAD7D3CC4E}.png) +线程初始化接口 rt_thread_init() 的参数和返回值见下表: +![alt text]({4D5B7518-BCB5-486F-8D0F-8734781669B1}.png) + +调度器工作 +![alt text]({CDB819F2-29BE-4306-B093-8B7E3A6C9628}.png) + +优先级抢占调度 +![alt text]({96BE737A-B681-4595-891F-CA1A636EE12D}.png) + +启动线程 +创建(初始化)的线程状态处于初始状态,并未进入就绪线程的调度队列,我们可以在线程初始化 / 创建成功后调用下面的函数接口让该线程进入就绪态: +rt_err_t rt_thread_startup(rt_thread_t thread); +当调用这个函数时,将把线程的状态更改为就绪状态,并放到相应优先级队列中等待调度。如果新启动的线程优先级比当前线程优先级高,将立刻切换到这个线程。 + +获得当前线程 +在程序的运行过程中,相同的一段代码可能会被多个线程执行,在执行的时候可以通过下面的函数接口获得当前执行的线程句柄: +rt_thread_t rt_thread_self(void); + +挂起和恢复线程 +当线程调用 rt_thread_delay() 时,线程将主动挂起;当调用 rt_sem_take(),rt_mb_recv() 等函数时,资源不可使用也将导致线程挂起。处于挂起状态的线程,如果其等待的资源超时(超过其设定的等待时间),那么该线程将不再等待这些资源,并返回到就绪状态;或者,当其他线程释放掉该线程所等待的资源时,该线程也会返回到就绪状态。 + +注:一个线程尝试挂起另一个线程是一个非常危险的行为,因此RT-Thread对此函数有严格的使用限制:该函数只能使用来挂起当前线程(即自己挂起自己),不可以在线程A中尝试挂起线程B。而且在挂起线程自己后,需要立刻调用 rt_schedule() 函数进行手动的线程上下文切换。这是因为A线程在尝试挂起B线程时,A线程并不清楚B线程正在运行什么程序,一旦B线程正在使用例如互斥量、信号量等影响、阻塞其他线程(如C线程)的内核对象,如果此时其他线程也在等待这个内核对象,那么A线程尝试挂起B线程的操作将会引发其他线程(如C线程)的饥饿,严重危及系统的实时性。 diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day3.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day3.md" new file mode 100644 index 0000000000000000000000000000000000000000..5700e7c4748df0cca9d214c22bfb00fc6c0ffdf0 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day3.md" @@ -0,0 +1,94 @@ +线程同步 +![alt text](image-3.png) + +线程同步的核心方式是在访问临界区的时候只允许一个 (或一类) 线程运行。 + +信号量 +以停车为例,管理员相当于信号量,管理员手中空车位的个数就是信号量的值(非负数,动态变化);停车位相当于公共资源(临界区),车辆相当于线程。车辆通过获得管理员的允许取得停车位,就类似于线程通过获得信号量访问公共资源。 + +信号量工作机制 +![alt text](image-4.png) + +信号量控制块 +在 RT-Thread 中,信号量控制块是操作系统用于管理信号量的一个数据结构,由结构体 struct rt_semaphore 表示。另外一种 C 表达方式 rt_sem_t,表示的是信号量的句柄,在 C 语言中的实现是指向信号量控制块的指针。信号量控制块结构的详细定义如下: +struct rt_semaphore +{ + struct rt_ipc_object parent; /* 继承自 ipc_object 类 */ + rt_uint16_t value; /* 信号量的值 */ +}; +/* rt_sem_t 是指向 semaphore 结构体的指针类型 */ +typedef struct rt_semaphore* rt_sem_t; + +信号量的管理方式 +信号量控制块中含有信号量相关的重要参数,在信号量各种状态间起到纽带的作用。信号量相关接口如下图所示,对一个信号量的操作包含:创建 / 初始化信号量、获取信号量、释放信号量、删除 / 脱离信号量。 +![alt text](image-5.png) + +创建和删除信号量 +当创建一个信号量时,内核首先创建一个信号量控制块,然后对该控制块进行基本的初始化工作,创建信号量使用下面的函数接口: + rt_sem_t rt_sem_create(const char *name, + rt_uint32_t value, + rt_uint8_t flag); + +当调用这个函数时,系统将先从对象管理器中分配一个 semaphore 对象,并初始化这个对象,然后初始化父类 IPC 对象以及与 semaphore 相关的部分。在创建信号量指定的参数中,信号量标志参数决定了当信号量不可用时,多个线程等待的排队方式。当选择 RT_IPC_FLAG_FIFO(先进先出)方式时,那么等待线程队列将按照先进先出的方式排队,先进入的线程将先获得等待的信号量;当选择 RT_IPC_FLAG_PRIO(优先级等待)方式时,等待线程队列将按照优先级进行排队,优先级高的等待线程将先获得等待的信号量。 +RT_IPC_FLAG_FIFO 属于非实时调度方式,除非应用程序非常在意先来后到,并且你清楚地明白所有涉及到该信号量的线程都将会变为非实时线程,方可使用 RT_IPC_FLAG_FIFO,否则建议采用 RT_IPC_FLAG_PRIO,即确保线程的实时性。 + +互斥量 +互斥量又叫相互排斥的信号量,是一种特殊的二值信号量。互斥量类似于只有一个车位的停车场:当有一辆车进入的时候,将停车场大门锁住,其他车辆在外面等候。当里面的车出来时,将停车场大门打开,下一辆车才可以进入。 + +互斥量工作机制 +互斥量和信号量不同的是:拥有互斥量的线程拥有互斥量的所有权,互斥量支持递归访问且能防止线程优先级翻转;并且互斥量只能由持有线程释放,而信号量则可以由任何线程释放。 + +互斥量的状态只有两种,开锁或闭锁(两种状态值)。当有线程持有它时,互斥量处于闭锁状态,由这个线程获得它的所有权。相反,当这个线程释放它时,将对互斥量进行开锁,失去它的所有权。当一个线程持有互斥量时,其他线程将不能够对它进行开锁或持有它,持有该互斥量的线程也能够再次获得这个锁而不被挂起,如下图时所示。这个特性与一般的二值信号量有很大的不同:在信号量中,因为已经不存在实例,线程递归持有会发生主动挂起(最终形成死锁)。 +![alt text](image-6.png) + + +互斥量控制块 +在 RT-Thread 中,互斥量控制块是操作系统用于管理互斥量的一个数据结构,由结构体 struct rt_mutex 表示。另外一种 C 表达方式 rt_mutex_t,表示的是互斥量的句柄,在 C 语言中的实现是指互斥量控制块的指针。互斥量控制块结构的详细定义请见以下代码: +struct rt_mutex + { + struct rt_ipc_object parent; /* 继承自 ipc_object 类 */ + + rt_uint16_t value; /* 互斥量的值 */ + rt_uint8_t original_priority; /* 持有线程的原始优先级 */ + rt_uint8_t hold; /* 持有线程的持有次数 */ + struct rt_thread *owner; /* 当前拥有互斥量的线程 */ + }; + /* rt_mutext_t 为指向互斥量结构体的指针类型 */ + typedef struct rt_mutex* rt_mutex_t; + +互斥量的管理方式 +![alt text](image-7.png) + +事件集 +事件集也是线程间同步的机制之一,一个事件集可以包含多个事件,利用事件集可以完成一对多,多对多的线程间同步。 + +事件集的使用场合 +事件集可使用于多种场合,它能够在一定程度上替代信号量,用于线程间同步。一个线程或中断服务例程发送一个事件给事件集对象,而后等待的线程被唤醒并对相应的事件进行处理。但是它与信号量不同的是,事件的发送操作在事件未清除前,是不可累计的,而信号量的释放动作是累计的。事件的另一个特性是,接收线程可等待多种事件,即多个事件对应一个线程或多个线程。同时按照线程等待的参数,可选择是 “逻辑或” 触发还是 “逻辑与” 触发。这个特性也是信号量等所不具备的,信号量只能识别单一的释放动作,而不能同时等待多种类型的释放。如下图所示为多事件接收示意图: +![alt text](image-8.png) + +线程间通信 +在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取,根据读取到的全局变量值执行相应的动作,达到通信协作的目的。 + +邮箱 +邮箱服务是实时操作系统中一种典型的线程间通信方法。举一个简单的例子,有两个线程,线程 1 检测按键状态并发送,线程 2 读取按键状态并根据按键的状态相应地改变 LED 的亮灭。这里就可以使用邮箱的方式进行通信,线程 1 将按键的状态作为邮件发送到邮箱,线程 2 在邮箱中读取邮件获得按键状态并对 LED 执行亮灭操作。 + +这里的线程 1 也可以扩展为多个线程。例如,共有三个线程,线程 1 检测并发送按键状态,线程 2 检测并发送 ADC 采样信息,线程 3 则根据接收的信息类型不同,执行不同的操作。 + +邮箱的工作机制 +RT-Thread 操作系统的邮箱用于线程间通信,特点是开销比较低,效率较高。邮箱中的每一封邮件只能容纳固定的 4 字节内容。 +![alt text](image-9.png) + +邮箱控制块结构 +struct rt_mailbox +{ + struct rt_ipc_object parent; + + rt_uint32_t* msg_pool; /* 邮箱缓冲区的开始地址 */ + rt_uint16_t size; /* 邮箱缓冲区的大小 */ + + rt_uint16_t entry; /* 邮箱中邮件的数目 */ + rt_uint16_t in_offset, out_offset; /* 邮箱缓冲的进出指针 */ + rt_list_t suspend_sender_thread; /* 发送线程的挂起等待队列 */ +}; +typedef struct rt_mailbox* rt_mailbox_t; + diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day4.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day4.md" new file mode 100644 index 0000000000000000000000000000000000000000..990442d0939466cd13b6bdfed3e3c575203db760 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day4.md" @@ -0,0 +1,59 @@ +I/O 设备模型框架 +RT-Thread 提供了一套简单的 I/O 设备模型框架,如下图所示,它位于硬件和应用程序之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。 +![alt text](image-10.png) + +I/O 设备管理层实现了对设备驱动程序的封装。应用程序通过图中的”I/O设备管理层”提供的标准接口访问底层设备,设备驱动程序的升级、更替不会对上层应用产生影响。这种方式使得设备的硬件操作相关的代码能够独立于应用程序而存在,双方只需关注各自的功能实现,从而降低了代码的耦合性、复杂性,提高了系统的可靠性。 + +设备驱动框架层是对同类硬件设备驱动的抽象,将不同厂家的同类硬件设备驱动中相同的部分抽取出来,将不同部分留出接口,由驱动程序实现。 + +I/O 设备模型 +RT-Thread 的设备模型是建立在内核对象模型基础之上的,设备被认为是一类对象,被纳入对象管理器的范畴。每个设备对象都是由基对象派生而来,每个具体设备都可以继承其父类对象的属性,并派生出其私有属性,下图是设备对象的继承和派生关系示意图。 +![alt text](image-11.png) + +I/O 设备类型 +RT-Thread 支持多种 I/O 设备类型,主要设备类型如下所示: +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 / 杂类设备 / + +块设备每次传输一个数据块,例如每次传输 512 个字节数据。这个数据块是硬件强制性的,数据块可能使用某类数据接口或某些强制性的传输协议,否则就可能发生错误。因此,有时块设备驱动程序对读或写操作必须执行附加的工作,如下图所示: +![alt text](image-12.png) + +创建和注册 I/O 设备 +![alt text](image-13.png) + +调用该接口时,系统会从动态堆内存中分配一个设备控制块,大小为 struct rt_device 和 attach_size 的和,设备的类型由参数 type 设定。设备被创建后,需要实现它访问硬件的操作方法。 +struct rt_device_ops +{ +/ common device interface / +rt_err_t (init) (rt_device_t dev); +rt_err_t (open) (rt_device_t dev, rt_uint16_t oflag); +rt_err_t (close) (rt_device_t dev); +rt_size_t (read) (rt_device_t dev, rt_off_t pos, void buffer, rt_size_t size); +rt_size_t (write) (rt_device_t dev, rt_off_t pos, const void buffer, rt_size_t size); +rt_err_t (control)(rt_device_t dev, int cmd, void *args); +}; + +![alt text](image-14.png) + +访问 I/O 设备 +应用程序通过 I/O 设备管理接口来访问硬件设备,当设备驱动实现后,应用程序就可以访问该硬件。I/O 设备管理接口与 I/O 设备的操作方法的映射关系下图所示: +![alt text](image-15.png) +IO框架关系调用图 +![alt text](image-16.png) +IIC总线协议 +![alt text](image-17.png) +![alt text](image-18.png) + + diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day5.md" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day5.md" new file mode 100644 index 0000000000000000000000000000000000000000..387bcdb89796e117bd102b287f8f8fc154826d68 --- /dev/null +++ "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/day5.md" @@ -0,0 +1,25 @@ +构建与配置系统介绍 +![alt text](image-19.png) + + +Kconfig工作机制 +C语言项目的裁剪配置本质上通过条件编译和宏的展开来实现的,RT-Thread借助Kconfig这套机制更方便的实现了这一功能。当前以Windows下Env工具中的使用为例,简述Kconfig在RT-Thread的工作机制。 + +Kconfig机制包括了Kconfig文件和配置UI界面(如menuconfig,pyconfig等)。Kconfig机制有如下特点: +Kconfig文件中的配置项会映射至rtconfig.h中 +Kconfig文件可以随源码分散至各级子目录,便于灵活修改。 + +当我们运行menuconfig图形化界面之后会遍历所有的kconfig文件待我们配置玩之后保存会生成新的.config文件和rtconfig.h文件。 +kconfig和scons +kconfig->.config->rtconfig.h +kconfig会生成.config文件,scons系统通过python将其变为rtconfig.h,令编译器能够编译 +kconfig的匹配关系:osource上级目录;source当前目录的子目录 + +软件包介绍 +![alt text](image-20.png) +![alt text](image-21.png) + +组件介绍 +其实组件和软件包在功能上大同小异,只不过组件的来源都是官方,而软件包来自用户,但是组件和RT-thread操作系统息息相关。 +网络组件介绍 +![alt text](image-22.png) diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-1.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-1.png" new file mode 100644 index 0000000000000000000000000000000000000000..47d980d2c81436135c3a4d5fdeddeba68820fe16 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-1.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-10.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-10.png" new file mode 100644 index 0000000000000000000000000000000000000000..d459cfac39f4a67822265d71e45c7bbfe6c7e933 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-10.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-11.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-11.png" new file mode 100644 index 0000000000000000000000000000000000000000..73b608f4e2e64cb0081e8084b1653f97e8a20a59 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-11.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-12.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-12.png" new file mode 100644 index 0000000000000000000000000000000000000000..9e6fbf25600ac6b504af19e47f5b17e1183bf5c8 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-12.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-13.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-13.png" new file mode 100644 index 0000000000000000000000000000000000000000..0418feeae3c1618c4cfcfc2e6187b2f914347769 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-13.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-14.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-14.png" new file mode 100644 index 0000000000000000000000000000000000000000..75ed2edf3010e455c965ef00306ba9b7f080436d Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-14.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-15.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-15.png" new file mode 100644 index 0000000000000000000000000000000000000000..d6da9b90a5fb4588686f115b2aa386eae8699df0 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-15.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-16.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-16.png" new file mode 100644 index 0000000000000000000000000000000000000000..9da35d35c849a6e6ea9ebbbe48448ed1a95f1b1c Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-16.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-17.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-17.png" new file mode 100644 index 0000000000000000000000000000000000000000..8addf0dd06950765d7a03aff58177ff679b0bad4 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-17.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-18.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-18.png" new file mode 100644 index 0000000000000000000000000000000000000000..8addf0dd06950765d7a03aff58177ff679b0bad4 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-18.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-19.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-19.png" new file mode 100644 index 0000000000000000000000000000000000000000..16fffc1ddf302f69a1bd187d047b42bc0731bd47 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-19.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-2.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-2.png" new file mode 100644 index 0000000000000000000000000000000000000000..86c94b884206857fa7c17b556ab19dbaed2f58ae Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-2.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-20.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-20.png" new file mode 100644 index 0000000000000000000000000000000000000000..89881e0f2f64f9622f2feed0c4c71af7d164de3e Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-20.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-21.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-21.png" new file mode 100644 index 0000000000000000000000000000000000000000..e27fa24d373b4971f0b87bc30000d2855f922a35 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-21.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-22.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-22.png" new file mode 100644 index 0000000000000000000000000000000000000000..dea0ebc9ac2b775a34897fd552a1f41842a29d7d Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-22.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-3.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-3.png" new file mode 100644 index 0000000000000000000000000000000000000000..dfe53f4dc291af79c12ae4e52713d91c5950c59c Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-3.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-4.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-4.png" new file mode 100644 index 0000000000000000000000000000000000000000..0aa12fa7976fdd3ff9755277bdeca62ee55bef1f Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-4.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-5.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-5.png" new file mode 100644 index 0000000000000000000000000000000000000000..07cb92e5b8bb7aeb3ee30524346d687720037175 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-5.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-6.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-6.png" new file mode 100644 index 0000000000000000000000000000000000000000..9ed1e3fd0bfbf6ece2d8192d0e4840b5a2a046c7 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-6.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-7.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-7.png" new file mode 100644 index 0000000000000000000000000000000000000000..606ad98e2d03515709b6eeaa6b6b607a4cd0ea16 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-7.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-8.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-8.png" new file mode 100644 index 0000000000000000000000000000000000000000..7fe19647b6faf5dbdf136594b13442433f91ec8c Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-8.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-9.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-9.png" new file mode 100644 index 0000000000000000000000000000000000000000..c155f18db438510f097f7377dd0af84aa5e3786f Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image-9.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image.png" new file mode 100644 index 0000000000000000000000000000000000000000..9b8fb40320065e264202b82b925d28456640bcb8 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/image.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{42EEAFD0-2927-49DB-8DF5-9289A90007F0}.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{42EEAFD0-2927-49DB-8DF5-9289A90007F0}.png" new file mode 100644 index 0000000000000000000000000000000000000000..7764d51227056aee066077871f32317d9d10de1d Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{42EEAFD0-2927-49DB-8DF5-9289A90007F0}.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{4D5B7518-BCB5-486F-8D0F-8734781669B1}.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{4D5B7518-BCB5-486F-8D0F-8734781669B1}.png" new file mode 100644 index 0000000000000000000000000000000000000000..79fc1ffd6efe647c02f1f81a1ab360fa987ece40 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{4D5B7518-BCB5-486F-8D0F-8734781669B1}.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{5981996A-A6F9-479E-AB3F-CCFAD7D3CC4E}.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{5981996A-A6F9-479E-AB3F-CCFAD7D3CC4E}.png" new file mode 100644 index 0000000000000000000000000000000000000000..a0b8a5f4c6d3de8128711df544b4ab9b2204e8e6 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{5981996A-A6F9-479E-AB3F-CCFAD7D3CC4E}.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{96BE737A-B681-4595-891F-CA1A636EE12D}.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{96BE737A-B681-4595-891F-CA1A636EE12D}.png" new file mode 100644 index 0000000000000000000000000000000000000000..ef6c3ae033495239e4dd9612dd3c7ec5490dc6fd Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{96BE737A-B681-4595-891F-CA1A636EE12D}.png" differ diff --git "a/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{CDB819F2-29BE-4306-B093-8B7E3A6C9628}.png" "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{CDB819F2-29BE-4306-B093-8B7E3A6C9628}.png" new file mode 100644 index 0000000000000000000000000000000000000000..2da38e51c20a834ad35a5c9acf840d591bae2ef8 Binary files /dev/null and "b/2025/\347\254\2546\347\273\204(GD32F527I-EVAL)/\351\273\204\345\244\247\346\236\227/\347\254\224\350\256\260/{CDB819F2-29BE-4306-B093-8B7E3A6C9628}.png" differ