【UCOSIII操作系统】系统初始化篇(1)系统初始化

UCOSIII其他内容导航不迷路
UCOSIII操作系统-简介
【UCOSIII操作系统】任务篇(1)创建任务
【UCOSIII操作系统】任务篇(2)相关API函数
【UCOSIII操作系统】系统初始化篇(2)CPU,SysTick,内存初始化
【UCOSIII操作系统】硬件初始化篇(1)硬件初始化以及开始运行系统
【UCOSIII操作系统】消息队列篇(1)消息队列
【UCOSIII操作系统】消息队列篇(2)任务消息队列
【UCOSIII操作系统】信号量与互斥量篇(1)信号量
【UCOSIII操作系统】信号量与互斥量篇(2)互斥量
【UCOSIII操作系统】信号量与互斥量篇(3)任务信号量
【UCOSIII操作系统】事件篇
【UCOSIII操作系统】中断管理篇
【UCOSIII操作系统】临界段篇
【UCOSIII操作系统】软件定时器篇
【UCOSIII操作系统】内存管理篇
已完结

说在前面:
这个内容不适合0基础的人,因为这里只讲了应用层面的东西,并没有深入内核讲解,所以要从零开始学UCOSIII的朋友,可以先去学完入门内容,再来观看这个笔记加深印象。
这篇文章是个人学习整理,如有错误请指正

UCOSIII操作系统——系统初始化篇(1)系统内部任务

系统初始化函数

  • 函数原型
void  OSInit (OS_ERR  *p_err)	//初始化 uC/OS-III
  • 应用实例
    在这里插入图片描述
  • 在调用创建任务函数之前,我们必须要对系统进行一次初始化,而系统的初始化是根据我们配置宏定义进行初始化的,有一-些则是系统必要的初始化,如空闲任务,时钟节拍任务等。
  • 在这个系统初始化函数的具体代码中,我们主要看两个地方,一个是空闲任务的初始化,一个是时钟节拍任务的初始化,这两个任务是必须存在的任务,否则系统无法正常运行。
UCOSIII默认有5个系统任务:
  • 空闲任务: UCOSIII创建的第一个任务,UCOSIII必须创建的任务,此任务有UCOSIII自动创建,不需要用户手动创建;
  • 时钟节拍任务: 此任务也是必须创建的任务;
  • 统计任务: 可选任务,用来统计CPU使用率和各个任务的堆栈使用量。此任务是可选任务,由宏OS_CFG_STAT_TASK_EN控制是否使用此任务;
  • 定时任务: 用来向用户提供定时服务,也是可选任务,由宏OS_CFG_TMR_EN控制是否使用此任务;
  • 中断服务管理任务: 可选任务,由宏OS_CFG_ISR_POST_DEFERRED_EN控制是否使用此任务。
    前两个系统任务时必须创建的任务,而后三者不是。控制后三者任务的宏都是在文件OS_cfg.h中。

空闲任务

我们首先来看一下空闲任务: OS_ IdleTask(), 在os_ core.c 文件中定义。任务OS_ IdleTask()是必须创建的,不过不需要手动创建,在调用OS_ Init()初始化 UCOS的时候就会被创建。打开OS_ Init()函 数,可以看到,在OS_ Init()中调用了函数OS_ IdleTaskInit(),
在这里插入图片描述
打开函数OS_ IdleTaskInit(), 函数代码如下:
在这里插入图片描述
空闲任务其实就是一一个函数,其函数入口是OS_ IdleTask,函数代码如下
在这里插入图片描述
对空闲函数的几点说明:

  1. 空闲函数的优先级最低
  2. 空闲任务堆栈大小为OSCfg_ IdleTaskStkSize, 它也是一个宏,在os_ cfg_app.c文件中定义,默认为128,则空闲任务堆栈默认为128*4=512字节。
  3. 空闲任务的作用还是很大的,它是一个无限的死循环,因为其优先级是最低的,所以任何优先级比它高的任务都能抢占它从而取得CPU的使用权,为什么系统要空闲任务呢?因为CPU是不会停下来的,即使啥也不干,CPU也不会停下来,此时系统就必须保证有一个随时处于就绪态的任务,而且这个任务不会抢占其他任务,当且仅当系统的其他任务处于阻塞中,系统才会运行空闲任务,这个任务可以做很多事情,任务统计,钩入用户自定.义的钩子函数实现用户自定义的功能等,但是需要注意的是,在钩子函数中用户不允许调用任何可以使空闲任务阻塞的函数接口,空闲任务是不允许被阻塞的。

时钟节拍任务

时钟节拍任务和空闲任务一样是系统必须创建的任务
时钟节拍任务:OS_Ticktask(),在OS_Init()中调用了一个函数OS_TickTaskInit(),函数代码如下:
在这里插入图片描述
打开函数OS_TickTaskInit(), 函数代码如下:
在这里插入图片描述
OS_TickTask()任务函数代码如下
在这里插入图片描述
关于时钟节拍任务的几点说明

  • 时钟节拍任务的作用是跟踪正在延时的任务,以及在指定时间内等待某个内核对象的任务
  • 时钟节拍任务的任务优先级为OSCfg_TickTaskPrio,时钟节拍任务的优先级尽可能的高一点,一般设置时钟节拍任务的任务优先级为1

