9.3 多任务的裸机实现(下):状态机

本文详细探讨了如何在裸机环境下通过状态机设计实现多任务处理,特别是针对长延时任务的分解策略。实例涉及厨师与顾客交互,并展示了如何用状态机处理数码管刷新、按键操作。核心代码片段提供了状态机在`task1`和`task2`中的应用。
摘要由CSDN通过智能技术生成

9.3 多任务的裸机实现(下):状态机

长延时任务的分解

将运行时间较长的任务分解为多个子任务
举例:厨师与顾客i

多任务的状态机实现

解决方案
数码管显示:每次只刷新一个数码管
按键扫描:按键按下、按键消抖、按键释放

裸机状态机例程


/************************************************
*      Filename: state_machine.c
*        Author: litao.wang
*   Description: 
*        Create: 2018-07-11 17:29:08
* Last Modified: 2018-07-31 21:47:30
*************************************************/
#include<stdio.h>

unsigned int count;
void rtc_interrupt(void)
{
	for(int i=0;i<500000;i++)
		;		
	count++;
}

void task1(void)
{
	static int task1_state=0;
	switch(task1_state){	//进入一次只处理一个状态
		case 0:
			task1_state++;
			printf("task1:step 0\n");
			break;
		case 1:
			task1_state++;
			printf("task1:step 1\n");
			break;
		case 2:
			task1_state++;
			printf("task1:step 2\n");
			break;
		case 3:
			task1_state++;
			printf("task1:step 3\n");
			break;
		default:
			printf("task1: undefined step\n");
			break;
	}
}
void task2(void)
{
	static int task2_state=0;
	switch(task2_state){
		case 0:
			task2_state++;
			printf("task2:step 0\n");
			break;
		case 1:
			task2_state++;
			printf("task2:step 1\n");
			break;
		case 2:
			task2_state++;
			printf("task2:step 2\n");
			break;
		case 3:
			task2_state++;
			printf("task2:step 3\n");
			break;
		default:
			printf("task2: undefined step\n");
			break;
	}
}


int main(void)
{
	while(1)
	{
		if(count%1000==0)
			task1();

		if(count%2000==0)
			task2();
		rtc_interrupt();
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值