嵌入式程序设计模式
这里只做一下简要表述,方便大家一眼找到自己在使用什么:
一、裸机模式
轮询执行,喂完饭,回信息,这样的能够处理基本的事情,点个灯,处理一个模块没有问题;
// 经典单片机程序: 轮询
void main()
{
while (1)
{
喂一口饭();
回一个信息();
}
}
二、前后台模式
这种前后台方式,会出现中断触发,停止喂饭的动作,因为中断的优先级是高于后台程序的。
// 前后台程序
void main()
{
while (1)
{
// 后台程序
喂一口饭();
}
}
// 前台程序
void 滴_中断()
{
回一个信息();
}
这种方式是让两种都进行中断,这个中断有优先级之分,优先级高的在执行,那么优先级低的就要等待,并不可靠;
// 前后台程序
void main()
{
while (1)
{
// 后台程序
}
}
// 前台程序
void 滴_中断()
{
回一个信息();
}
// 前台程序
void 啊_中断()
{
喂一口饭();
}
三、时间片管理方式:
这种适合定时完成任务。但是其中执行时间不能过长,因为这是一个定时器中断,执行时间过久,会出现阻塞。
// 前后台程序: 定时器驱动
void main()
{
while (1)
{
// 后台程序
}
}
// 前台程序: 每1分钟触发一次中断
void 定时器_中断()
{
static int cnt = 0;
cnt++;
if (cnt % 2 == 0)
{
喂一口饭();
}
else if (cnt % 5 == 0)
{
回一个信息();
}
}
四、状态机的方式:
这样把每一个模块划分为不同的状态,每次执行其中一个状态,本来一个事情需要1分钟,但是在状态机的条件下,执行了4步。每一步都需要15秒就能执行其他任务。
// 状态机
void main()
{
while (1)
{
喂一口饭();
回一个信息();
}
}
void 喂一口饭(void)
{
static int state = 0;
switch (state)
{
case 0:
{
/* 舀饭 */
/* 进入下一个状态 */
state++;
break;
}
case 1:
{
/* 喂饭 */
/* 进入下一个状态 */
state++;
break;
}
case 2:
{
/* 舀菜 */
/* 进入下一个状态 */
state++;
break;
}
case 3:
{
/* 喂菜 */
/* 恢复到初始状态 */
state = 0;
break;
}
}
}
void 回一个信息(void)
{
static int state = 0;
switch (state)
{
case 0:
{
/* 查看信息 */
/* 进入下一个状态 */
state++;
break;
}
case 1:
{
/* 打字 */
/* 进入下一个状态 */
state++;
break;
}
case 2:
{
/* 发送 */
/* 恢复到初始状态 */
state = 0;
break;
}
}
}
五、多任务系统:
裸机做完一件,做下一件。可以看到图中的“t”表示:
在RTOS中也可以看到“t”的实现
// RTOS程序
喂饭任务()
{
while (1)
{
喂一口饭();
}
}
回信息任务()
{
while (1)
{
回一个信息();
}
}
void main()
{
// 创建2个任务
create_task(喂饭任务);
create_task(回信息任务);
// 启动调度器
start_scheduler();
}
这个文章主要是简要记录一些基本程序,后面看到能够一眼找到自己在使用哪种方式;