基于RT_Thread的STM32F103之创建线程

1、硬件初始化:

初始化函数:rt_hw_board_init()

2、创建单线程-SRAM静态内存:

  1.  定义线程函数    static void led1_thread_entry(void* parameter)
  2. 定义线程栈        static rt_uint8_t rt_led1_thread_stack[1024] 
  3. 定义线程控制块  static struct rt_thread led1_thread
  4. 初始化线程         rt_thread_init()
  5. 启动线程             rt_thread_startup()

创建线程完整代码:

1 /*
2 *************************************************************************
3 * 包含的头文件
4 *************************************************************************
5 */
6 #include "board.h"
7 #include "rtthread.h"
8
9
10 /*
11 *************************************************************************
12 * 变量
13 *************************************************************************
14 */
15 /* 定义线程控制块 */
16 static struct rt_thread led1_thread;
17
18 /* 定义线程控栈时要求 RT_ALIGN_SIZE 个字节对齐 */
19 ALIGN(RT_ALIGN_SIZE)
20 /* 定义线程栈 */
21 static rt_uint8_t rt_led1_thread_stack[1024];
22 /*
23 *************************************************************************
24 * 函数声明
25 *************************************************************************
26 */
27 static void led1_thread_entry(void* parameter);
28
29
30 /*
31 *************************************************************************
32 * main 函数
33 *************************************************************************
34 */
35 /**
36 * @brief 主函数
37 * @param 无
38 * @retval 无
39 */
40 int main(void)
41 {
42 /*
43 * 开发板硬件初始化,RTT 系统初始化已经在 main 函数之前完成,
44 * 即在 component.c 文件中的 rtthread_startup() 函数中完成了。
45 * 所以在 main 函数中,只需要创建线程和启动线程即可。
46 */
47
48 rt_thread_init(&led1_thread, /* 线程控制块 */
49 "led1", /* 线程名字 */
50 led1_thread_entry, /* 线程入口函数 */
51 RT_NULL, /* 线程入口函数参数 */
52 &rt_led1_thread_stack[0], /* 线程栈起始地址 */
53 sizeof(rt_led1_thread_stack), /* 线程栈大小 */
54 3, /* 线程的优先级 */
55 20); /* 线程时间片 */
56 rt_thread_startup(&led1_thread); /* 启动线程,开启调度 */
57 }
58
59 /*
60 *************************************************************************
61 * 线程定义
62 *************************************************************************
63 */
64
65 static void led1_thread_entry(void* parameter)
66 {
67 while (1)
68 {
69 LED1_ON;
70 rt_thread_delay(500); /* 延时 500 个 tick */
71
72 LED1_OFF;
73 rt_thread_delay(500); /* 延时 500 个 tick */
74
75 }
76 }
77
78 /********************************END OF FILE****************************/

3、创建单线程——SRAM动态内存:

        SRAM 静态内存的例程中,线程控制块和线程栈的内存空间都是从内部的 SRAM 里面分配的,具体分配到哪个地址由编译器决定。

        始使用动态内存,即堆,其实堆也 是内存,也属于 SRAM。现在我们的做法是在 SRAM 里面定义一个大数组供 RT-Thread 的动态 内存分配函数使用,这些代码在 board.c 开头实现

  1.  定义线程函数    static void led1_thread_entry(void* parameter)
  2. 定义线程栈        static rt_uint8_t rt_led1_thread_stack[1024] 
  3. 定义线程控制块指针   使用动态内存时候,不用跟使用静态内存那样要预先定义好一个全局的静态的线程控制块空间。 线程控制块是在线程创建的时候创建,线程创建函数会返回一个指针,用于指向线程控制块,所 以要预先为线程栈定义一个线程控制块指针                   static rt_thread_t led1_thread = RT_NULL
  4. 初始化线程         rt_thread_init()
  5. 启动线程             rt_thread_startup()

创建线程- 定义 RT-Thread 的堆到 内部 SRAM:

1#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) 
2
3 /* 从内部 SRAM(即 DTCM)里面分配一部分静态内存来作为 RT-Thread 的堆空间,这里配置为
4KB */
4 #define RT_HEAP_SIZE 1024
5 static uint32_t rt_heap[RT_HEAP_SIZE]; 
6 RT_WEAK void *rt_heap_begin_get(void)  //获取堆的起始地址。
7 {
8 return rt_heap;
9 }
10
11 RT_WEAK void *rt_heap_end_get(void)   //获取堆的结束地址。 
12 {
13 return rt_heap + RT_HEAP_SIZE;
14 }
15 #endif
16
17
18 /* 该部分代码截取自函数 rt_hw_board_init() */
19 #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
20 rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get()); 
21 #endif

