RTX内核提供了基本的功能,可以创建和注销任务进程。同时RTX内核还提供了一些额外的功能,用于任务进程之间的通信。利用这些通信功能,可以同步任务进程,管理系统公用的资源(例如外设或者内存),在任务进程之间传递消息。
开发者可以设置任务进程的调度优先级。
RTX内核提供了以下的任务进程通信功能:
事件标志位是实现任务进程之间同步的首要手段。每个任务进程有16个事件标志位。因此每个任务进程都可以等待16件事情或者其中一部分事件的发生,然后处理他们。
一个任务进程的事件标志位,可以被其他的任务进程或者ARM中断程序置位。通过在ARM中断程序中将事件标志位置位的方式,可以实现外部异步事件和RTX内核的同步。
简单的来说,就是其他任务进程或者中断程序置位标志位,而当前任务进程选择等待某个任务标志位,如果某个标志位置位了,表明有某件事情已经发生了,那么当前进程可以根据事件标志位代表的含义完成相应的工作。
当多个任务需要同时访问一个公用的资源时,会发生竞争。竞争会因为多个进程的交叉访问,使得系统公用的资源工作不正常。
信号量(二进制信号量)就是解决这一问题的主要手段。信号量确保了一个时刻只有一个任务进程在访问公用的资源。
RTX内核的具体实现方式为:
信号量是软体实现一个对象,这个对象里面包含一个虚拟token。RTX内核将这个token授予给第一个请求公用资源的那个任务进程。当有其他的任务进程再请求这个公用资源时,会因为当前token未被释放给信号量,而被RTX内核设置为sleep状态进行等候。直到第一个任务进程释放掉token,token被RTX内核还给信号量,其他的任务进程会被RTX内核立即放置到ready list中,准备开始运行。
RTX内核还提供了超时机制,放置任务进程因为等待一个信号量而永久的处于sleep状态。
互斥锁也是解决竞争和内存访问问题的手段之一。
互斥锁是软体实现的一个对象,任务进程可以利用他来锁住某个公用资源。只有锁住公用进程的这个任务进程拥有锁,并可以访问对应的公用资源。其他任务进程因为无法得到锁而无法访问公用资源。RTX内核会一直阻塞这些请求互斥锁的任务进程,直到拥有锁的任务进程释放锁。
邮件信箱(Mailboxes, 原谅翻译的不够好 )
邮件信箱应该是用来存放消息的。
任务进程之间可以通过邮件信箱的方式相互传递消息(message)。这种方式在创建一些高层级的协议时经常被用到,例如TCP-IP,UDP,以及ISDN。
消息其实是一个指针,指向一块包含有消息内容的内存区域。任务进程必须负责动态创建和释放掉这些内存区域,以防止出现内存泄露。
如果消息还未到达,RTX内核会将等待消息的任务进程设置为sleep状态。内核会尽快的唤醒任务进程,当有其他任务进程发送消息过来。