diff --git a/board/GD32VF103C_START/BSP/Inc/mcu_init.h b/board/GD32VF103C_START/BSP/Inc/mcu_init.h
new file mode 100644
index 00000000..7f906dd8
--- /dev/null
+++ b/board/GD32VF103C_START/BSP/Inc/mcu_init.h
@@ -0,0 +1,9 @@
+#ifndef __MCU_INIT_H
+#define __MCU_INIT_H
+
+#include "gd32vf103.h"
+#include "usart.h"
+
+void board_init();
+
+#endif //__MCU_INIT_H
diff --git a/board/GD32VF103C_START/BSP/Inc/usart.h b/board/GD32VF103C_START/BSP/Inc/usart.h
new file mode 100644
index 00000000..bb5f1594
--- /dev/null
+++ b/board/GD32VF103C_START/BSP/Inc/usart.h
@@ -0,0 +1,10 @@
+#ifndef __USART_H
+#define __USART_H
+
+#define USART0_GPIO_TX_PIN GPIO_PIN_9
+#define USART0_GPIO_RX_PIN GPIO_PIN_10
+#define USART0_GPIO_PORT GPIOA
+
+void usart0_init(int baud);
+
+#endif // __USART_H
diff --git a/board/GD32VF103C_START/BSP/Src/mcu_init.c b/board/GD32VF103C_START/BSP/Src/mcu_init.c
new file mode 100644
index 00000000..57aa3861
--- /dev/null
+++ b/board/GD32VF103C_START/BSP/Src/mcu_init.c
@@ -0,0 +1,9 @@
+#include "mcu_init.h"
+
+void board_init() {
+ rcu_periph_clock_enable(RCU_GPIOA);
+
+ gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
+
+ gpio_bit_reset(GPIOA, GPIO_PIN_7);
+}
diff --git a/board/GD32VF103C_START/BSP/Src/usart.c b/board/GD32VF103C_START/BSP/Src/usart.c
new file mode 100644
index 00000000..9d6c0d6f
--- /dev/null
+++ b/board/GD32VF103C_START/BSP/Src/usart.c
@@ -0,0 +1,28 @@
+#include "gd32vf103.h"
+#include "usart.h"
+void usart0_init(int baud)
+{
+ /* enable GPIO clock */
+ rcu_periph_clock_enable(RCU_GPIOA);
+
+ /* enable USART0 clock */
+ rcu_periph_clock_enable(RCU_USART0);
+
+ /* connect port to USART0_Tx */
+ gpio_init(USART0_GPIO_PORT, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, USART0_GPIO_TX_PIN);
+
+ /* connect port to USART0_Rx */
+ gpio_init(USART0_GPIO_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, USART0_GPIO_RX_PIN);
+
+ /* USART0 configure */
+ usart_deinit(USART0);
+ usart_baudrate_set(USART0, baud);
+ usart_word_length_set(USART0, USART_WL_8BIT);
+ usart_stop_bit_set(USART0, USART_STB_1BIT);
+ usart_parity_config(USART0, USART_PM_NONE);
+ usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
+ usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
+ usart_receive_config(USART0, USART_RECEIVE_ENABLE);
+ usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
+ usart_enable(USART0);
+}
diff --git a/board/GD32VF103C_START/eclipse/hello_world/.cproject b/board/GD32VF103C_START/eclipse/hello_world/.cproject
index f8d3eea4..33bcd505 100644
--- a/board/GD32VF103C_START/eclipse/hello_world/.cproject
+++ b/board/GD32VF103C_START/eclipse/hello_world/.cproject
@@ -144,6 +144,8 @@
+
+
diff --git a/board/GD32VF103C_START/eclipse/hello_world/.project b/board/GD32VF103C_START/eclipse/hello_world/.project
index 646d74fd..bda85e3d 100644
--- a/board/GD32VF103C_START/eclipse/hello_world/.project
+++ b/board/GD32VF103C_START/eclipse/hello_world/.project
@@ -39,6 +39,16 @@
2
virtual:/virtual
+
+ Application/Inc
+ 2
+ TOP_DIR/board/GD32VF103C_START/BSP/Inc
+
+
+ Application/Src
+ 2
+ TOP_DIR/board/GD32VF103C_START/BSP/Src
+
Application/tos_config.h
1
diff --git a/board/GD32VF103C_START/eclipse/hello_world/.settings/language.settings.xml b/board/GD32VF103C_START/eclipse/hello_world/.settings/language.settings.xml
index 140cae41..1c9fb7ba 100644
--- a/board/GD32VF103C_START/eclipse/hello_world/.settings/language.settings.xml
+++ b/board/GD32VF103C_START/eclipse/hello_world/.settings/language.settings.xml
@@ -11,7 +11,7 @@
-
+
diff --git a/board/GD32VF103C_START/eclipse/hello_world/main.c b/board/GD32VF103C_START/eclipse/hello_world/main.c
index 67072343..7248fd36 100644
--- a/board/GD32VF103C_START/eclipse/hello_world/main.c
+++ b/board/GD32VF103C_START/eclipse/hello_world/main.c
@@ -1,58 +1,68 @@
-#include "gd32vf103.h"
-#include "tos.h"
-
-#define TASK_SIZE 512
-k_task_t k_task_task1;
-k_task_t k_task_task2;
-uint8_t k_task1_stk[TASK_SIZE];
-uint8_t k_task2_stk[TASK_SIZE];
-
-int share = 0xCBA7F9;
-k_sem_t sem;
-
-void task1(void *pdata)
-{
- int task_cnt1 = 0;
- while (1) {
- task_cnt1++;
- tos_sem_pend(&sem, ~0U);
- gpio_bit_write(GPIOA, GPIO_PIN_7, share % 2);
- }
-}
-
-void task2(void *pdata)
-{
- int task_cnt2 = 0;
- while (1) {
- task_cnt2--;
- share++;
- tos_task_delay(1000);
- tos_sem_post(&sem);
- }
-}
-
-
-void main(void) {
- rcu_periph_clock_enable(RCU_GPIOA);
-
- gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
-
- gpio_bit_reset(GPIOA, GPIO_PIN_7);
-
- tos_knl_init();
-
- tos_task_create(&k_task_task1, "task1", task1, NULL, 3, k_task1_stk, TASK_SIZE, 0);
- tos_task_create(&k_task_task2, "task2", task2, NULL, 3, k_task2_stk, TASK_SIZE, 0);
-
- k_err_t err = tos_sem_create(&sem, 1);
- if (err != K_ERR_NONE) {
- goto die;
- }
-
- tos_knl_start();
-
-die:
- while (1) {
- asm("wfi;");
- }
-}
+#include "mcu_init.h"
+#include "tos.h"
+
+#define TASK_SIZE 1024
+k_task_t k_task_task1;
+k_task_t k_task_task2;
+uint8_t k_task1_stk[TASK_SIZE];
+uint8_t k_task2_stk[TASK_SIZE];
+
+int share = 0xCBA7F9;
+k_sem_t sem;
+
+void task1(void *pdata)
+{
+ int task_cnt1 = 0;
+ while (1) {
+ printf("hello world from %s cnt: %d\n", __func__, task_cnt1++);
+ tos_sem_pend(&sem, ~0U);
+ gpio_bit_write(GPIOA, GPIO_PIN_7, share % 2);
+ }
+}
+
+void task2(void *pdata)
+{
+ int task_cnt2 = 0;
+ while (1) {
+ share++;
+ for(int i=0; i<5; i++) {
+ printf("hello world from %s cnt: %08x\n", __func__, task_cnt2--);
+ tos_task_delay(200);
+ }
+ tos_sem_post(&sem);
+ }
+}
+
+
+void main(void) {
+ board_init();
+
+ usart0_init(115200);
+
+ tos_knl_init();
+
+ tos_task_create(&k_task_task1, "task1", task1, NULL, 3, k_task1_stk, TASK_SIZE, 0);
+ tos_task_create(&k_task_task2, "task2", task2, NULL, 3, k_task2_stk, TASK_SIZE, 0);
+
+ k_err_t err = tos_sem_create(&sem, 1);
+ if (err != K_ERR_NONE) {
+ goto die;
+ }
+
+ tos_knl_start();
+
+die:
+ while (1) {
+ asm("wfi;");
+ }
+}
+
+
+int _put_char(int ch)
+{
+ usart_data_transmit(USART0, (uint8_t) ch );
+ while (usart_flag_get(USART0, USART_FLAG_TBE)== RESET){
+ }
+
+ return ch;
+}