多任务多线程

多任务"并行处理"

首先我们来理解一下并行处理,初学者写程序通常是顺序执行,当我们逐渐想成为“专业”人士的时候顺序执行 的程序已经不能满足我们了,所以就需要多任务多线程系统,市面上标准的一些操作系统比如ucos,freeRTOS这些操作系统需要的学习周期长,范围广。在网上看到了一本书"单片机编程魔法师之高级裸编思想"在没学会ucos的阶段学习用这种思想过度感觉非常nice!

单片机是支持多任务同时并行地运行在一个系统中,在具体介绍之前先看一看单片机的硬件结构

lua stm32 多线程 stm32支持多线程吗_单片机


这个图中我们可以看出,单片机的运行是在ALU的主导下进行的;而定时器指是一个定时装置,它在定时计数期间是无需ALU干预的,完全独立运行;串口的通讯单元对数据的接收与发送也是完全独立完成的,并不需要ALU干预。很显然这三个任务是并行处理,切互不干涉,只有在定时器或串口产生中断时才会到代码中临时运行一段程序,已向单片机的主体运行过程交付一下结果,以便进行汇总处理。

微操作系统

简单一点来说就是一个while(1)但是while中我们采用多任务多线程的方式管理。首先我们要知道任务有生死,生死是一个过程所以具有寿命。

一个任务的线程:假设一个任务的执行代码有50步,通常编程只会一次执行完毕,但是我们现在需要想想,因为我们会嫌这个任务总占用着ALU的时间而影响其他任务的执行效果,所以就可以对任务进行划分,把它分为5份,每份10步,这样我们每次执行其中的一个程序片–每次正在运行的程序片我们称为线程。

lua stm32 多线程 stm32支持多线程吗_多任务_02


这个图很完美的解释了线程的运行原理。

具体线程的实现:

typedef struct{
	u8 isTask_Living;
	u8 Thread_Process;
}myTask;
void Task(void)
{
	if(Task.isTask_Living)
	{
	Task.isTask_Living = !myThread3(&Task3,&Task3.Thread_Process);
	}
}
/*初始化任务变量*/
void InitTask4(myTask4 *Task)
{
	Task->isTask_Living=1;
	Task->Thread_Process=0;
}

/*功能:任务线程
**参数:myTask:Task任务类型
**	  :Process:unsigned char*类型,线程指针
**返回值:CHAR类型,线程结束,或未结束
*/
static int myThread(myTask *Task,unsigned char *Process)
{
	int ret=0;
	switch(*Process)
	{
		case 0:
		//程序片1
		break;
		case 1:
		//程序片2
		break;
		case 2:
		//程序编3
		break;
		default:break;
	}
	(*Process)++;
	if(*Process>3)
	{
		ret = -1;
		*Process = 0;
	}
	return ret;
}

void TaskCommunication(void)
{
	if(Task.isTask_Living)
	{
	Task.isTask_Living = !myThread(&Task4,&Task4.Thread_Process);
	}
}

lua stm32 多线程 stm32支持多线程吗_lua stm32 多线程_03


lua stm32 多线程 stm32支持多线程吗_lua stm32 多线程_04


真正多任务处理的过程:

lua stm32 多线程 stm32支持多线程吗_多任务_05


仔细理解图上的内容对写多任务程序的结构很有好处。

加油吧骚年们!