入职学习记录-RT-thread实时操作系统_1
线程的定义
创建线程首先要定义线程栈,在裸机系统中全局变量,局部变量及函数的返回值等都放在栈(栈是单片机RAM里一段连续的内存空间)中,且可以在启动文件里更改栈的大小。但对于多线程系统,每个线程是独立互不干扰的,因此需要为其分别分配栈空间,其他内容见代码注释。
extern rt_list_t rt_thread_priority_table[RT_THREAD_PRIORITY_MAX];//线程优先级表
ALIGN(RT_ALIGN_SIZE); //设置变量以多少个字节对齐,默认为4
rt_uint8_t rt_flag1_thread_stack[512];
rt_uint8_t rt_flag2_thread_stack[512];struct rt_thread rt_flag1_thread; //线程控制块
struct rt_thread rt_flag2_thread;/* 线程声明 */
void flag1_thread_entry(void *p_arg);
void flag2_thread_entry(void *p_arg);struct rt_thread
{void *sp; /* 线程栈指针 */void *entry; /* 线程入口地址,也是线程函数名*/void *parameter; /* 线程形参 */void *stack_addr; /* 线程起始地址 */rt_uint32_t stack_size; /* 线程栈大小,单位为字节 */rt_list_t tlist; /* 线程链表节点 */
};rt_thread_init( &rt_flag1_thread, /* 线程控制块 */flag1_thread_entry, /* 线程入口地址 */RT_NULL, /* 线程形参 */&rt_flag1_thread_stack[0], /* 线程栈起始地址 */sizeof(rt_flag1_thread_stack) ); /* 线程栈大小,单位为字节 */rt_list_insert_before( &(rt_thread_priority_table[0]),&(rt_flag1_thread.tlist) );/* 将线程插入到就绪列表 */rt_thread_init( &rt_flag2_thread, /* 线程控制块 */flag2_thread_entry, /* 线程入口地址 */RT_NULL, /* 线程形参 */&rt_flag2_thread_stack[0], /* 线程栈起始地址 */sizeof(rt_flag2_thread_stack) ); /* 线程栈大小,单位为字节 */
};
rt_list_insert_before( &(rt_thread_priority_table[1]),&(rt_flag2_thread.tlist) );rt_system_scheduler_start();//启动系统调度器/* 线程 1 */
void flag1_thread_entry( void *p_arg )
{for( ;; ){flag1 = 1;delay( 100 );flag1 = 0;delay( 100 );}
}/* 线程 2 */
void flag2_thread_entry( void *p_arg )
{for( ;; ){flag2 = 1;delay( 100 );flag2 = 0;delay( 100 );}
}
上述简单认识了一下线程的各个成员的用途以及相关函数如何使用,未完待续...