FreeRTOS入门与实践工程(1)

本文探讨了在编程中如何通过RTOS解决多任务间的同步问题,从轮询、中断、定时器驱动、状态机到多任务状态,以及最后的RTOS交叉执行,以降低任务间相互影响并实现高效并发处理。
摘要由CSDN通过智能技术生成

1、为什么学习RTOS

  一个妈妈需要给孩子喂饭,同时还需要回同事消息

1、在主函数中轮询

void main(void)
{
    while(1)
    {
        喂饭;
        回消息;
    }
}

这中方法的缺点:当喂饭/回消息时间过长时,会导致另一个任务等待的时间过久

2、使用中断(也可以称为前后台)

void main(void)
{
    while(1)
    {
        喂饭; //后台
    }
}

void 滴_中断()
{
    回消息; //前台
}

缺点:一直在运行喂饭,当有“滴”时,去运行回消息的任务,但是当某一次回消息时间过长时,会导致喂饭等等时间过长

3、定时器驱动

void main(void)
{
    while(1)
    {}
}

void 定时器_中断()
{
    static int cnt = 0;
    cnt++;
    if(cnt % 2 == 0)
    {
        喂饭;
    }
    if(cnt % 5 == 0)
    {
        回消息;
    }
}

缺点:当某次回消息的时间过长,会阻碍喂一口饭

以上方法都无法解决俩个任务之间的相互影响。

4、基于状态机

       当“喂饭”“回消息”都需要花很长的时间,无论前面的那种设计模式,都会退化到轮询模式的缺点:函数相互之间有影响。可以使用状态机来解决这个缺点:

//状态机
void main(void)
{
    while(1)
    {
        喂饭();
        回消息();
    }
}
//2个函数的内部实现:使用状态机,每次只执行一个状态的代码,减少每次执行的时间

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;
        }
    }
}

这种方法可以使两种任务相互之间的影响降低,但是这种方法需要将任务拆分成若干个状态,当遇到较为复杂的任务时,没法将任务拆分

5、多任务状态

RTOS 交叉执行

//RTOS
喂饭任务()
{
    while(1)
    {
        喂饭();
    }
}

回消息()
{
    while(1)
    {
        回消息();
    }
}

void main()
{
    //创建2个任务
    create_task(喂饭任务);
    create_task(回消息);

    //启动调度器
    start_scheduler();
}

多任务系统会依次给这些任务分配时间:你执行一会,我执行一会,如此循环,只要切换的间隔足够短,用户会“感觉这些任务在同时运行”。

总:所以复杂的程序还是需要使用RTOS

1.1 课程内容嵌入式软件工程师的学习路线一般是:单片机、RTOS、Linux。当你掌握单片机开发后,如果要进一步提升编程水平,建议学习RTOS(Real Time Operating System,实时操作系统)。有很多优秀的RTOS,比如FreeRTOS、RT-Thread、UCOS等等。FreeRTOS使用范围最广泛,RT-Thread生态丰富,UCOS是收费的并且很少使用了。对于初学者,建议先学习FreeRTOS。只要学会了任意一款RTOS,肯定就会使用其他RTOS了。我们在2022年已经推出了“FreeRTOS快速入门”课程。为何还要重新制作“FreeRTOS入门工程实践”?“FreeRTOS快速入门”只是讲解FreeRTOS的各类API的理论、用法、示例,这些实验是基于Keil自带的STM32F103模拟器。没有使用更多的硬件模块、不能体现工作中的实际场景。在“FreeRTOS入门工程实践”,将引入更多的硬件模块,并展示实际工程示例中的用法。另外,基于RTOS的程序一般都比较复杂,涉及的源文件非常多,在工作中一般都基于“面向对象”的思想来写程序。所以,本课程会涉及如下内容:讲解FreeRTOS的常用API:理论、用法选择合适的硬件模块,展示这些API的实例实现合适的小项目,展示工作中的编程方法1.2 讲课方式对于每一个实验,我们会精心设计:要解决什么问题;然后讲解FreeRTOS提供的解决方法。讲解FreeRTOS的API及内部原理(不深入讲解内部源码,只是进行原理性介绍)讲解实验过程使用的模块的接口函数(只讲使用,不讲内部实现,模块的源码实现单独开课讲解)讲解原理时,配合着文档、现场画图进行讲解,跟学校老师写黑板一样最后现场从0编写程序并调试一切都是现场操作,绝对不会照着PPT念,绝对不会照着现成的代码讲解。只有现场从0操作,学员才能身临其境地学习,跟着教程:碰到问题、解决问题。1.3 硬件平台本课程基于DshanMCU-103开发套件进行开发,它由3部分组成:STM32F103C8T6的最小系统板、扩展底板、各类模块。如下图所示:  上述硬件再加一个ST-Link即可学完本课程所有内容。主板DshanMCU-103是基于STM32F103C8T6的最小系统板。之所以选择最小系统板,而不是把所有模块都放在一个整体的电路板上,目的如下:低成本尝试:嵌入式软件开发并不一定适合你,可以购买最小系统板进行体验、及时放弃按需购买:用到再买,讲究一个性价比 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值