FreeRTOS

嵌入式程序设计模式

这里只做一下简要表述,方便大家一眼找到自己在使用什么:

一、裸机模式

轮询执行,喂完饭,回信息,这样的能够处理基本的事情,点个灯,处理一个模块没有问题;

while
回信息
喂饭
// 经典单片机程序: 轮询
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();
}

这个文章主要是简要记录一些基本程序,后面看到能够一眼找到自己在使用哪种方式;

百问网资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值