统计任务

  • 在UCOSII中统计任务可用来统计CPU的使用率、各个任务的CPU使用率和各任务的堆栈使用情况,默认情况下统计任务是不会创建的,如果要使能统计任务的话需要将宏OS_ CFG_ STAT_ TASK EN置1,宏OS_ CFG_ STAT_ TASK_ EN在os_ cfg.h文件中有定义。当我们将宏OS CFG_ STAT_ TASK_ EN置1以后,OSinit()函数中有关统计任务的代码就可以编译了。
  • OS_StatTaskInit()函数用来创建统计任务,统计任务的优先级通过宏OS_ CFG_ STAT_ TASK_ PRIO设置,ALIENTEK 将统计任务的优先级设置为OS CFG PRIO MAX-2,也就是倒数第二。
#if OS_CFG_STAT_TASK_EN > 0u
   OSStatTaskCPUUsageInit(&err);  	//统计任务                
#endif
  • 从上面代码中可以看出最先调用了函数OSStatTaskCPUUsageInit(),创建其他任务只能在OSStatTaskCPUUsageInit()函数之后.CPU的总的使用率会保存在变量OSStatTaskCPUUsage中,我们可以通过读取这个值来获取CPU的使用率。从V3.03.00 版本起,CPU的使用率用-一个0~ 10000之间的整数表示(对应0.00-100.00%),在这之前的版本,CPU使用率是0~100之间的整数表示。
  • 如果将宏OS_ CFG STAT_ TASK_ STK_ CHK EN置1的话表示检查任务堆栈使用情况,那
    么统计任务就会调用OSTaskStkChk()函数来计算所有已创建任务的堆栈使用量,并将检测结果
    写入到每个任务的OSTCB中的StkFree和StkUsed中。

定时任务

  • UCOSIII提供软件定时器功能,定时任务是可选的,将宏OS_ CFG_ TMR EN设置为1就会使能定时任务,在OSInit()中将会调用函数oS_TmrInit(来 创建定时任务。定时任务的优先级通过宏OS_ CFG_ TMR_ TASK_ _PRIO定义,ALIENTEK默认将定时器任务优先级设置为2。
  • 如果要使用OS的软件定时器,就要使能定时任务的宏,才能正常使用软件定时器的功能。

中断服务管理任务

中断服务管理任务可选的,一般作用于中断延迟发布

  • 当把os_cfg.h文件中的宏OS_CFG_ISR_POST_DEFERRED_EN置1就会使能中断服务管理任务,UCOSIII会创建一个名为OS_IntQTask()的任务,该任务负责“延迟”在ISR中调用的系统post服务函数的行为。中断服务管理任务的任务优先级永远是最高的,为0!

  • 在UCOS中可以通过关闭中断和任务调度器上锁两种方式来管理临界段代码,如果采用后一种,即调度器上锁的方式来管理临界段代码的话,那么在中断服务函数中调用的“post”类函数就不允许操作诸如任务就绪表、等待表等系统内部数据结构。

  • 当ISR(中断服务函数)调用UCOSIII提供的“post”函数时,要发送的数据和发送的目的地都会存入一个特别的缓冲队列中,当所有嵌套的ISR都执行完成以后UCOSIII会做任务切换,运行中断服务管理任务,该任务会把缓存队列中存放的信息重发给相应的任务。这样做的好处就是可以减少中断关闭的时间,否则,在ISR中还需要把任务从等待列表中删除,并把任务放入就绪表,以及做一些其他的耗时操作。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于UCOSIII操作系统的时钟节拍实验方法步骤: 1. 准备开发板和编程工具:需要一块支持UCOSIII操作系统的开发板,以及支持C语言开发的编程工具,如Keil MDK或IAR Embedded Workbench。 2. 创建新工程:在编程工具中创建一个新的工程,配置好开发板的硬件参数和编译选项。 3. 导入UCOSIII操作系统源代码:将UCOSIII操作系统的源代码导入到工程中,并根据开发板的硬件参数进行配置。可以参考UCOSIII操作系统的官方文档进行配置。 4. 创建任务:在工程中创建两个简单的任务,分别为`Task1`和`Task2`。可以使用C语言编写任务函数,并在任务函数中使用UCOSIII提供的时钟节拍来控制任务的执行。 5. 初始化UCOSIII操作系统:在主函数中调用`OSInit()`函数来初始化UCOSIII操作系统。 6. 创建任务:在主函数中调用`OSTaskCreate()`函数来创建任务,并指定任务优先级、堆栈大小等参数。 7. 启动UCOSIII操作系统:在主函数中调用`OSStart()`函数来启动UCOSIII操作系统,开始运行任务。 8. 编译和下载程序:使用编程工具编译程序,并将程序下载到开发板中。 9. 运行实验:将开发板上电,并观察串口输出结果。可以看到`Task1`和`Task2`交替执行,并且它们的执行时间是通过UCOSIII提供的时钟节拍来控制的。 总的来说,UCOSIII操作系统时钟节拍实验需要实现任务的创建、时钟节拍的控制以及任务的执行等功能,可以通过以上步骤来实现该实验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值