freertos 系统架构(手把手教你学嵌入式操作系统FreeRTOS)

十年工作经验,主持设计多个爆款智能硬件,老司机带你飞,快上车,麻烦点个关注。

freertos 系统架构(手把手教你学嵌入式操作系统FreeRTOS)(1)

今天狗哥开始正式跟大家一起学习FreeRTOS这一实时操作系统,这节课我们学习FreeRTOS最基本的任务控制。

任务概述

FreeRTOS中资源的分配是以任务为依托的,每个任务占用独立的任务栈空间,独占一部分资源,在CPU的调度下独立运行,你可以想象是一个旅馆,有好多独立的空房间,房间里面有电视、床、水、沙发等资源,可以多个人入住不同的房间,互不影响。

我们编写软件的时候是以任务为基本模块单元的,这会极大的方便我们抽象任务,提高开发效率。举个栗子,我们接到任务,要开发一个数据采集器,通过串口接收和发送命令,采集ADC数据。

那么很自然的我们就想到,把需求抽象为两大任务:串口任务和ADC任务。下面我们来看看如何创建任务。

创建任务

freertos 系统架构(手把手教你学嵌入式操作系统FreeRTOS)(2)

//定义串口任务优先级、任务栈空间

osThreadDef(UART_TASK, uart_task, osPriorityNormal, 0,configMINIMAL_STACK_SIZE);

//创建串口任务

Uart_ThreadHandle = osThreadCreate(osThread(UART_TASK), NULL);

这两条语句就可以创建一个任务,是不是很简单,我们来分析下各个参数

osThreadDef函数用来定义任务所需要的名称,任务优先级,栈空间等信息。

1、任务名称:自己定义,这里我们定义为UART_TASK

2、任务函数:这里我们定义为uart_task

3、任务优先级:这里我们定义为normal的等级

4、线程实例个数:这个暂时用不到,置0

5、任务栈大小:我们按默认最小值

osThreadCreate这个函数用来创建线程空间,让我们的任务运行,这个函数只有两个参数

1、定义的线程:我们上一个函数里定义的线程,也就是UART_TASK

2、线程参数:暂时用不到,NULL

好了,这两个函数写好后,标识我们任务运行的线程空间已经构建好了,相当于房间开好了,接下来,就要写我们具体的任务了。

一个典型的任务框架是这样的

void uart_task(void const *arg)

{

for(;;)

{

//TODO:

printf("uart task running ");

}

}

这里的uart_task就是我们刚才定义线程空间时传入的参数,也就是说这个线程空间是uart_task这个任务所独占的。需要注意的是任务函数是永不返回的,任务之间的切换是由调度器来控制的。

启动调度器

freertos 系统架构(手把手教你学嵌入式操作系统FreeRTOS)(3)

osKernelStart();

这个函数用来启动调度器,调度器开启后,整个系统就由调度器接手了,她来决定让哪一个任务来运行,后面我们都会详细讲到。

总结

要启动一个任务,首先要定义线程空间,然后要定义任务函数,写自己的业务逻辑,启动调度器,大功告成。

这个过程就像去住宾馆,先要确定好自己住大床房还是标间,也就是定义线程空间;之后就要定义任务函数,也就是想好到房间里是洗澡还是看电视,写自己的业务逻辑;最后一步就是启动调度器,到前台取房卡。

今天的作业:大家创建一个自己的任务并运行起来。

今天的课不知道狗哥讲明白了没有,有什么建议大家尽管在评论区提出来,狗哥不断改进。还有一点就是希望大家踊跃发言,下节课是继续往下讲还是希望继续深入分析任务创建。没啥讲课经验,尽可能的把自己的意思表达出来,有不足的地方还希望大家海涵,谢谢各位!

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。