创建线程完整代码:

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
2 #define RT_HEAP_SIZE 1024
3 /* 从内部 SRAM 里面分配一部分静态内存来作为 rtt 的堆空间,这里配置为 4KB */
4 static uint32_t rt_heap[RT_HEAP_SIZE];
5 RT_WEAK void *rt_heap_begin_get(void)
6 {
7 return rt_heap;
8 }
9
10 RT_WEAK void *rt_heap_end_get(void)
11 {
12 return rt_heap + RT_HEAP_SIZE;
13 }
14 #endif
15
16 /* 该部分代码截取自函数 rt_hw_board_init() */
17 #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
18 //rt_system_heap_init((void*)HEAP_BEGIN, (void*)SRAM_END);
19 rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
20 #endif
21
22
23 /*
24 *************************************************************************
25 * 包含的头文件
26 *************************************************************************
27 */
28 #include "board.h"
29 #include "rtthread.h"
/*
33 *************************************************************************
34 * 变量
35 *************************************************************************
36 */
37 /* 定义线程控制块指针 */
38 static rt_thread_t led1_thread = RT_NULL;
39
40 /*
41 *************************************************************************
42 * 函数声明
43 *************************************************************************
44 */
45 static void led1_thread_entry(void* parameter);
46
47
48 /*
49 *************************************************************************
50 * main 函数
51 *************************************************************************
52 */
53 /**
54 * @brief 主函数
55 * @param 无
56 * @retval 无
57 */
58 int main(void)
59 {
60 /*
61 * 开发板硬件初始化,RTT 系统初始化已经在 main 函数之前完成,
62 * 即在 component.c 文件中的 rtthread_startup() 函数中完成了。
* 所以在 main 函数中,只需要创建线程和启动线程即可。
64 */
65
66 led1_thread = /* 线程控制块指针 */
67 rt_thread_create( "led1", /* 线程名字 */
68 led1_thread_entry, /* 线程入口函数 */
69 RT_NULL, /* 线程入口函数参数 */
70 512, /* 线程栈大小 */
71 3, /* 线程的优先级 */
72 20); /* 线程时间片 */
73
74 /* 启动线程,开启调度 */
75 if (led1_thread != RT_NULL)
76 rt_thread_startup(led1_thread);
77 else
78 return -1;
79 }
80
81 /*
82 *************************************************************************
83 * 线程定义
84 *************************************************************************
85 */
86
87 static void led1_thread_entry(void* parameter)
88 {
89 while (1)
90 {
91 LED1_ON;
92 rt_thread_delay(500); /* 延时 500 个 tick */
93
94 LED1_OFF;
95 rt_thread_delay(500); /* 延时 500 个 tick */
96
97 }
98 }
99
100 /*******************************END OF FILE****************************/

4、创建多线程—SRAM 动态内存

创建线程完整代码:

1 /*
2 *************************************************************************
3 * 包含的头文件
4 *************************************************************************
5 */
6 #include "board.h"
7 #include "rtthread.h"
8
9
10 /*
11 *************************************************************************
12 * 变量
13 *************************************************************************
14 */
15
16 /* 定义线程控制块指针 */
17 static rt_thread_t led1_thread = RT_NULL;
18 static rt_thread_t led2_thread = RT_NULL;
19
20 /*
21 *************************************************************************
22 * 函数声明
23 *************************************************************************
24 */
25 static void led1_thread_entry(void* parameter);
26 static void led2_thread_entry(void* parameter);
27
28
29 /*
30 *************************************************************************
31 * main 函数
32 *************************************************************************
33 */
34 /**
35 * @brief 主函数
36 * @param 无
37 * @retval 无
38 */
39 int main(void)
40 {
41 /*
42 * 开发板硬件初始化,RTT 系统初始化已经在 main 函数之前完成,
43 * 即在 component.c 文件中的 rtthread_startup() 函数中完成了。
44 * 所以在 main 函数中,只需要创建线程和启动线程即可。
45 */
46
47 led1_thread = /* 线程控制块指针 */
48 rt_thread_create( "led1", /* 线程名字 */
49 led1_thread_entry, /* 线程入口函数 */
50 RT_NULL, /* 线程入口函数参数 */
51 512, /* 线程栈大小 */
52 3, /* 线程的优先级 */
53 20); /* 线程时间片 */
54
55 /* 启动线程,开启调度 */
56 if (led1_thread != RT_NULL)
57 rt_thread_startup(led1_thread);
58 else
59 return -1;
60
61 led2_thread = /* 线程控制块指针 */
62 rt_thread_create( "led2", /* 线程名字 */
63 led2_thread_entry, /* 线程入口函数 */
64 RT_NULL, /* 线程入口函数参数 */
65 512, /* 线程栈大小 */
66 4, /* 线程的优先级 */
67 20); /* 线程时间片 */
68
69 /* 启动线程,开启调度 */
70 if (led2_thread != RT_NULL)
71 rt_thread_startup(led2_thread);
72 else
73 return -1;
74 }
75
76 /*
77 *************************************************************************
78 * 线程定义
79 *************************************************************************
80 */
81
82 static void led1_thread_entry(void* parameter)
83 {
84 while (1)
85 {
86 LED1_ON;
87 rt_thread_delay(500); /* 延时 500 个 tick */
88
89 LED1_OFF;
90 rt_thread_delay(500); /* 延时 500 个 tick */
91
92 }
93 }
94
95 static void led2_thread_entry(void* parameter)
96 {
97 while (1)
98 {
99 LED2_ON;
100 rt_thread_delay(300); /* 延时 300 个 tick */
101 LED2_OFF;
102 rt_thread_delay(300); /* 延时 300 个 tick */
103 }
104 }
105 /****************************END OF FILE****************************/

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值