5.18 野火rt-thread读书笔记

在5.07的笔记里已经完成了基于任务调度的程序框架,我们来具体分析一下。

建立main函数:

 1 #include "rtthread.h"
 2 #include "ARMCM3.h"
 3 rt_uint8_t flag1;
 4 rt_uint8_t flag2;
 5 extern rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];
 6 /* 定义线程控制块*/
 7 struct rt_thread rt_flag1_thread;
 8 struct rt_thread rt_flag2_thread;
 9 ALIGN(RT_ALIGN_SIZE)
10 /* 定义线程栈*/
11 rt_uint8_t rt_flag1_thread_stack[512];
12 rt_uint8_t rt_flag2_thread_stack[512];
13 /* 线程声明*/
14 void flag1_thread_entry(void *p_arg);
15 void flag2_thread_entry(void *p_arg);
16 函数声明
17 void delay(uint32_t count);
18 
19 int main(void)
20 {
21  /* 硬件初始化*/
22 /* 将硬件相关的初始化放在这里,如果是软件仿真则没有相关初始化代码*/
23 /* 调度器初始化*/
24 rt_system_scheduler_init();
25 /* 初始化线程*/
26 rt_thread_init( &rt_flag1_thread,flag1_thread_entry,RT_NULL,
27 &rt_flag1_thread_stack[0],sizeof(rt_flag1_thread_stack) );
28 
29 rt_list_insert_before( &(rt_thread_priority_table[0]),&(rt_flag1_thread.tlist) );
30 rt_thread_init( &rt_flag1_thread,flag2_thread_entry,RT_NULL,
31 &rt_flag1_thread_stack[0],sizeof(rt_flag2_thread_stack) );
32 rt_list_insert_before( &(rt_thread_priority_table[1]),&(rt_flag2_thread.tlist) );
33 rt_system_scheduler_start();
34 }
35 
36 void delay (uint32_t count)
37 {
38 for(; count!=0; count--);
39 }
40 void flag1_thread_entry( void *p_arg )
41 {
42  for( ;; )
43  {
44  flag1 = 1;
45 delay( 100 );
46  flag1 = 0;
47  delay( 100 );
48 
49  /* 线程切换,这里是手动切换*/
50 rt_schedule();// (注意)
51 }
52 
53 }
54 void flag2_thread_entry( void *p_arg )
55 {
56  for( ;; )
57  {
58  flag2 = 1;
59 delay( 100 );
60  flag2 = 0;
61  delay( 100 );
62 
63  /* 线程切换,这里是手动切换*/
64 rt_schedule();// (注意)
65 }
66 
67 }

 

posted @ 2021-05-18 23:03  大木繁生  阅读(201)  评论(0)    收藏  举报