##单片机裸机开发时,要处理多个任务程序框架:
- 轮询系统
int main(void)
{
init_something();
while(1)
{
do_something1();
do_something2();
do_something3();
}
}
在没有外部事件驱动时,可以较好使用。
- 前后台系统
int flag1 = 0;
int flag2 = 0;
int flag3 = 0;
int main(void)
{
/* 硬件相关初始化 */
HardWareInit();
/* 无限循环 */
for (;;) {
if (flag1) {
/* 处理事情 1 */
DoSomething1();
}
if (flag2) {
/* 处理事情 2 */
DoSomethingg2();
}
if (flag3) {
/* 处理事情 3 */
DoSomethingg3();
}
}
}
void ISR1(void)
{
/* 置位标志位 */
flag1 = 1;
/* 如果事件处理时间很短,则在中断里面处理
如果事件处理时间比较长,在回到后台处理 */
DoSomething1();
}
void ISR2(void)
{
/* 置位标志位 */
flag2 = 2;
/* 如果事件处理时间很短,则在中断里面处理
如果事件处理时间比较长,在回到后台处理 */
DoSomething2();
}
void ISR3(void)
{
/* 置位标志位 */
flag3 = 1;
/* 如果事件处理时间很短,则在中断里面处理
如果事件处理时间比较长,在回到后台处理 */
DoSomething3();
}
此处,中断称为前台,main中的while循环称为后台。相比于循环系统,这种方式相对可以提高外部事件的实时响应能力。
-
升级版前后台系统(软件定时器法/时间片轮询法)
开源项目—— MultiTimer ,MultiTimer 是一个软件定时器扩展模块,可无限扩展你所需的定时器任务,取代传统的标志位判断方式, 更优雅更便捷地管理程序的时间触发时序。项目仓库地址:
https://github.com/0x1abin/MultiTimer
#include "multi_timer.h"
struct Timer timer1;
struct Timer timer2;
void timer1_callback()
{
printf("timer1 timeout!\r\n");
}
void timer2_callback()
{
printf("timer2 timeout!\r\n");
}
int main()
{
timer_init(&timer1, timer1_callback, 1000, 1000); //1s loop
timer_start(&timer1);
timer_init(&timer2, timer2_callback, 50, 0); //50ms delay
timer_start(&timer2);
while(1) {
timer_loop();
}
}
void HAL_SYSTICK_Callback(void)
{
timer_ticks(); //1ms ticks
}
参考链接:
link
. https://mp.weixin.qq.com/s/XgWKzsKgeBHesUL0FPYzTQ
版权声明:本文为xy_xm原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。