任务
概述
在具有实时操作系统的系统中,程序以任务的概念运行。
了解实时操作系统和ITRON规格时,了解“任务”是一切的开始。
ITRON以此任务为中心运行系统。
程序的运行有点像工人在工作
#include <stdio.h>
int main(void)
{
long calc = 0;
calc = 100 + 200;
printf("结果:%d", calc);
return 0;
}
在执行这样的程序的步骤执行的同时,你可能已经运行了一行一行的程序。这个程序一行一行地移动,这就是工人正在实施程序的处理内容。
在C语言中,程序从main函数开始运行。也就是说,程序启动的时候准备了一个工人,对那个工人说:“你来实施main函数这个工作吧!“这意味着程序正在动作。
不配备实时操作系统的程序的挑战
在不配备实时操作系统的系统中,根本就没有任务的概念。尽管如此,实施main函数的劳动力也准备好了,所以硬要说的话也可以说是一个人的任务(单一任务)工作。让我们考虑一下单任务系统中的问题是在什么情况下发生的。软件系统以程序的形式创建和运行各种任务。从现在开始,在制作2个任务的基础上,我们将明确单一任务的难度。
LED闪烁的任务
程序是以顺序处理为基础的,并按照描述的顺序从上到下执行。
例如,让我们看看当前的下一个程序。LED闪烁是因为任务正在执行此任务。
每秒钟闪烁LED的任务
- 点亮LED橙色。
- 关闭LED的绿色。
- 等待1秒钟(1000毫秒)。
- 关闭LED的橙色。
- 点亮LED绿色。
- 等待1秒钟(1000毫秒)
void MAIN(VP_INT exinf)
{
while(1)
{
Led_setLight(D_LED_KIND_ORANGE, D_LED_LIGHT_ON);
Led_setLight(D_LED_KIND_GREEN, D_LED_LIGHT_OFF);
dly_tsk(1000);
Led_setLight(D_LED_KIND_ORANGE, D_LED_LIGHT_OFF);
Led_setLight(D_LED_KIND_GREEN, D_LED_LIGHT_ON);
dly_tsk(1000);
}
return;
}
dly_tsk函数是ITRON规格的函数,是仅在指定时间(毫秒)内停止任务动作的函数。像这样忠实地进行按顺序决定的工作的程序很容易写。
发出声音的任务
那么,接下来让我们做另一个任务。假设每2秒就需要输出两次“啪啪”的嗡嗡声的任务。
蜂鸣声输出的任务
- 输出“抖”的声音。
- 等待100毫秒。
- 停止声音的输出。
- 等待100毫秒。
※输出嘟嘟声是指重复2次这个程序。
void MAIN(VP_INT exinf)
{
while(1)
{
int i;
// 发出400ms的时间蜂鸣声
for (i=0 ; i < 2 ; i++)
{
Spk_start(E_SPK_SCALE_DO);
dly_tsk(100);
Spk_stop();
dly_tsk(100);
}
// 等待2000ms - 400ms
dly_tsk(1600);
}
return;
}
任务、线程和进程的关系
任务
表示实时操作系统中并行处理执行单位的术语。在系统中存在多个任务称为多任务。
线程
表示Windows或Linux中并行处理执行单位的术语。这与ITRON中的任务相同。在系统中存在多个线程称为多线程。
进程
在Windows或Linux中表示应用程序执行单位的术语。例如,当您启动Excel或Word等应用程序时,每个应用程序都将作为不同的进程启动。可以同时启动多个应用程序的机制称为多进程。您可以在进程中属于多个线程。ITRON不存在这个概念。因为它在系统中只能有一个应用程序,所以不需要有一个叫做进程的单位。
进程和线程之间的区别
进程和线程之间的巨大区别是共享或不共享内存空间。由于Windows和Linux以进程为单位独立管理内存,如果进程不同,则无法访问其他进程的内存。
例如,您不能从Excel中运行的程序调用Word中定义的函数。如果有这样的事情,恶意程序可能会破坏各种应用程序的操作。
这是Windows和Linux利用虚拟内存的机制,以进程为单位进行内存保护。另一方面,同一进程中存在的多个线程共享内存。因此,每个进程中的线程都可以自由访问进程中定义的函数和全局变量。