diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day2\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\350\260\203\345\272\246/main.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day2\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\350\260\203\345\272\246/main.c" new file mode 100644 index 0000000000000000000000000000000000000000..e25408dd4cbed1cc6eae70593024416f3654dcdc --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day2\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\350\260\203\345\272\246/main.c" @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + * 2018-11-19 flybreak add stm32f407-atk-explorer bsp + */ + + #include + #include + #include + + void usr1_thread(void) + { + while(1) + { + rt_kprintf("running usr1_thread\r\n"); + } + } + void usr2_thread(void) + { + while(1) + { + rt_kprintf("running usr2_thread\r\n"); + } + } + void usr3_thread(void) + { + while(1) + { + rt_kprintf("running usr3_thread\r\n"); + rt_thread_mdelay(10); // 加延时,避免占满CPU + } + } + rt_thread_t tid1 = RT_NULL; + rt_thread_t tid2 = RT_NULL; + rt_thread_t tid3 = RT_NULL; + int main(void) + { + tid1 = rt_thread_create("usr1", usr1_thread, RT_NULL, 1024, 11, 5); + tid2 = rt_thread_create("usr2", usr2_thread, RT_NULL, 1024, 11, 5); + tid3 = rt_thread_create("usr3", usr3_thread, RT_NULL, 1024, 10, 5); + if(tid1 != RT_NULL) + { + rt_thread_startup(tid1); + } + if(tid2 != RT_NULL) + { + rt_thread_startup(tid2); + } + if(tid1 != RT_NULL) + { + rt_thread_startup(tid3); + } + rt_kprintf("running main\r\n"); + return RT_EOK; + } + \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/binary_semaphore_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/binary_semaphore_demo.c" new file mode 100644 index 0000000000000000000000000000000000000000..d20a68c3efbe7e7117355d4175e86d8c67a13698 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/binary_semaphore_demo.c" @@ -0,0 +1,65 @@ +#include + +#define THREAD_A_STACK_SIZE 1024 +#define THREAD_B_STACK_SIZE 1024 +#define THREAD_A_PRIORITY 20 +#define THREAD_B_PRIORITY 21 +#define THREAD_TIMESLICE 5 + +static rt_sem_t binary_sem = RT_NULL; + +static void thread_a_entry(void *parameter) +{ + while (1) + { + rt_thread_mdelay(1000); + + rt_kprintf("[A] Event occurred, giving binary semaphore.\n"); + + if (binary_sem->value == 0) + { + rt_sem_release(binary_sem); + } + } +} + +static void thread_b_entry(void *parameter) +{ + rt_err_t result; + + while (1) + { + result = rt_sem_take(binary_sem, RT_WAITING_FOREVER); + if (result == RT_EOK) + { + rt_kprintf("[B] Binary semaphore taken. Handling event...\n"); + rt_thread_mdelay(500); + } + } +} + + +int binary_semaphore_demo(void) +{ + binary_sem = rt_sem_create("bsem", 0, RT_IPC_FLAG_PRIO); + if (binary_sem == RT_NULL) + { + rt_kprintf("Failed to create binary semaphore.\n"); + return -1; + } + + rt_thread_t tid_a = rt_thread_create("thread_a", thread_a_entry, RT_NULL, + THREAD_A_STACK_SIZE, THREAD_A_PRIORITY, THREAD_TIMESLICE); + if (tid_a != RT_NULL) + rt_thread_startup(tid_a); + + rt_thread_t tid_b = rt_thread_create("thread_b", thread_b_entry, RT_NULL, + THREAD_B_STACK_SIZE, THREAD_B_PRIORITY, THREAD_TIMESLICE); + if (tid_b != RT_NULL) + rt_thread_startup(tid_b); + + return 0; +} + +/* 导出到 MSH 命令 */ +MSH_CMD_EXPORT(binary_semaphore_demo, Binary semaphore synchronization example); diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/mailbox_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/mailbox_demo.c" new file mode 100644 index 0000000000000000000000000000000000000000..7a75265dc887e6240f7ac312ee67970b76f6d129 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/mailbox_demo.c" @@ -0,0 +1,50 @@ +#include + +#define THREAD_STACK_SIZE 1024 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 5 + +static rt_mailbox_t mailbox = RT_NULL; +static char mb_pool[128]; + +static void sender(void *param) +{ + rt_uint32_t msg; + for (msg = 1; msg <= 5; msg++) + { + rt_thread_mdelay(1000); + rt_mb_send(mailbox, msg); + rt_kprintf("[Sender] Sent: %d\n", msg); + } +} + +static void receiver(void *param) +{ + rt_uint32_t msg; + while (1) + { + if (rt_mb_recv(mailbox, &msg, RT_WAITING_FOREVER) == RT_EOK) + { + rt_kprintf("[Receiver] Received: %d\n", msg); + } + } +} + +int mailbox_demo(void) +{ + mailbox = rt_mb_create("mb", 4, RT_IPC_FLAG_FIFO); + if (mailbox == RT_NULL) + { + rt_kprintf("Mailbox creation failed.\n"); + return -1; + } + + rt_thread_startup(rt_thread_create("sender", sender, RT_NULL, + THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE)); + + rt_thread_startup(rt_thread_create("receiver", receiver, RT_NULL, + THREAD_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE)); + + return 0; +} +MSH_CMD_EXPORT(mailbox_demo, mailbox communication demo); diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/mq_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/mq_demo.c" new file mode 100644 index 0000000000000000000000000000000000000000..6582f37133144d5060199fed359df9e2385ada9b --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/mq_demo.c" @@ -0,0 +1,49 @@ +#include +#include + +#define MSG_SIZE 32 +#define MSG_QUEUE_SZ 8 +#define STACK_SIZE 1024 +#define PRIORITY 20 + +static struct rt_messagequeue mq; + +static char msg_pool[MSG_SIZE * MSG_QUEUE_SZ]; + +static void mq_sender(void *param) +{ + char msg[MSG_SIZE]; + int count = 0; + while (count < 5) + { + rt_snprintf(msg, sizeof(msg), "Msg-%d", count++); + rt_mq_send(&mq, msg, strlen(msg) + 1); + rt_kprintf("[Sender] Sent: %s\n", msg); + rt_thread_mdelay(1000); + } +} + +static void mq_receiver(void *param) +{ + char msg[MSG_SIZE]; + while (1) + { + if (rt_mq_recv(&mq, msg, sizeof(msg), RT_WAITING_FOREVER) == RT_EOK) + { + rt_kprintf("[Receiver] Received: %s\n", msg); + } + } +} + +int mq_demo(void) +{ + rt_mq_init(&mq, "mq", msg_pool, MSG_SIZE, sizeof(msg_pool), RT_IPC_FLAG_FIFO); + + rt_thread_startup(rt_thread_create("mq_tx", mq_sender, RT_NULL, + STACK_SIZE, PRIORITY, 5)); + rt_thread_startup(rt_thread_create("mq_rx", mq_receiver, RT_NULL, + STACK_SIZE, PRIORITY + 1, 5)); + + return 0; +} +MSH_CMD_EXPORT(mq_demo, message queue demo); diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/mutex_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/mutex_demo.c" new file mode 100644 index 0000000000000000000000000000000000000000..2eb1b771974ceb620c6952995f682924b207df52 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/mutex_demo.c" @@ -0,0 +1,53 @@ +#include + +#define THREAD1_STACK_SIZE 1024 +#define THREAD2_STACK_SIZE 1024 +#define THREAD_PRIORITY 20 +#define THREAD_TIMESLICE 5 + +static rt_mutex_t mutex = RT_NULL; + +static void thread1_entry(void *param) +{ + while (1) + { + rt_mutex_take(mutex, RT_WAITING_FOREVER); + rt_kprintf("[Thread1] Got mutex, working...\n"); + rt_thread_mdelay(500); + rt_kprintf("[Thread1] Release mutex.\n"); + rt_mutex_release(mutex); + rt_thread_mdelay(500); + } +} + +static void thread2_entry(void *param) +{ + while (1) + { + rt_mutex_take(mutex, RT_WAITING_FOREVER); + rt_kprintf("[Thread2] Got mutex, working...\n"); + rt_thread_mdelay(500); + rt_kprintf("[Thread2] Release mutex.\n"); + rt_mutex_release(mutex); + rt_thread_mdelay(500); + } +} + +int mutex_demo(void) +{ + mutex = rt_mutex_create("mtx", RT_IPC_FLAG_PRIO); + if (mutex == RT_NULL) + { + rt_kprintf("Create mutex failed.\n"); + return -1; + } + + rt_thread_startup(rt_thread_create("t1", thread1_entry, RT_NULL, + THREAD1_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE)); + + rt_thread_startup(rt_thread_create("t2", thread2_entry, RT_NULL, + THREAD2_STACK_SIZE, THREAD_PRIORITY + 1, THREAD_TIMESLICE)); + + return 0; +} +MSH_CMD_EXPORT(mutex_demo, mutex lock demo); diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/semaphore_example.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/semaphore_example.c" new file mode 100644 index 0000000000000000000000000000000000000000..3318db62a2157debdfbf6a3a486e3198b1afe728 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/semaphore_example.c" @@ -0,0 +1,67 @@ +#include + +#define THREAD1_STACK_SIZE 1024 +#define THREAD2_STACK_SIZE 1024 +#define THREAD1_PRIORITY 20 +#define THREAD2_PRIORITY 21 +#define THREAD_TIMESLICE 5 + +static rt_sem_t sem = RT_NULL; +static int task_id = 0; + +static void thread1_entry(void *parameter) +{ + while (task_id < 5) + { + rt_thread_mdelay(1000); // 每秒产生一个任务 + task_id++; + rt_kprintf("[Thread1] Task %d created. Release semaphore.\n", task_id); + rt_sem_release(sem); + } +} + +static void thread2_entry(void *parameter) +{ + rt_err_t result; + int handled = 0; + + while (1) + { + result = rt_sem_take(sem, RT_WAITING_FOREVER); + if (result == RT_EOK) + { + handled++; + rt_kprintf("[Thread2] Received signal. Handling task %d\n", handled); + + if (handled >= 5) + { + rt_kprintf("[Thread2] All tasks handled. Exiting.\n"); + break; + } + } + } +} + +int semaphore_example(void) +{ + sem = rt_sem_create("sem", 0, RT_IPC_FLAG_PRIO); + if (sem == RT_NULL) + { + rt_kprintf("Failed to create semaphore.\n"); + return -1; + } + + rt_thread_t tid1 = rt_thread_create("producer", thread1_entry, RT_NULL, + THREAD1_STACK_SIZE, THREAD1_PRIORITY, THREAD_TIMESLICE); + if (tid1 != RT_NULL) + rt_thread_startup(tid1); + + rt_thread_t tid2 = rt_thread_create("consumer", thread2_entry, RT_NULL, + THREAD2_STACK_SIZE, THREAD2_PRIORITY, THREAD_TIMESLICE); + if (tid2 != RT_NULL) + rt_thread_startup(tid2); + + return 0; +} +/* 导出到 MSH 命令行 */ +MSH_CMD_EXPORT(semaphore_example, Improved semaphore task handling example); diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/signal_demo.c" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/signal_demo.c" new file mode 100644 index 0000000000000000000000000000000000000000..85e5b16ce561308c76833590446a242d89639698 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day3\344\275\234\344\270\232\357\274\232\347\272\277\347\250\213\347\232\204\351\200\232\344\277\241/signal_demo.c" @@ -0,0 +1,66 @@ +#include + +#define THREAD1_PRIORITY 20 +#define THREAD2_PRIORITY 25 +#define THREAD_STACK_SIZE 512 +#define THREAD_TIMESLICE 5 + +static rt_thread_t tid1 = RT_NULL; +static rt_thread_t tid2 = RT_NULL; + +static void thread2_signal_handler(int sig) +{ + static int sig_count = 0; + sig_count++; + rt_kprintf("thread2 received signal %d, count = %d\n", sig, sig_count); +} + +static void thread1_entry(void *parameter) +{ + int i = 0; + + for (i = 0; i < 5; i++) + { + rt_thread_mdelay(500); + if (tid2) + { + rt_kprintf("thread1 send signal SIGUSR2 to thread2\n"); + rt_thread_kill(tid2, SIGUSR2); + } + } +} + +static void thread2_entry(void *parameter) +{ + int count = 0; + + rt_signal_install(SIGUSR2, thread2_signal_handler); + rt_signal_unmask(SIGUSR2); + + while (count < 5) + { + rt_kprintf("thread2 is running... %d\n", count++); + rt_thread_mdelay(200); + } +} + +int signal_comm_sample(void) +{ + tid2 = rt_thread_create("thread2", + thread2_entry, RT_NULL, + THREAD_STACK_SIZE, + THREAD2_PRIORITY, THREAD_TIMESLICE); + if (tid2 != RT_NULL) + rt_thread_startup(tid2); + + tid1 = rt_thread_create("thread1", + thread1_entry, RT_NULL, + THREAD_STACK_SIZE, + THREAD1_PRIORITY, THREAD_TIMESLICE); + if (tid1 != RT_NULL) + rt_thread_startup(tid1); + + return 0; +} +MSH_CMD_EXPORT(signal_comm_sample, Signal communication between threads); + diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day4\344\275\234\344\270\232\357\274\232\350\256\276\345\244\207\351\251\261\345\212\250/RTT_sample.rar" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day4\344\275\234\344\270\232\357\274\232\350\256\276\345\244\207\351\251\261\345\212\250/RTT_sample.rar" new file mode 100644 index 0000000000000000000000000000000000000000..bccde8d0f48e2496f916b4cf1d5cccae2a385854 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\344\275\234\344\270\232/\343\200\220RSOC25\343\200\221Day4\344\275\234\344\270\232\357\274\232\350\256\276\345\244\207\351\251\261\345\212\250/RTT_sample.rar" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/1.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/1.png" new file mode 100644 index 0000000000000000000000000000000000000000..e9eb70e82e853412b3f6e7103f9a8f3112a889cd Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/1.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/10.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/10.png" new file mode 100644 index 0000000000000000000000000000000000000000..b0b4df31ea6192fb000f46851905023a32a6deec Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/10.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/11.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/11.png" new file mode 100644 index 0000000000000000000000000000000000000000..812d3f02febd86880bbc99119fadd9e3ba59586b Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/11.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/12.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/12.png" new file mode 100644 index 0000000000000000000000000000000000000000..6c687a3307fdd73a415868902f34b87697bfad41 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/12.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/13.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/13.png" new file mode 100644 index 0000000000000000000000000000000000000000..18000dedbba0990113fd575c194e18948d4bddcc Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/13.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/14.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/14.png" new file mode 100644 index 0000000000000000000000000000000000000000..6dc20aa36192ec810c0d0d057bb939bcfb11d097 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/14.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/2.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/2.png" new file mode 100644 index 0000000000000000000000000000000000000000..c5ffc286882baac51c78495cb1f6bd1a5243db5e Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/2.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/3.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/3.png" new file mode 100644 index 0000000000000000000000000000000000000000..1b5aaa4b5d08ca9fc045a5b54e4cd5821c975139 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/3.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/4.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/4.png" new file mode 100644 index 0000000000000000000000000000000000000000..cc12a581c7557a1fdf51a18c391e843e2d5c6254 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/4.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/5.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/5.png" new file mode 100644 index 0000000000000000000000000000000000000000..724bffae956e71fbe9574bca98e9b103abc84dbd Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/5.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/6.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/6.png" new file mode 100644 index 0000000000000000000000000000000000000000..2081ebf3715db4f5f441da9b60955262cf8224d2 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/6.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/7.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/7.png" new file mode 100644 index 0000000000000000000000000000000000000000..871996f69ee8c901aee069cbc6a4a46d0b96ca05 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/7.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/8.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/8.png" new file mode 100644 index 0000000000000000000000000000000000000000..0816b69692f366cb7fc9e42d130f8ceec083acc7 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/8.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/9.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/9.png" new file mode 100644 index 0000000000000000000000000000000000000000..6ca0f3498e211a043a1fc2c10330e4951a6e2f1c Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/Figures/9.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/RT-Thread\347\232\204IPC\346\234\272\345\210\266.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/RT-Thread\347\232\204IPC\346\234\272\345\210\266.md" new file mode 100644 index 0000000000000000000000000000000000000000..f8c6f7730efa58edb596aa47f5e153f61b370627 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/RT-Thread\347\232\204IPC\346\234\272\345\210\266.md" @@ -0,0 +1,84 @@ +# IPC机制 +## 线程同步 +1. **信号量** +信号量是一种计数型同步机制,用于控制对共享资源的访问。它可以允许多个线程同时访问有限数量的资源。 +- 信号量有一个整数值 count,表示可用资源的数量。 +- 当一个线程请求资源时,count--。当线程释放资源时,count++。 +- 如果 count <= 0,请求线程将阻塞等待。 +```bash +#include + +// 初始化 +sem_t sem; +sem_init(&sem, 0, initial_count); // initial_count:初始资源数(比如3) +// 等待(占用资源) +sem_wait(&sem); +// 释放(释放资源) +sem_post(&sem); +// 销毁 +sem_destroy(&sem); +``` + +2. **互斥量** +互斥量是一种特殊的信号量,只允许一个线程访问资源。主要用于线程之间的互斥访问(保护临界区)。 +- 当一个线程加锁后,其他线程必须等待它释放。 +- 互斥量的本质是一个二值信号量,但它的设计目标是线程间互斥。 +```bash +#include +// 定义和初始化 +pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; +// 或者 +pthread_mutex_init(&mutex, NULL); +// 加锁 +pthread_mutex_lock(&mutex); +// 解锁 +pthread_mutex_unlock(&mutex); +// 销毁 +pthread_mutex_destroy(&mutex); +``` + +3. **二值量** +二值量是一种只能为 0 或 1 的信号量,常用于事件通知或类似互斥的功能。 +- 1 表示资源可用或事件发生 +- 0 表示资源被占用或事件未发生 +- 和互斥量不同的是,二值信号量没有线程所有权概念 +```bash +sem_t bin_sem; +sem_init(&bin_sem, 0, 1); // 初始值为1,就成了二值量 +sem_wait(&bin_sem); // 相当于"等待资源可用" +sem_post(&bin_sem); // 相当于"释放资源" +``` + +## 线程间通信 +1. **消息邮箱** +邮箱用于线程间传递一个 uint32_t 类型的数值消息(通常是地址或标志)。 +邮箱一次只能接收或发送一个 4 字节的消息。 +常用于快速事件通知、标志传递。 +```bash +rt_err_t rt_mb_init(rt_mailbox_t mb, const char *name, rt_uint32_t *msgpool, rt_size_t size, rt_uint8_t flag); +rt_mailbox_t rt_mb_create(const char *name, rt_size_t size, rt_uint8_t flag); +rt_err_t rt_mb_delete(rt_mailbox_t mb); +rt_err_t rt_mb_send(rt_mailbox_t mb, rt_uint32_t value); +rt_err_t rt_mb_recv(rt_mailbox_t mb, rt_uint32_t *value, rt_int32_t timeout); +``` + +2. **消息队列** +消息队列用于线程间传递一段内存消息块(可以是结构体、字符串等)。 +更灵活,适合传递大量、复杂数据。 +先进先出(FIFO)或优先级方式。 +```bash +rt_mq_t rt_mq_create(const char *name, rt_size_t msg_size, rt_size_t max_msgs, rt_uint8_t flag); +rt_err_t rt_mq_delete(rt_mq_t mq); +rt_err_t rt_mq_send(rt_mq_t mq, void *buffer, rt_size_t size); +rt_err_t rt_mq_recv(rt_mq_t mq, void *buffer, rt_size_t size, rt_int32_t timeout); +``` + +3. **信号** +信号是 RT-Thread 中的一种异步事件通知机制,类似于 Linux 的信号。 +主要用于线程之间或中断向线程发送控制信号。 +可注册信号处理函数。 +```bash +int rt_thread_kill(rt_thread_t thread, int sig); +int rt_signal_install(int sig, void (*handler)(int)); +int rt_signal_unmask(int sig); +``` \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/day5.MD" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/day5.MD" new file mode 100644 index 0000000000000000000000000000000000000000..61c4b389d8d53fc39a8395b7ce8c9e0e4e09e468 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/day5.MD" @@ -0,0 +1,61 @@ +**介绍RT-Thread 软件包机制** + +RT-Thread软件包机制类似于Linux下的包管理系统,它允许开发者通过简单的配置和命令来获取、安装、更新、及管理软件包。这种机制提高了代码重用性,降低了开发复杂性。 + +使用方法 + +1.览和选择软件包:通过menuconfig工具查看需要的功能,并选择相应的软件包。 + +2.配置软件包:在配置工具中设置软件包的相关选项和参数。 + +3.编译和测试:重新编译项目以包含新的软件包,进行测试确保功能正常。 + +![alt text](Figures/14.png) +![alt text](Figures/13.png) +![alt text](image.png) +**Kconfig相关语法** + +Kconfig 是 RT-Thread 用来配置组件(组件开关、参数等)的配置语言,语法来源于 Linux 内核的 Kconfig 系统。配合 menuconfig 使用,可以构建灵活、可配置的组件化系统。 + +1. menu 创建一个菜单(分类) +2. config 定义一个配置项(布尔值、整型、字符串等) +3. bool 布尔类型的配置(选中/不选中) +4. int 整型配置项 +5. string 字符串配置项 +6. default 默认值 +7. depends on 条件依赖 +8. select 自动启用其他配置 +9. help 添加注释说明 + + ```bash +menu "My Device Driver Options" + +config RT_USING_MY_DEVICE + bool "Enable My Device" + default y + help + Enable support for My Virtual Device. + +config MY_DEVICE_BUFFER_SIZE + int "Buffer Size" + default 256 + depends on RT_USING_MY_DEVICE + help + Set the buffer size used by My Device driver. + +endmenu + ``` + +**SConscript** + +SCons 是 RT-Thread 的构建系统(Python 实现的构建工具),用于定义源码编译规则。RT-Thread 项目结构中每个组件目录下通常有一个 SConscript 文件。 + + ```bash +src = Glob('*.c')# 添加目标下所有的c文件 +group = DefineGroup('My Device Driver', src, depend=['RT_USING_MY_DEVICE']) + ``` +语法https://www.rt-thread.org/document/site/#/development-tools/build-config-system/SCons + +**网络组件** +同第一个软件包选择,把NTP网络组件勾选 +然后输入date,即可看到时间 diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/git\344\275\277\347\224\250.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/git\344\275\277\347\224\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..6ae56d05a6501ca71fe9dc065ebdcae09afbb06d --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/git\344\275\277\347\224\250.md" @@ -0,0 +1,25 @@ +# [RSOC25]DAY1_git使用 + +**基础命令** + ```bash +git init # 在当前文件夹初始化 Git 仓库 +git status # 查看当前变更 +git add . # 添加所有变更文件 +git commit -m "说明信息" # 提交更改并写明注释 +git reset --soft HEAD~ # 软重置 +git reset --hard HEAD~ # 硬重置 +git branch # 查看分支 +git branch dev # 新建一个 dev 分支 +git checkout dev # 切换到 dev 分支 +git merge dev # 将 dev 分支合并到当前分支 +git remote add origin # 添加远程仓库 +git push -u origin main # 第一次推送主分支 +git pull origin main # 拉取远程主分支更新 +ssh-keygen -t rsa -b 4096 #密钥 +cat ~/.ssh/id_rsa.pub # 复制到Gitee/GitHub +/*****PR流程******/ +git fork # 派生仓库 +git checkout -b feature # 创建特性分支 +git push origin feature # 推送分支 # 在平台发起Pull Request + +主要流程是先fork,再下载到本地,然后在vscode上创建本地仓库分支,将新的修改推送至新的分支,然后再进行远程仓库的推送,然后再去远程仓库新建pr,选择对应分支 \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/image.png" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/image.png" new file mode 100644 index 0000000000000000000000000000000000000000..fcf0c0f2bc933e53a39d33100907be95b935f932 Binary files /dev/null and "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/image.png" differ diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/\347\216\257\345\242\203\345\207\206\345\244\207.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/\347\216\257\345\242\203\345\207\206\345\244\207.md" new file mode 100644 index 0000000000000000000000000000000000000000..d074e8b9208e171e303d6db05eed876b0adecf64 --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/\347\216\257\345\242\203\345\207\206\345\244\207.md" @@ -0,0 +1,39 @@ +# [RSOC25]DAY1_环境准备 + +1. **环境准备** + ```bash + 使用git下载ENV工具还有源码 + git clone https://github.com/RT-Thread/env.git + git clone https://github.com/RT-Thread/rt-thread.git +2. **env工具安装** + ```bash + 打开 D:\RSOC\env-windows下的env程序,联网自动安装。 + 点击setting,创建右键快捷方式。 +3. **工程编译** + ```bash + 进入项目目录D:\RSOC\rt-thread\bsp\qemu-vexpress-a9 + 右键打开env + 配置命令 + menuconfig,直接退出保存 + 编译工程 + scons -j4 + 运行模拟器 + qemu-nographic.bat + ``` + ![alt text](Figures/3.png) +4. **LVGL** + 图形化选择LVGL工具 + ![alt text](Figures/1.png) + ![alt text](Figures/2.png) + ```bash + 打开终端执行以下命令 + menuconfig + pkgs --update + scons -j4 + ``` + +5. **尝试修改工程代码,理解SConscript** + ```bash + 创建test,将main移入,新建SConscript。 + ``` + ![alt text](Figures/4.png) \ No newline at end of file diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/\347\272\277\347\250\213\347\232\204\345\237\272\346\234\254\347\237\245\350\257\206.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/\347\272\277\347\250\213\347\232\204\345\237\272\346\234\254\347\237\245\350\257\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..b3ac5c5acdba3c67c6ee1051591710f22759d0dd --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/\347\272\277\347\250\213\347\232\204\345\237\272\346\234\254\347\237\245\350\257\206.md" @@ -0,0 +1,30 @@ +# [RSOC25]DAY2 + +1. **环境准备** + ```bash + 官网下载RT-Thread studio + 学习如何新建工程、引入需要的包、选择对应的模拟器 + ``` + ![alt text](Figures/5.png) +2. **启动文件的学习** + ```bash + 结合PPT、代码,学习RT-Thread的启动流程: + RT-Thread 的启动流程从 main() 函数开始,依次完成系统时钟初始化、内存堆初始化、调度器和定时器初始化、创建空闲线程和用户线程,最后启动调度器,使系统进入多线程运行状态。整个过程由 rtthread_startup() 统一管理,确保操作系统内核和用户应用平稳启动。 + ``` + ![alt text](Figures/6.png) + ![alt text](Figures/7.png) +3. **线程的学习** + ```bash + 1、静态创建线程和动态创建线程的区别: + 静态编译阶段就会为它分配空间,这块空间永远为他使用,适用于对安全有要求,且不在乎内存开销时,那么几乎所有线程都采用静态的方式。 + 动态适用于内存有限,功能很多对安全不太有要求,但是可能会遇到写代码不好,然后申请不到内存而产品死机的情况。 + 2、内存泄漏:指程序在运行过程中分配了内存但未释放,导致这部分内存无法被回收或再次使用的现象。 + 动态创建线程时,会给该线程分配内存,如果不及时释放会遇到内存泄漏的情况 + 3、stack分配原则,一开始尽可能给1k/2k,后续程序写完了,可以通过命令行list_thread查看每个线程的使用情况,再调整。 + ``` + ![alt text](Figures/8.png) + ```bash + 4、优先级抢占和时间片轮转 + 优先级抢占是指实时操作系统中,当前运行的低优先级线程会被优先级更高的就绪线程立即打断和替代运行;时间片轮转则是在多个具有相同优先级的就绪线程之间,按照设定的时间片轮流执行,以实现公平调度。 + ``` + diff --git "a/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/\350\256\276\345\244\207\351\251\261\345\212\250.md" "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/\350\256\276\345\244\207\351\251\261\345\212\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..3f3ddcf5481ec24d26a795495f7205284cee2f9b --- /dev/null +++ "b/2025/\347\254\2541\347\273\204(STM32H750-ART-PI)/\347\216\213\345\235\244/\347\254\224\350\256\260/\350\256\276\345\244\207\351\251\261\345\212\250.md" @@ -0,0 +1,57 @@ +## RT-Thread I/O API +```bash +rt_device_t rt_device_find(const char *name) #按名称查找设备并获取句柄 +rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflags) #打开设备(oflags:读写模式) +rt_err_t rt_device_close(rt_device_t dev) #关闭设备 +rt_size_t rt_device_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) #从设备读取数据 +rt_size_t rt_device_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) #向设备写入数据 +rt_err_t rt_device_control(rt_device_t dev, int cmd, void *arg) #发送控制命令(如配置参数) +rt_err_t rt_device_set_rx_indicate(rt_device_t dev, rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size)) #设置接收中断回调函数 +rt_err_t rt_device_register(rt_device_t dev, const char *name, rt_uint16_t flags) #注册设备到I/O管理层 +``` + +**实验1 创建并注册一个自定义字符设备** + +```bash +#include +#include + +static int rt_dev_test_init(void) +{ + rt_device_t dev_test = rt_device_create(RT_Device_Class_Char, 0); + if (dev_test == RT_NULL) + { + rt_kprintf("Failed to create test device\n"); + return -RT_ERROR; + } + + if (rt_device_register(dev_test, "test_dev", RT_DEVICE_FLAG_RDWR) != RT_EOK) + { + rt_kprintf("Failed to register test device\n"); + return -RT_ERROR; + } + return RT_EOK; +} + +INIT_DEVICE_EXPORT(rt_dev_test_init); + +``` +![alt text](Figures/10.png) + +**IIC** +IIC(Inter-Integrated Circuit)总线是一种广泛使用的两线制串行通信协议,由Philips(现NXP)开发,主要用于短距离芯片间通信。其工作机制基于严格的时序控制和主从架构 +![alt text](Figures/11.png) +**SPI** +SPI(Serial Peripheral Interface)是一种由摩托罗拉公司提出的高速全双工同步串行通信协议,广泛应用于微控制器(MCU)与外围设备(如Flash、传感器、显示屏等)的数据交互 +![alt text](Figures/12.png) +**创建虚拟的设备驱动架构** + +1. 创建新的RT-Thread项目 +2. 去rt-thread\components\drivers\misc中的创建驱动文件.C和.H。 +3. 去对应的SConscript加入.C文件 +4. 去组件里面使能新的功能 +5. rtconfig.h中检查是否使能 +6. 去libraries\HAL_Drivers中创建.C和.H文件,拓展HAL驱动 +7. 去对应的SConscript加入.C文件 +8. rt-thread\components\drivers\include中找到rtdevice.h文件添加定义 +9. 去main函数中使用 \ No newline at end of file