线程的创建
线程的组成:
RT-Thread 中,线程由三部分组成:线程代码(入口函数)、线程控制块、线程堆栈。
线程代码
无限循环结构:
void thread_entry(void *parameter)
{
while(1)
{
/* 等待事件的发生*/
.
.
/* 处理事件*/
}
}
顺序执行结构:
void thread_entry(void *parameter)
{
/* 事务1处理*/
/* 事务2处理*/
.
.
/* 事务N处理*/
}
线程控制块
线程控制块是操作系统用于管理线程的一个数据结构, 它会存放线程的一些信息, 例如优先级、 线程名称、 线程状态等, 也包含线程与线程之间连接用的链表结构, 线程等待事件集合等。
struct rt_thread
struct rt_thread *rt_thread_t
线程栈
RT-Thread 每个线程都具有独立的栈空间, 当进行线程切换时, 系统会将当前线程的上下文保存在线程栈中, 当线程要恢复运行时, 再从线程栈中读取上下文信息, 恢复线程的运行。
线程上下文是指线程执行时的环境,具体来说就是各个变量和数据包括所有寄存器变量、堆栈信息、内存信息等。
线程栈在形式上是一段连续的内存空间 ,我们可以通过定义一个数组或者申请一段动态内存来作为线程的栈。
线程创建
创建静态线程:
rt_err_t rt_thread_init(struct rt_thread *thread,
const char *name,
void (*entry)(void *parameter),
void *parameter,
void *stack_start,
rt_uint32_t stack_size,v
rt_uint8_t priority,
rt_uint32_t tick)
创建动态线程:
rt_thread_t rt_thread_create(const char *name,
void (*entry)(void *parameter),
void *parameter,
rt_uint32_t stack_size,
rt_uint8_t priority,
rt_uint32_t tick)
启动线程
rt_err_t rt_thread_startup(rt_thread_t thread)
调用此函数后创建的线程会被加入到线程的就绪队列,执行调度
系统滴答时钟
每一个操作系统中都存在一个“系统心跳”时钟,是操作系统中最小的时钟单位。这个时钟负责系统和时间相关的一些操作。作为操作系统运行的时间尺度,心跳时钟是由硬件定时器的定时中断产生。
时钟节拍使得内核可以将线程延时若干个整数时钟节拍,以及线程等待事件发生时,提供等待超时的依据。
系统的心跳时钟我们也常称之为系统滴答,系统滴答的频率需要我们根据 cpu的处理能力来决定。
频率越快,内核函数介入系统运行的几率就越大,内核占用的处理器时间就越长,系统的负荷就变大;
频率越小,时间处理精度又不够;
在 stm32 平台上一般设置系统滴答频率为 100HZ,即每个滴答的时间是 10ms
GPIO驱动架构操作IO
IO初始化:
void rt_pin_mode(rt_base_t pin, rt_base_t mode)
//PIN_MODE_OUTPUT
//PIN_MODE_INPUT
//PIN_MODE_INPUT_PULLUP
//PIN_MODE_INPUT_PULLDOWN
//PIN_MODE_OUTPUT_OD
IO写入:
void rt_pin_write(rt_base_t pin, rt_base_t value)
//PIN_HIGH
//PIN_LOW
IO读出:
int rt_pin_read(rt_base_t pin)
线程栈大小设置使用率推荐为70%;