一种单任务系统时间片调度架构

前言:

        裸机开发软件架构处理不好,代码堆的越多,可读性越差,会显得代码很臃肿,后期不便于维护,同时也变相增加工作量,如果这样的代码交给下一个人维护,那简直是头大,恨不得重塑架构。

裸机时间片调度软件架构:

        首先要宏定义,代码如下:

#define SYSTICK_1S_FLAG (0)                         //1s
#define SYSTICK_2S_FLAG (1)                         //2s

#define APP_SET_BIT(val,bit)	val |= (1<<bit)		//置1		
#define APP_CLR_BIT(val,bit)	val &=~(1<<bit)		//清0
#define APP_TEST_BIT(val,bit)	val&(1<<bit)		//位测试

        定时器中断调用时钟节拍函数TIM6_TimeTick,这个函数也可以放在定时器回调函数,这里的定时器设置1ms一个周期,代码如下:

uint16_t u16_SysTickFlag;
void TIM6_TimeTick(void)
{		
	static uint16_t time_1s=0;
	static uint16_t time_2s=0;
	
	time_1s++;
	time_2s++;
	if(time_1s>=1000)
	{
		time_1s=0;
		APP_SET_BIT(u16_SysTickFlag,SYSTICK_1S_FLAG);
	}
	if(time_2s>=2000)
	{
		time_2s=0;
		APP_SET_BIT(u16_SysTickFlag,SYSTICK_2S_FLAG);
	}
}

        中断调用时钟节拍函数,代码如下:

void TIM6_IRQHandler(void)
{
  /* USER CODE BEGIN TIM6_IRQn 0 */

  /* USER CODE END TIM6_IRQn 0 */
  HAL_TIM_IRQHandler(&htim6);/
  TIM6_TimeTick();
}

        main函数按时间片调度执行任务,代码如下:

while(1)
{
	if(APP_TEST_BIT(u16_SysTickFlag,SYSTICK_1S_FLAG))
	{
		fun_task1();
		APP_CLR_BIT(u16_SysTickFlag,SYSTICK_1S_FLAG);
	}
	if(APP_TEST_BIT(u16_SysTickFlag,SYSTICK_2S_FLAG))
	{
		fun_task2();
		APP_CLR_BIT(u16_SysTickFlag,SYSTICK_2S_FLAG);
	}
    ...
    ...
}

        这样设计架构,主函数中就很清晰地看出不同时间片调度的任务函数,每个任务函数相当于一个模块,这样也更体现了模块化编程,条理清晰,思路明确。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值