找回密码
 立即注册
查看: 815|回复: 3

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

[复制链接]

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10906
发表于 2023-8-6 14:35:38 | 显示全部楼层 |阅读模式
FreeRTOS是一款开源的专为小型嵌入式系统设计的可扩展的实时内核,已经被移植到STC最新的STC32G12K128单片机上了。在STC官网上给出了以STC32G实验箱为平台的FreeRTOS演示范例,该范例充分展示了FreeRTOS的特色、STC32G单片机的性能和STC32G实验箱的功能。
本文以STC32G单片机上的具有三个实时任务的FreeRTOS程序为例,分部分介绍如何开始编写RTOS多任务程序。
下面的视频为实际运行效果:

(1)视频右面是STC32G实验箱,上面闪烁的三个LED分别由三个实时任务独立控制。视频左面的是STC ISP上的串口助手,动态显示三个实时任务通过串口发送的任务循环计数信息。
下图是截屏:
Fig_14_串口截屏.jpg
图中每个任务显示一行信息,后面的数字是该任务的循环计数值。
(2)实时任务程序。下图是实时任务0的完整程序,每个任务程序与前两篇文章介绍的后台任务有相同的程序结构:有一个只执行一次的任务设置部分和一个无限循环任务程序部分。同后台任务一样,实时任务也不允许退出,用“return”语句退出任务函数将产生不可预料的危险后果。
Fig_X02_实时任务.jpg
(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的程序:
Fig_X03_任务12.jpg
程序结构与实时任务0高的相似,就不一一介绍了。
(9)定义任务。在RTOS建立实时一个实时任务,需要确定该任务的四个参数,下图是本范例的任务定义部分程序。
Fig_X04_定义任务.jpg
首先是任务堆栈大小。从前面可以看到实时任务包括了一个无限循环,如果剥夺了一个实时任务的执行权,就需要将该任务的执行现场保护起来,以便将来恢复该任务时可以恢复现场,从被中断的地方继续开始执行。执行现场包括两种,一个被中断时的各个通用寄存器的内容,它代表了CPU正在进行的操作,另一个是系统堆栈里的内容,它包含了函数嵌套访问的返回地址和临时变量的内容。因此每个实时任务都有一个对应的任务堆栈。对于STC32G单片机的一般任务,任务堆栈的大小一般设置为256个字节,见第35行程序。
其次FreeRTOS是按任务优先级来调度任务的,优先级高的任务具有优先执行权,任务调度程序会剥夺优先级低的任务的执行权,让优先级高的任务运行。对于本版本的FreeRTOS,用户任务优先级的取值范围位1~31,本范例设计为Task0优先级最高,故各个任务的优先级分别为12、11、10(第38、43和48行程序)。
另外,对每个任务还要指定一个任务句柄,FreeRTOS用它来指定任务管理的对象——对哪个任务进行操作。
最后,对每个任务要指定一个任务函数,用户将每个任务需要实现功能的程序写在里面。

(10)建立任务。FreeRTOS用“xTaskCreate”函数来建立任务,对每个任务调用一次就可以建立起任务。本范例建立任务的程序见下图:
Fig_X05_建立任务.jpg
(11)当所有任务建立完成后,调用“vTaskStartScheduler()”函数后任务调度器就开始工作,将CPU的控制权交给各个任务。由于每个实时任务都有无限循环,不会退出,因此这个函数调用也绝不会返回,第111行以后的程序也不会得到执行。

(12)除了FreeRTOS系统需要初始化外,单片机硬件系统也需要初始化。因此像所有的单片机程序一样,本范例也包括了STC32G实验箱的初始化部分,见下图。
Fig_X06_单片机初始化.jpg
(13)最后介绍一下使用FreeRTOS开源软件需要许可说明。通常你需要注明你使用的FreeRTOS系统的来源,比如本范例使用的是STC官方移植的FreeRTOS版本。见下图
Fig_X07_开源许可.jpg

下面是本文范例程序:
FreeRTOS_004_实时任务.rar (826.82 KB, 下载次数: 95)
回复 送花

使用道具 举报

  • TA的每日心情
    开心
    前天 22:49
  • 签到天数: 55 天

    [LV.5]常住居民I

    15

    主题

    222

    回帖

    1197

    积分

    金牌会员

    积分
    1197
    发表于 2023-8-6 23:21:11 | 显示全部楼层
    讲的很好,我这个小白稍微有些懂了,还请继续后续的讲解!辛苦
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情

    2024-3-12 09:47
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    0

    主题

    32

    回帖

    98

    积分

    注册会员

    积分
    98
    发表于 2024-3-6 10:37:55 | 显示全部楼层
    为什么下载不了啊

    点评

    应该是实验箱的型号不一样  详情 回复 发表于 2024-3-6 13:08
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10906
     楼主| 发表于 2024-3-6 13:08:02 | 显示全部楼层
    超级怪 发表于 2024-3-6 10:37
    为什么下载不了啊

    应该是实验箱的型号不一样
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-18 03:53 , Processed in 0.078239 second(s), 44 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表