杨为民 发表于 2023-8-6 14:35:38

STC32G FreeRTOS入门(4):实时任务

FreeRTOS是一款开源的专为小型嵌入式系统设计的可扩展的实时内核,已经被移植到STC最新的STC32G12K128单片机上了。在STC官网上给出了以STC32G实验箱为平台的FreeRTOS演示范例,该范例充分展示了FreeRTOS的特色、STC32G单片机的性能和STC32G实验箱的功能。本文以STC32G单片机上的具有三个实时任务的FreeRTOS程序为例,分部分介绍如何开始编写RTOS多任务程序。下面的视频为实际运行效果:
(1)视频右面是STC32G实验箱,上面闪烁的三个LED分别由三个实时任务独立控制。视频左面的是STC ISP上的串口助手,动态显示三个实时任务通过串口发送的任务循环计数信息。下图是截屏:
图中每个任务显示一行信息,后面的数字是该任务的循环计数值。(2)实时任务程序。下图是实时任务0的完整程序,每个任务程序与前两篇文章介绍的后台任务有相同的程序结构:有一个只执行一次的任务设置部分和一个无限循环任务程序部分。同后台任务一样,实时任务也不允许退出,用“return”语句退出任务函数将产生不可预料的危险后果。
(3)第40行是任务函数定义,由于历史的原因,常见的开源的RTOS任务函数都用一个任意指针作为参数,由任务调度程序在任务开始时向任务传送数据。在本例中它是一个空值。由于任务程序中没有使用这个参数,所以用第45行程序来欺骗编译器,免得产生参数未使用的错误信息,这是RTOS程序的一个惯例。(4)本任务函数使用了两个局部变量“Tick”和“TX_Buf”,第48行将Tick初始化位0。(5)第53行将对应任务0的LED0的电平翻转,产生LED闪烁。(6)根据前两篇文章的介绍,对于实时任务,各个任务可能被互相中断,所以应该采用输出缓冲区方法,使用“sprint+puts”来输出串口信息,这样各个任务之间的输出才是正确的。第59和60行输出任务0的循环计数值。(7)根据设计,任务0每秒做一次循环,任务程序从第53行开始到60行完成的执行时间为毫秒量级,离下次再次执行还有很多时间。如果是前面介绍的单个后台任务,可以用软件延时来等到下次重复,但对于RTOS实时多任务系统,实时任务0应该把CPU控制权交出来让CPU运行其他实时任务。第63行的RTOS任务休眠函数“uCx51_Task_Sleep_MS”就是告诉任务调度程序自己需要休眠多少毫秒,让任务调度函数将CPU控制权切换到别的任务。等到休眠够了时间,调度任务又会将任务切换回任务0,程序从休眠函数中退出下,继续执行下一行程序。任务休眠函数在FreeRTOS系统中为“vTaskDelay”,为了与我的其他文章相对应,本范例用宏替换语句替换为“uCx51_Task_Sleep_MS”。(8)下图是实时任务1和实时任务2的程序:
程序结构与实时任务0高的相似,就不一一介绍了。(9)定义任务。在RTOS建立实时一个实时任务,需要确定该任务的四个参数,下图是本范例的任务定义部分程序。
首先是任务堆栈大小。从前面可以看到实时任务包括了一个无限循环,如果剥夺了一个实时任务的执行权,就需要将该任务的执行现场保护起来,以便将来恢复该任务时可以恢复现场,从被中断的地方继续开始执行。执行现场包括两种,一个被中断时的各个通用寄存器的内容,它代表了CPU正在进行的操作,另一个是系统堆栈里的内容,它包含了函数嵌套访问的返回地址和临时变量的内容。因此每个实时任务都有一个对应的任务堆栈。对于STC32G单片机的一般任务,任务堆栈的大小一般设置为256个字节,见第35行程序。其次FreeRTOS是按任务优先级来调度任务的,优先级高的任务具有优先执行权,任务调度程序会剥夺优先级低的任务的执行权,让优先级高的任务运行。对于本版本的FreeRTOS,用户任务优先级的取值范围位1~31,本范例设计为Task0优先级最高,故各个任务的优先级分别为12、11、10(第38、43和48行程序)。另外,对每个任务还要指定一个任务句柄,FreeRTOS用它来指定任务管理的对象——对哪个任务进行操作。最后,对每个任务要指定一个任务函数,用户将每个任务需要实现功能的程序写在里面。
(10)建立任务。FreeRTOS用“xTaskCreate”函数来建立任务,对每个任务调用一次就可以建立起任务。本范例建立任务的程序见下图:
(11)当所有任务建立完成后,调用“vTaskStartScheduler()”函数后任务调度器就开始工作,将CPU的控制权交给各个任务。由于每个实时任务都有无限循环,不会退出,因此这个函数调用也绝不会返回,第111行以后的程序也不会得到执行。
(12)除了FreeRTOS系统需要初始化外,单片机硬件系统也需要初始化。因此像所有的单片机程序一样,本范例也包括了STC32G实验箱的初始化部分,见下图。
(13)最后介绍一下使用FreeRTOS开源软件需要许可说明。通常你需要注明你使用的FreeRTOS系统的来源,比如本范例使用的是STC官方移植的FreeRTOS版本。见下图

下面是本文范例程序:

llyymm 发表于 2023-8-6 23:21:11

讲的很好,我这个小白稍微有些懂了,还请继续后续的讲解!辛苦{:4_201:}

超级怪 发表于 2024-3-6 10:37:55

为什么下载不了啊

杨为民 发表于 2024-3-6 13:08:02

超级怪 发表于 2024-3-6 10:37
为什么下载不了啊

应该是实验箱的型号不一样

雨过天晴 发表于 2024-5-19 20:58:00

学习了,加油

雨过天晴 发表于 2024-5-19 20:58:02

学习了,加油

大锤子 发表于 2024-8-30 16:50:32

杨老师, 在大神们移植成功的基础上,如果我想重新组织代码结构,简单修改部分代码,然后上传到一些公共仓库开源。 需要注意哪些事项?
比如开源协议,我应该怎么声明,
直接通过一个文件声明注明使用的开源协议名称可以吗,需不需要一个文件详细描述开源协议内容?

杨为民 发表于 2024-8-30 18:42:54

大锤子 发表于 2024-8-30 16:50
杨老师, 在大神们移植成功的基础上,如果我想重新组织代码结构,简单修改部分代码,然后上传到一些公共仓 ...

问百度,学知识,打基础,勤实践

durongze 发表于 2024-9-5 08:06:17

这个讲的棒啊。我自己焊接了一个板子,重新配置一下管脚应该就可以了吧,晚点试试,看看好用不。
页: [1]
查看完整版本: STC32G FreeRTOS入门(4):实时任务