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

UCOSIII其他内容导航不迷路
UCOSIII操作系统-简介
UCOSIII操作系统——任务篇(1)创建任务
UCOSIII操作系统——任务篇(2)相关API函数
UCOSIII操作系统——系统初始化篇(1)系统初始化
UCOSIII操作系统——系统初始化篇(2)CPU,SysTick,内存初始化
UCOSIII操作系统——硬件初始化篇(1)硬件初始化以及开始运行系统
正在更新整理…

说在前面:
这个内容不适合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中还需要把任务从等待列表中删除,并把任务放入就绪表,以及做一些其他的耗时操作。

发布了10 篇原创文章 · 获赞 1 · 访问量 124

猜你喜欢

转载自blog.csdn.net/iiinoname/article/details/105181487