前言
单片机逻辑开发框架,轮询,前后台,利用定时器的前后台
提示:以下是本篇文章正文内容,下面案例可供参考
一、轮询
该方法比较简单,在main函数内执行while(1),在while内顺序执行函数
void main(void)
{
//外设初始化
xx_Init();
while(1)
{
a();
b();
c();
}
}
二、前后台
中断为后台,在中断内更新全局变量,利用全局变量判断要更新那个函数
代码如下(示例):
volatile BOOL bFlag;//volatile 修饰变量,执行时直接从内存获取变量值
void xxx_IRQHandler(void)
{
bFlag = true;
}
void xxx_IRQHandler(void)
{
bFlag = true;
}
void main(void)
{
//外设初始化
xx_Init();
while(1)
{
if(true == bFlag)
{
bFlag = false;
a();
}
}
}
三、利用定时器的前后台系统
定时器可以为普通定时器,也可以为滴答定时器
函数周期运行的方法可以为定时器中断函数内对全局变量a计数,在主循环内获取计数值,根据a的值,计算出决定执行哪些函数
volatile unsigned short a = 0;
void TIME1_IRQHandler()
{
a++;
}
//假设定时器配置为1ms中断一次
void main(void)
{
xxx_Init();//外设初始化
//函数执行周期根据实际情况
while(1)
{
if(0 == (a%2))
{
Fun_2ms();
}
if(0 == (a%4))
{
Fun_4ms();
}
}
}
四、时间片调度
第三种方式有缺陷(时间调度不一定准确,遇到执行时长高的函数会导致一些函数不能及时进行),推荐使用第四种方式。
/* 结构体 */
typedef struct __TIME_SLICE_SCHEDULING__
{
void (*handler)(void); /* 周期执行函数 */
uint16_t timeout; /* 超时时间 */
uint16_t timer_cnt; /* 时间片计数 */
uint16_t run_times; /* 最大运行次数,0为无限次 */
uint16_t run_cnt; /* 运行次数计数,无限次时不计数 */
volatile uint16_t run_flag; /* 运行标志,非零表示超时时间到达 */
}TIME_SLICE_SCHEDULING;
#define TIME_SLICE_SCHEDULING_TASKS 6 /* 假如有6组任务 */
TIME_SLICE_SCHEDULING g_time_slice_tasks[TIME_SLICE_SCHEDULING_TASKS];
/* 该函数放在滴答定时器内,实现时间片的时间基准。即对时间片的一些变量进行处理 */
void bsp_delay_base(void)
{
uint8_t i;
for ( i = 0; i < TIME_SLICE_SCHEDULING_TASKS; i++)
{
g_time_slice_tasks[i].timer_cnt++;
if (g_time_slice_tasks[i].timer_cnt >= g_time_slice_tasks[i].timeout)
{
g_time_slice_tasks[i].timer_cnt = 0;
g_time_slice_tasks[i].run_flag = 1;
}
}
}
/* main函数 */
void main(void)
{
Init_xxx();
while (1U)
{
for (task_index = 0; task_index < TIME_SLICE_SCHEDULING_TASKS; task_index++)
{
if (1 == g_time_slice_tasks[task_index].run_flag)
{
g_time_slice_tasks[task_index].run_flag = 0;
g_time_slice_tasks[task_index].run_cnt++;
if ((0 == g_time_slice_tasks[task_index].run_times)||(g_time_slice_tasks[task_index].run_cnt <= g_time_slice_tasks[task_index].run_times))
{
g_time_slice_tasks[task_index].run_cnt = g_time_slice_tasks[task_index].run_times + 1;
if (g_time_slice_tasks[task_index].handler)
{
g_time_slice_tasks[task_index].handler();
}
}
}
}
}
}
也可以参考:GitHub - 0x1abin/MultiTimer: Software timers extend module for embedded
总结
无。