线程的概念:
在裸机系统中,系统的主体就是 main 函数里面顺序执行的无限循环,这个无限循环里面 CPU 按 照顺序完成各种事情。在多线程系统中,我们根据功能的不同,把整个系统分割成一个个独立的 且无法返回的函数,这个函数我们称为线程。
RT_Thread线程三要素:线程函数、线程控制块、线程堆栈。
线程代码:无限循环结构、顺序执行结构。
void thread_entry(void *paramter)
{
while(1)
{
/*等待事件的发生*/
/*处理事件*/
}
}
void thred_entry(void *paramter)
{
/*事务1处理*/
/*事务n处理*/
}
线程控制块:
操作系统用于管理线程的一个数据结构,它会存放线程的一些信息。
struct rt_thread
struct rt_thread *rt_thread_t
rt_thread_create() 创建一个动态线程,使用 rt_thread_init() 初始化一个静态线程,动态线程与静态线程的区别是:动态线程是系统自动从动态内存堆上分配栈空间与线程句柄(初始化 heap 之后才能使用 create 创建动态线程),静态线程是由用户分配栈空间与线程句柄。
线程堆栈:
RT_Thread每个线程都具有独立的栈空间,线程上下文是指线程执行时的环境,线程栈的形式上是一段连续的内存空间,我们可以通过定义一个数组或申请一段动态内存作为线程的栈。
线程的创建:
1、定义线程栈:在裸机系统中,他们统统放在一个叫栈的地 方,栈是单片机 RAM 里面一段连续的内存空间,栈的大小一般在启动文件或者链接脚本里面指 定,最后由 C 库函数 _main 进行初始化。
在多线程系统中,每个线程都是独立的,互不干扰的,所以要为每个线程都分配独立的栈 空间,这个栈空间通常是一个预先定义好的全局数组,也可以是动态分配的一段内存空间,但它 们都存在于 RAM 中。每个变量对应n个线程,那么就需要定义 n个线程栈。
ALIGN(RT_ALIGN_SIZE)//
/* 定义线程栈 */
rt_uint8_t rt_flag1_thread_stack[512];)
rt_uint8_t rt_flag2_thread_stack[512]
2、定义线程函数:
/* 线程 1 */
void flag1_thread_entry( void *p_arg )// (1)
{
for( ;; )
{
flag1 ==== 1;
delay( 100 );
flag1 ==== 0;
delay( 100 );
/* 线程切换,这里是手动切换 */
rt_schedule();
}
}
/* 线程 2 */
void flag2_thread_entry( void *p_arg )// (2)
{
for( ;; )
{
flag2 ==== 1;
delay( 100 );
flag2 ==== 0;
delay( 100 );
/* 线程切换,这里是手动切换 */
rt_schedule();
34 }
3、线程线控制块
struct rt_thread//
{
void *sp; /* 线程栈指针 */
void *entry; /* 线程入口地址 */
void *parameter; /* 线程形参 */
void *stack_addr; /* 线程起始地址 */
rt_uint32_t stack_size; /* 线程栈大小,单位为字节 */
rt_list_t tlist; /* 线程链表节点 */
};
typedef struct rt_thread *rt_thread_t;//
/* 定义线程控制块 */
struct rt_thread rt_flag1_thread;
struct rt_thread rt_flag2_thread;
线程的状态:
线程间同步:
1、信号量:
函数:
//创建
rt_sem_t rt_sem_create(const char *name,
rt_uint32_t value,
rt_uint8_t flag);
2、互斥量:
(1)函数:
3、事件: