物联笔记-1

学习韦东山老师的课程,从裸机到RTOS,有代码分层思想,有网络通信讲解,中间还直播了一次手写RTOS任务切换,最近这段时间恰好遇到工作比较忙,总是抽间隙时间断断续续的观看,但是总的来说还是有不少实在的收获,结合这几天的观看以及个人的理解,总结一下:

我们在玩单片机的时候,普通玩法通常都是前后台程序做法

--> 在各外设中断服务程序中处理紧急事务

--> 在main -> while(1) {.....} 大循环中处理不紧急的任务

情形一:在串口中断服务程序中接收数据

void USART1_IRQHandler(void)
{
	...                            //检测&清除标志
	push_buf[...] = USART1->DR;    //接收数据 
}

在main 的大循环中处理接收到的数据

int main(void)
{
	uint8_t read = 0;
	while(1)
	{
		read = pop_buf[...]       //读取接收字节
		....read....              //处理read
	}
}

但是在遇到多任务,或者不同优先级任务的适合,就有点为难了,可以采用开多个中断的方式实现

情形二:多个中断处理

void USART1_IRQHandler(void)
{
	...                            //检查&清除标志
	push_buf[...] = USART1->DR;    //接收数据 
}
void TIM2_IRQHandler(void)
{
	...                            //检查&清除标志
	read...write...;               //处理数据 
}
void EXTI0_IRQHandler(void)
{
	...                            //检查&清除标志
	read...write...;               //处理数据 
}
int main(void)
{
	uint8_t read = 0;
	while(1)
	{
		process_usart();
		process_timer();
		process_exit();  
	}
}

这种情况下,通过多个中断设置不同优先级分别处理不同的任务,可以显著增强CPU处理能力,但是如果任务数量很多的话,CPU的开销也很庞大,而且像定时器这种中断,不管有没有需要,都会固定时间进入,对CPU也是一种浪费。为了解决这个问题,可以引入RTOS。

场景三:引入RTOS前先记录一下巧妙的“时间片任务”实现,这是我乱取的名字 ヾ(≧▽≦*)o,意思就是通过时间片段模拟多任务执行的函数:

首先定义软件任务结构:一个时间片计数器:count,一个任务执行周期:period,一个任务函数

typedef struct soft_task
{
	int count;
	int period;
	void  (*function)(void);        
}soft_task, *p_soft_task;
#define TASK_NUM  3  

实例化任务数组,创建三个软件任务,

task_a, 10个时间片,间隔周期最短,相当于优先级最高

task_c, 30个时间片,间隔周期最长,相当于优先级最低

void TIM1_UP_IRQHandler() 
{
	int i;
	for (i = 0; i < TASK_NUM ; i++)
		if (tasks[i].count)
		tasks[i].count--;    
}

在定时器中,对每个软件任务的时间片进行减减,如果到0了就停止减减,表示该任务可以执行了

void main()
{
	int i;
    while (1)
	{
		for (i = 0; i < TASK_NUM ; i++)
		{
			if (tasks[i].count== 0)                //如果时间片减到0
			{
				tasks[i].function();               //执行任务函数
				tasks[i].count= timers[i].period;  //重新恢复时间周期
			}
		}
	}
}

在main函数中轮询判断各个软件任务的时间片是否为0,若为0则执行该任务函数,这样就可以在单线程的情况下,虚拟出多任务的场景应用,这是一个非常有意思的做法,大爱,但这个实现方式的缺点也是一样的:CPU的效率无法最大化利用,在不同任务的时间片减减中,浪费了大量的CPU资源,而且无法及时响应紧急任务的执行,所以还是得引入真正的RTOS才行。第一次笔记先到这里,RTOS的引入和实现放到后面接着写!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值