標簽:形參 頭文件 數據結構 list tar star ret def 用戶
在多線程系統中,每個線程都是獨立的,互不幹擾的,所以要爲每個線程都分配獨立的棧空間,每個棧空間通常是預先定義好的全局數組,也可以是動態分配的一段內存空間,但他們都存于RAM中。
在多線程系統中,有多少個線程就需要定義多少個線程棧。
1 ALIGN(RT_ALIGN_SIZE)// (2) 2 /* 定義線程棧 */ 3 rt_uint8_t rt_flag1_thread_stack[512];// (1) 4 rt_uint8_t rt_flag2_thread_stack[512];
线程栈其实就是一个预先定义好的全局变量。在RT-Thread中,凡是涉及到数据类型的地方,RT-Thread 都会将标准的C数据类型用typedef重新取一个类型名,以“rt”前缀开头。这些经过重定义的数据类型放在rtdef.h。
ALIGN是一個帶參宏,設置變量需要多少個字節對齊,對在它下面的變量起作用。
RT_ALIGN_SIZE 是一个在rtconfig.h中定义的宏,默认为4,表示4个字节对齐。
線程是一個獨立的函數,函數主體無限循環且不能返回。
在多线程系统中,线程的执行是由系统调度的。系统为了顺利的调度线程,为每个线程都额外定义了一个线程控制块,这个线程控制块就相当于线程的身份证,里面存有线程的所有消息,比如线程的栈指针,线程名称,线程的形參等。有了这个线程控制块之后,以后系统对线程的全部操作都可以通过这个线程控制块来实现。定义一个线程控制块需要一个新的数据类型,该数据类型在rtdef.h这个頭文件中声明,使用它可以为每个线程都定义一个线程控制块实体。
struct rt_thread// (1) { 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;
在RT-Thread中,都会给新声明的數據結構重新定义一个指针。往后如果要定義線程控制塊变量就使用struct rt_thread xxx 的形式,定義線程控制塊指针就使用rt_thread_t xxx 的形式。
/* 定義線程控制塊 */ struct rt_thread rt_flag1_thread; struct rt_thread rt_flag2_thread;
線程的棧,線程的函數實體,線程的控制塊,最終需要聯系起來才能由系統進行統一調度。那麽這個聯系的工作就由線程初始化函數rt_thread_init()來實現,該函數在thread.c中定義,在rtthread.h中聲明,所有跟線程相關的函數都在這個文件定義。rt_thread_init()函數的實現:
rt_err_t rt_thread_init(struct rt_thread *thread, // (1) void (*entry)(void *parameter), // (2) void *parameter, // (3) void *stack_start, // (4) rt_uint32_t stack_size) // (5) { rt_list_init(&(thread->tlist)); // (6) thread->entry = (void *)entry; // (7) thread->parameter = parameter; // (8) thread->stack_addr = stack_start; // (9) thread->stack_size = stack_size; // (10) /* 初始化线程栈,并返回線程棧指針 */ // (11) thread->sp = (void *)rt_hw_stack_init( thread->entry, thread->parameter, (void *)((char *)thread->stack_addr +thread->stack_size - 4) ); return RT_EOK; // (12) }
遵循RT-Thread 中的函数命名规则,以小写的rt开头,表示这是一个外部函数,可以由用戶调用,以_rt 开头的函数表示内部函数,只能由RT-Thread内部使用。紧接着是文件名,表示该函数放在那个文件,最后是函数功能名称。
(1)thread 是线程控制块指针。
(2)entry 是线程函数名,表示线程的入口。
(3)parameter 是线程形參,用于传递线程参数。
(4)stack_start 用于指向栈的起始地址。
(5)stack_size 表示线程栈的大小,单位为字节。
標簽:形參 頭文件 數據結構 list tar star ret def 用戶
原文地址:https://www.cnblogs.com/tansuoxinweilai/p/14947710.html