版权声明:玛雅实时操作系统(MY-RTOS)软件及其说明文档由 欣欣学习网 版主 Stoneway QI 创作,作者保留其版权。任何人可以免费在其产品设计或著作中使用或引用该软件及其说明文档,但要求保留原作品当中的版权声明,并注明引用段落的出处。 -- Stoneway QI 主页: http://www.xxworks.com 邮箱: Stonewayqi@hotmail.com 玛雅实时操作系统的启动是通过调用系统函数OSInit()来实现的。该函数有一个入口参数:Freq,用来传递系统主频。更确切的说,这一参数用来传递产生系统节拍的定时器的工作主频。系统需要这一参数来设定相关的硬件,从而产生所需要的系统节拍。该参数的单位是:KHz,例如:在STM32F103VBT6平台上,系统主频是72MHz,该参数的值即为:72000。
通常,该函数的调用位置放在完成硬件初始化之后,但也可以放在硬件初始化之前。如下两种启动方式都是可以的:
|
void main(void)
{
BSP(); // 硬件初化
OSInit(72000); //玛雅系统初始化
...
}
(1) |
void main(void)
{
OSInit(72000); //玛雅系统初始化
BSP(); // 硬件初化
...
}
(2) |
|
在玛雅系统启动之前,用户程中是不存在线程调度机制的,main()函在逐句的执行。当玛雅系统启动之后,其内核立刻接管了线程调度,原来的main()函数则成为了系统中的第1个任务,而其原始的堆栈也成为了任务堆栈。这样,原来的main()函数将以系统任务的形式继续运行。
main()函数所对应的任务是“紧急任务0”。这是一个特殊的任务,它可以拥有系统中最高的优先级,且不能被复位,也不能终止。不过,作为一个新建创的“紧急任务”,它的“紧急信号”是被屏蔽的。所以此时它的优先级还只能等同于“常规任务”的优先级,属于系统中最低的优先级。需要在调用系统函数OSEnableEmergency()之后,该任务才能响应“紧急信号”而运行在“紧急0优先级”上。作为紧急任务,其自身也可以通过调用系统函数OSEnterEmergency()来触发自己的紧急信号。如下列代码所示:
|
void main(void)
{
BSP(); // 硬件初化
OSInit(72000); //玛雅系统初始化
...
...
OSEnableEmergency(); //解除对“紧急任务0”的紧急信号的屏蔽
OSEnterEmergency(); //触发紧急信号,使任务进入紧急优先级
while(1)
{
...
}
} (3) |
|
当main()函数成为“紧急任务0”之后,可以由其调用系统函数OSCreateTask()或OSAttachEmTask()来创建系统所需要的其它任务。然后,它将参与具体应用事物的处理。
OSInit()函数是应用程序调用的第1个系统函数,对任何其它的系统函数的调用都要放在对该函数的调用之后,否则会导致系统崩溃。
|