关于rt-thread调度器实现的底层代码分析

本文通过对rt-thread调度器的分析,详细介绍了如何从rt_thread_delay()函数入手,理解调度器的工作原理。实验中使用三个线程和系统钩子函数,展示了线程调度、优先级判断以及上下文切换的过程,特别强调了位图算法在优先级管理中的作用。
摘要由CSDN通过智能技术生成

       本文使用了rt-thread自带的钩子函数和显示函数进行了实验,从rt-thread自带的延时函数rt_thread_delay()函数入手,对rt-thread系统的调度器进行分析。主要参考资料是野火的rt-thread手册和rt-thread官方文档,汇编部分的指令是参考的cortex-M3权威参考手册,实验版本是rt-thread3.1.5 

1、实验准备

  1.    使用三个线程,内部调用延时函数,每个线程内部延时1s。
  2.    使用系统自带的钩子函数,在调度器实现调度的时候打印线程状态和名称。
  3.    使用系统自带的调试函数,打印出 to thread 和 from thread 的名称与优先级以及remove thread 和 insert thread。

 主要代码如下

                main.c的代码部分     

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>



/*线程控制块*/
static rt_thread_t Task1 = RT_NULL;
static rt_thread_t Task2 = RT_NULL;
static rt_thread_t Task3 = RT_NULL;

/*线程入口函数*/
static void Task1_thread_entry(void* parameter);
static void Task2_thread_entry(void* parameter);
static void Task3_thread_entry(void* parameter);


/*钩子函数钩上的函数*/
void task_inithock(rt_thread_t thread)
{
	rt_kprintf("%s start\r\n",thread->name);
}

void task_suspendhock(rt_thread_t thread)
{
	rt_kprintf("%s suspend\r\n",thread->name);
}

void task_resumehock(rt_thread_t thread)
{
	rt_kprintf("%s resume\r\n",thread->name);
}

int main(void)
{
			rt_thread_inited_sethook(task_inithock);
			rt_thread_suspend_sethook(task_suspendhock);
			rt_thread_resume_sethook(task_resumehock);
	
		    /*创建线程1*/
			Task1 = rt_thread_create("task1",
															Task1_thread_entry,
															RT_NULL,
																	512,
																	20,
																	200);
				if(Task1 != RT_NULL)
					rt_thread_startup(Task1);
					else
						return -1;
			
				/*创建线程2*/
			Task2 = rt_thread_create("task2",
															Task2_thread_entry,
															RT_NULL,
																	512,
																	28,
																	200);		
					if(Task2 != RT_NULL)
					rt_thread_startup(Task2);
					else
						return -1;
				
				/*创建线程3*/
			Task3 = rt_thread_create("task3",
															Task3_thread_entry,
																	RT_NULL,
																	512,
																	22,
																	200);
					if(Task3 != RT_NULL)
					rt_thread_startup(Task3);
					else
						return -1;	
						rt_kprintf("开始执行\r\n");
		}

		static void Task1_thread_entry(void* parameter)//优先级25
		{
			int i = 0;
				while(1)
				{
					rt_kprintf("           任务一开始执行           \r\n");
					rt_thread_mdelay(1000);
					rt_kprintf("           任务一执行完毕           \r\n");
						
				}
		}

		static void Task2_thread_entry(void* parameter)//优先级28
		{
			int i = 0;
				while(1)
				{
					rt_kprintf("           任务二开始执行           r\n");
					rt_thread_mdelay(1000);
					rt_kprintf("           任务二执行完毕           \r\n");					
				}
		}

		static void Task3_thread_entry(void* parameter)//优先级为22
		{
				while(1)
				{
					rt_kprintf("           任务三开始执行           \r\n");
					rt_thread_mdelay(1000);
					rt_k
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值