RT-Thread------线程(1)

1. 线程概念

线程: 就是把整个系统分割成一个个独立且永不返回的函数, 这样的函数我们称之为线程.
//线程函数
void thread_entry(void *para)
{
   
	/* 线程主体, 死循环 */
	for (; ;) {
   
		/* 线程主体代码 */
	}
}

2. 线程创建

在多线程的系统中, 因每个线程都是独立的, 互不干扰, 因此, 每个线程需要有独立的栈空间, 这个栈空间说白了就是预先定义的全局数组, 可以在程序运行时动态分配, 殊路同归, 都是在位于 RAM 中的一段连续空间.

2.1 定义线程栈

/* 设置变量的对齐方式, 对在它下面的变量起作用, 此处为 4 字节对齐 */
 __attribute__((aligned(4)))   
/* 定义线程栈, 定义两个全局数组, 大小设置为 512, 即栈空间为 512 字节 */
unsigned char thread_task1_stack[512];
unsigned char thread_task1_stack[512];

2.2 定义线程函数

/**
 * @brief 此处定义了 2 个 线程, 其用途是延时改变 flag1, flag2 的值.
 *
 */
/* 延时函数 */
void delay(unsigned int count)
{
   
	for (; count != 0; count --);
}

/* 任务 1 线程 */
void task1_thread_entry(void *para)
{
   
	for (; ;) {
   
		flag1 = 1;
		delay(1000);
		flag1 = 0;
		delay(1000);
	}
}


/* 任务 2 线程 */
void task2_thread_entry(void *para)
{
   
	for (; ;) {
   
		flag2 = 1;
		delay(1000);
		flag2 = 0;
		delay(1000);
	}
}

2.3 定义线程控制块

线程控制块是系统为了顺利的调度线程, 为每一个线程额外定义了一个线程控制块, 相当于线程的标识符, 里面存放线程的所有信息, 如线程的栈指针, 线程名称, 线程参数等. 有了这个控制块后, 系统对线程的所有操作都可以通过这个线程控制块来实现.
/* 线程控制块结构体 */
struct rt_thread
{
   
	void *sp;                          // 线程栈指针
	void *entry;                     // 线程入口地址 (即线程函数)
	void *parameter;            // 线程形参
	void *stack_addr;           // 线程栈起始地址
	unsigned int stack_size; //线程栈大小, 单位为字节
	
	rt_list_t	tlist;				// 线程链表节点
};
typedef struct rt_thread *rt_thread_t;


/* 线程控制块定义 */
struct rt_thread	rt_task1_thread;
struct rt_thread	rt_task1_thread;

2.4 创建线程函数

线程的栈, 线程的函数实体, 线程控制块, 最终需要联系起来才能由系统调度器进行调度. 那
么就由线程初始化函数 rt_thread_init() 来实现联系.
long 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值