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 }

浙公网安备 33010602011771号