网友:不是宇宙少女歌曲冠军队吗

获得同步降压稳压器的最高能效-技术与工具
在您日常预测性维护工作中,让数据可测,让问题可视,让结果可控,福禄克助您一臂之力!收听课程,同福禄克工程师问答互动,探讨电力电子最全面的解决方案,解决您在电力电子检测中的疑惑,收获宝贵经验知识,赢取精美礼品! 福禄克 &&&&日&&&&
1.车灯的内部结构分析以及对驱动部分的拓扑结构需求和电流 电压的需求重点分析全LED大灯 和矩阵式大灯以及 AFS的需求;2.根据需求TI提供的芯片和方案介绍;3.介绍车灯驱动部分设计的难点如何过 EMC测试介绍,如何过CIPER25 CLASS3或者更高测试需求。 艾睿合众 &&&&日&&&&
随着嵌入式系统的规模越来越大,尤其是不断发展的IoT应用,需要复杂的互联功能以及网络支持。瑞萨电子推出的全新理念的Synergy嵌入式开发平台,不仅为客户提供可靠的硬件基础,同时提供带有质量保证的配套软件平台...... 瑞萨电子 &&&&日&&&&博客访问: 481418
博文数量: 112
博客积分: 3532
博客等级: 中校
技术积分: 1313
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: WINDOWS
Windows是一款微内核、抢占式多任务、软实时的操作系统。Windows的任务调度主要以线程为单位进行,线程拥有33个优先级,数值为0~32,其中0为最低优先级,32为最高优先级,最高和最低优先级均保留给系统使用。用户可以使用的优先级为1~31。Windows按照优先级高低顺序来进行任务的调度,当调度发生时,内核首先检查高优先级的线程是否 就绪,如果有发现有高优先级的线程就绪则立刻将高优先级的线程发往CPU执行。如果有高优先级的线程就绪,就不会执行低优先级的任务。不 过,windows使用成为“饥渴”的时间片分配策略,如果有线程一直渴望得到时间片但是很长时间都没有获得时间片,windows就会临时将这个线程的 优先级提高,并一次分配给2倍的时间片来执行,但是windows绝不会将这个线程的优先级提高到实时优先级范围(16~31为实时优先级范围),如果不 希望windows进行饥渴分配策略,也可以通过特定的API将该策略关闭(SetThreadPriorityBoost)。Windows同时采用时间片策略来执行相同优先级的任务。相同优先级的线程会获得同样的时间片(一 般为2个系统Tick,在单CPU系统上一个系统Tick一般为10ms,多CPU系统上一般为15ms,可以通过 GetSystemTimeAdjustment查询)。一个线程的时间片用完后,Windows会将另外一个已经就绪的同优先级的线程发往CPU进行执 行。正在执行的线程将在线程主动放弃时间片(比如调用Sleep函数),时间片用完或Windows发现有更高优先级的线程就绪后暂停执行。另外,Windows还存在不受优先级策略控制的线程,如DPC的处理线程,Windows中每个CPU上都有一个DPC队列,只要DPC中有等待处理的任务,Windows总是会立刻对DPC中的任务进行处理。Windows和硬实时操作系统的区别在于,硬实时操作系统一般拥有256或更多的优先级,硬实时操 作系统的最重要特性在于中断的处理方式方面,Windows使用DPC队列方式来延时处理中断请求,在ISR中仅能执行时间非常关键的硬件寄存器操作(如 恢复清除设备中断寄存器使得设备能进行下一次中断),DPC队列按照先入先出的方式执行,这样如果系统在短时间发生大量中断而使得DPC队列中存在大量待 处理的中断请求时,时间关键的中断请求可能会在很长时间后才得到处理,使得系统丧失实时响应能力。硬实时操作系统的ISR同样一般仅能执行时间关键的硬件 寄存器操作,也必须通过任务调度切换至相关的任务上下文环境,才能访问更多的资源来进行相关的处理,但是硬实时操作系统可以根据优先级来处理中断的请求, 后发生的高优先级中断请求可以抢占低优先级中断或低优先级任务的时间片,而使得时间关键的中断请求总是能得到最优先的处理。对各种操作系统的任务调度策略进行深入的理解之后,才能对一套应用系统的设计进行精确的把握。 Windows的调度策略很适合处理各种非事件性的数据,比如大量的流数据,可以达到很高的数据吞吐量。如果你设计的系统是需要实时响应的中断事件式的处 理,那么你可能需要考虑使用一款硬实时的操作系统,如Windows CE 5.0以上版本,或vxWorks,WindowsCE有很好的硬实时的处理能力,价格低廉,开发容易,缺点是可用软件少。而vxWorks功能强大,有 庞大的gnu软件阵容做后盾,唯一美中不足的是价格昂贵。其他免费的操作系统只会令你的项目陷入困境,如果做的是有的是时间没有钱的项目,才值得考虑。
阅读(3974) | 评论(1) | 转发(2) |
相关热门文章
给主人留下些什么吧!~~
32号优先级为什么看不到相关资料,真的有这个优先级吗
请登录后评论。Linux内核中的信号机制--从用户层到内核层
Linux内核中的信号机制--从用户层到内核层
  1、简介
  如果进程要处理某一信号,那么要在进程中注册该信号。注册信号主要用来确定信号值及进程针对该信号值的动作之间的映射关系,即进程将要处理哪个进程和该信号被传递给进程时,将执行何种操作。主要有两个函数实现信号的注册:signal()和sigaction()。
  2、signal()
  signal()的函数原型如下:
void (*signal(int signum, void (*handler)(int)))(int);
  在使用该调用的进程中加入以下头文件:
#include &signal.h&
  上述声明格式比较复杂,如果不清楚如何使用,也可以通过下面这种类型定义的格式来使用(POSIX的定义):
typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);
  但这种格式在不同的系统中有不同的类型定义,所以要使用这种格式,最好还是参考一下手册。在调用中,参数signum指出要设置处理方法的信号。第二个参数handler是一个处理函数,或者是
  ● SIG_IGN:忽略参数signum所指的信号。
  ● SIG_DFL:恢复参数signum所指信号的处理方法为默认值。
  传递给信号处理例程的整数参数是信号值,这样可以使得一个信号处理例程处理多个信号。系统调用signal()返回值是指定信号signum前一次的处理例程或者错误时返回错误代码SIG_ERR。
  signal()通过系统调用sys_signal()为一个指定的信号设置用户态处理函数。sys_signal()定义如下:
  /*&* For backwards compatibility.& Functionality superseded by sigaction.&*/asmlinkage unsigned longsys_signal(int sig, __sighandler_t handler){&struct k_sigaction new_sa, old_&
  new_sa.sa.sa_handler =&new_sa.sa.sa_flags = SA_ONESHOT | SA_NOMASK;
  ret = do_sigaction(sig, &new_sa, &old_sa);
  return ret ? ret : (unsigned long)old_sa.sa.sa_}
  __sighandler_t的定义如下:
typedef void __signalfn_t(int);typedef __signalfn_t __user *__sighandler_t;
  信号由sys_signal()的第一个参数指定,信号处理函数的地址由第二个参数指定。sys_signal()根据这两个参数设置一个k_sigaction结构,然后调用do_sigaction(),该函数的定义我们会在后面具体讲解。  3、sigaction()
  sigaction()的函数原型如下:
sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
  sigaction()对应的系统调用为do_sigaction(),下面我们具体讲解do_sigaction()函数,其定义如下:
  3.1 do_sigaction()
  intdo_sigaction(int sig, const struct k_sigaction *act, struct k_sigaction *oact){&struct k_sigaction *k;
  if (!valid_signal(sig) || sig & 1 || (act && sig_kernel_only(sig)))&&return -EINVAL;
  k = &currentt-&sighand-&action[sig-1];
  spin_lock_irq(&currentt-&sighand-&siglock);&if (signal_pending(current)) {&&/*&& * If there might be a fatal signal pending on multiple&& * threads, make sure we take it before changing the action.&& */&&spin_unlock_irq(&currentt-&sighand-&siglock);&&return -ERESTARTNOINTR;&}
  if (oact)//把原来的k_sigaction保存到oact结构中,这里是对整个数据结构进行复制&&*oact = *k;
  if (act) {&&/*&& * POSIX 3.3.1.3:&& *& "Setting a signal action to SIG_IGN for a signal that is&& *&& pending shall cause the pending signal to be discarded,&& *&& whether or not it is blocked."&& *&& *& "Setting a signal action to SIG_DFL for a signal that is&& *&& pending and whose default action is to ignore the signal&& *&& (for example, SIGCHLD), shall cause the pending signal to&& *&& be discarded, whether or not it is blocked"&& */&&if (act-&sa.sa_handler == SIG_IGN ||&&&&& (act-&sa.sa_handler == SIG_DFL &&&&&&&& sig_kernel_ignore(sig))) {&&&/*&&& * This is a fairly rare case, so we only take the&&& * tasklist_lock once we're sure we'll need it.&&& * Now we must do this little unlock and relock&&& * dance to maintain the lock hierarchy.&&& */&&&struct task_struct *t =&&&spin_unlock_irq(&t-&sighand-&siglock);&&&read_lock(&tasklist_lock);&&&spin_lock_irq(&t-&sighand-&siglock);&&&*k = * //把新的k_sigaction结构复制到进程的sighand-&action中
  sigdelsetmask(&k-&sa.sa_mask,&&&&&&&&& sigmask(SIGKILL) | sigmask(SIGSTOP));&&&rm_from_queue(sigmask(sig), &t-&signal-&shared_pending);&&&do {&&&&rm_from_queue(sigmask(sig), &t-&pending);&&&&recalc_sigpending_tsk(t);&&&&t = next_thread(t);&&&} while (t != current);&&&spin_unlock_irq(&current-&sighand-&siglock);&&&read_unlock(&tasklist_lock);&&&return 0;&&}
  *k = * //把新的k_sigaction结构复制到进程的sighand-&action中&&sigdelsetmask(&k-&sa.sa_mask,&&&&&&&& sigmask(SIGKILL) | sigmask(SIGSTOP));&}
  spin_unlock_irq(&currentt-&sighand-&siglock);&return 0;}
  相关链接:
  Linux内核中的信号机制――一个简单的例子
  Linux内核中的信号机制――信号发送
  Linux内核中的信号机制――信号处理
&&&主编推荐
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&查看: 2556|回复: 4
执行完? OSIntExit(); 后,再进行任务调度,可是那两个任务都是在等待信号量啊,难道执行完中断函数后会释放一个信号量吗?
主题帖子精华
初级会员, 积分 145, 距离下一级还需 55 积分
在线时间0 小时
[C] 纯文本查看 复制代码/*
*********************************************************************************************************
火牛开发板uCOSII + STM32V3.4固件函数库+USART1驱动(实例二)
创 建 人:LJ128
修改时间:日
*********************************************************************************************************
#include \"includes.h\"
OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE]; // TaskStart 任务堆栈
App_TaskStart(void* p_arg);
// 声明 TaskStart 函数
OS_STK App_TaskPrintfStk[APP_TASK_PRINTF_STK_SIZE]; // TaskPrintf 任务堆栈
App_TaskPrintf(void* p_arg);
// 声明 TaskPrintf 函数
void LED1234_ON_OFF(CPU_INT08U Num); // 声明流水灯函数
OS_EVENT *Mutex_USART1; // 定义互斥型事件
*********************************************************************************************************
*********************************************************************************************************
int main(void)
SysClock_Init();
/* 初始化系统外设、 CPU 时钟,仅此而已 */
/* 建立系统的第一个任务 */
OSTaskCreateExt(App_TaskStart, (void *) 0, (OS_STK *) &App_TaskStartStk[APP_TASK_START_STK_SIZE - 1], APP_TASK_START_PRIO,
APP_TASK_START_PRIO, (OS_STK *) &App_TaskStartStk[0], APP_TASK_START_STK_SIZE , (void *) 0, OS_TASK_OPT_STK_CHK |
OS_TASK_OPT_STK_CLR
OSStart(); /* 开始任务调度
return (0);
*********************************************************************************************************
系统的第一个任务,负责开OS时钟,建立其他任务
*********************************************************************************************************
void App_TaskStart(void* p_arg)
p_arg = p_
/* 初始化 OS 时钟 */
OS_CPU_SysTickInit();
/* 统计任务 */
#if (OS_TASK_STAT_EN & 0)
OSStatInit();
Mutex_USART1 = OSMutexCreate(USART1_MUTEX_PRIO, &err);
// 建立USART1互斥型信号量
建立打印任务
OSTaskCreateExt(App_TaskPrintf, (void *) 0, (OS_STK *) &App_TaskPrintfStk[APP_TASK_PRINTF_STK_SIZE - 1], APP_TASK_PRINTF_PRIO,
APP_TASK_PRINTF_PRIO, (OS_STK *) &App_TaskPrintfStk[0], APP_TASK_PRINTF_STK_SIZE , (void *) 0, OS_TASK_OPT_STK_CHK |
OS_TASK_OPT_STK_CLR
/* 初始化外设
BSP_Init();
while (1) {
for(i = 0 ; i & 4; i++){
LED1234_ON_OFF(i);
OSTimeDlyHMSM(0,0,1,0); // 延时一秒
OSMutexPend(Mutex_USART1, 0, &err);
// 等待信号量
USART1_Printf(\"******任务一输出********\r\n\");
OSMutexPost(Mutex_USART1);
// 释放信号量
*********************************************************************************************************
打印线程,将串口1接收到的数据打印出来
*********************************************************************************************************
void App_TaskPrintf(void* p_arg)
p_arg = p_
while (1) {
OSTaskSuspend(OS_PRIO_SELF); // 先将任务挂起,在串口接收中断中恢复任务
OSMutexPend(Mutex_USART1, 0, &err);
// 等待信号量
while(USART1_GetByte(&temp)){ // 如果串口接收到数据打印出来
USART1_SendByte(temp);
OSMutexPost(Mutex_USART1);
// 释放信号量
*********************************************************************************************************
*********************************************************************************************************
uC/OS-II APP HOOKS
*********************************************************************************************************
*********************************************************************************************************
#if (OS_APP_HOOKS_EN & 0)
*********************************************************************************************************
TASK CREATION HOOK (APPLICATION)
* Description : This function is called when a task is created.
* Argument : ptcb
is a pointer to the task control block of the task being created.
: (1) Interrupts are disabled during this call.
*********************************************************************************************************
void App_TaskCreateHook(OS_TCB* ptcb)
*********************************************************************************************************
TASK DELETION HOOK (APPLICATION)
* Description : This function is called when a task is deleted.
* Argument : ptcb
is a pointer to the task control block of the task being deleted.
: (1) Interrupts are disabled during this call.
*********************************************************************************************************
void App_TaskDelHook(OS_TCB* ptcb)
*********************************************************************************************************
IDLE TASK HOOK (APPLICATION)
* Description : This function is called by OSTaskIdleHook(), which is called by the idle task.
has been added to allow you to do such things as STOP the CPU to conserve power.
* Argument : none.
: (1) Interrupts are enabled during this call.
*********************************************************************************************************
#if OS_VERSION &= 251
void App_TaskIdleHook(void)
*********************************************************************************************************
STATISTIC TASK HOOK (APPLICATION)
* Description : This function is called by OSTaskStatHook(), which is called every second by uC/OS-II's
statistics task.
This allows your application to add functionality to the statistics task.
* Argument : none.
*********************************************************************************************************
void App_TaskStatHook(void)
*********************************************************************************************************
TASK SWITCH HOOK (APPLICATION)
* Description : This function is called when a task switch is performed.
This allows you to perform other
operations during a context switch.
* Argument : none.
: 1 Interrupts are disabled during this call.
It is assumed that the global pointer 'OSTCBHighRdy' points to the TCB of the task that
will be 'switched in' (i.e. the highest priority task) and, 'OSTCBCur' points to the
task being switched out (i.e. the preempted task).
*********************************************************************************************************
#if OS_TASK_SW_HOOK_EN & 0
void App_TaskSwHook(void)
*********************************************************************************************************
OS_TCBInit() HOOK (APPLICATION)
* Description : This function is called by OSTCBInitHook(), which is called by OS_TCBInit() after setting
up most of the TCB.
* Argument : ptcb
is a pointer to the TCB of the task being created.
: (1) Interrupts may or may not be ENABLED during this call.
*********************************************************************************************************
#if OS_VERSION &= 204
void App_TCBInitHook(OS_TCB* ptcb)
/******************************************
LED 流水灯
****************************************/
void LED1234_ON_OFF(CPU_INT08U Num)
switch (Num) {
GPIO_SetBits(GPIOD, GPIO_Pin_8);
GPIO_ResetBits(GPIOD, GPIO_Pin_9);
GPIO_ResetBits(GPIOD, GPIO_Pin_10);
GPIO_ResetBits(GPIOD, GPIO_Pin_11);
GPIO_ResetBits(GPIOD, GPIO_Pin_8);
GPIO_SetBits(GPIOD, GPIO_Pin_9);
GPIO_ResetBits(GPIOD, GPIO_Pin_10);
GPIO_ResetBits(GPIOD, GPIO_Pin_11);
GPIO_ResetBits(GPIOD, GPIO_Pin_8);
GPIO_ResetBits(GPIOD, GPIO_Pin_9);
GPIO_SetBits(GPIOD, GPIO_Pin_10);
GPIO_ResetBits(GPIOD, GPIO_Pin_11);
GPIO_ResetBits(GPIOD, GPIO_Pin_8);
GPIO_ResetBits(GPIOD, GPIO_Pin_9);
GPIO_ResetBits(GPIOD, GPIO_Pin_10);
GPIO_SetBits(GPIOD, GPIO_Pin_11);
[C] 纯文本查看 复制代码static
void App_TaskPrintf(void* p_arg)
static &void App_TaskStart(void* p_arg) &我的理解是先执行任务static
void App_TaskStart(void* p_arg),然后碰到延时一秒转而去执行static
void App_TaskPrintf(void* p_arg)这个任务,执行到任务挂起时,去执行TaskStart开始任务,此时碰到OSMutexPend(Mutex_USART1, 0, &err);等待信号量,此时两个任务都不执行,等待串口中断来临,当串口中断来了时
void USART1_IRQHandler(void)
& & OS_CPU_SR &cpu_
& & OS_ENTER_CRITICAL(); &//保存全局中断标志,关总中断/* Tell uC/OS-II that we are starting an ISR*/
& & OSIntNesting++;
& & OS_EXIT_CRITICAL();
&//恢复全局中断标志
& & if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ // 如果是串口接收中断
& & & & USART1_RXLoop(USART_ReceiveData(USART1));
// 将数据放入环形队列
OSTaskResume(APP_TASK_PRINTF_PRIO);
& & OSIntExit();
这是串口中断函数,执行完&OSIntExit(); 后,再进行任务调度,可是那两个任务都是在等待信号量啊,难道执行完中断函数后会释放一个信号量吗?
主题帖子精华
金钱106963
在线时间695 小时
中断和信号量没什么关系。。。
等待就等待呗,这两个任务没收到信号量就一直不运行。其他任务该干嘛干嘛去...
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 145, 距离下一级还需 55 积分
在线时间0 小时
回复【2楼】正点原子:
---------------------------------
可问题&是这段程序间隔一秒钟就显示“******任务一输出********”;不是都在等待信号量吗?怎么开始任务执行了呢?
主题帖子精华
金钱106963
在线时间695 小时
回复【3楼】a:
---------------------------------
说明收到信号量了,你得检查在哪里发送了信号量。
我是开源电子网站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
微信公众平台:正点原子
主题帖子精华
初级会员, 积分 145, 距离下一级还需 55 积分
在线时间0 小时
哥,这是我的那个程序文件,很简单的,你看一眼就会了,麻烦你帮我看看哪里给信号量了,谢谢,这个问题搞得我寝食难安啊 !
16:20 上传
点击文件名下载附件
8.4 MB, 下载次数: 107
Powered by实时操作系统VxWorks的内核任务调度研究
> 实时操作系统VxWorks的内核任务调度研究
实时操作系统VxWorks的内核任务调度研究
&&&&& 1、引言
&&&本文引用地址:
&&&&&& VxWorks操作系统是WindRiver公司开发的一种高性能的嵌入式实时操作系统。它带有一个功能强大的集成开发系统环境Tornado。
&&&&&&& VxWorks具有软件生成代码小、实时性强及响应速度快等特点,特别适合于具有实时和多任务要求的系统。VxWorks自20世纪80年代问世以来,以其高性能、高可靠性、高实时性等特点成为实时操作系统中最具特色的系统。自1996年登陆中国,短短几年就已成为国防、工业自动化、网络通信、航空航天、医疗仪器、状态监控以及消费电子产品等嵌入式实时领域的首选操作系统。由于嵌入式实时操作系统在内核方面具有自身的特点,本文着重对实时内核中任务调度进行了详细分析。
&&&&&& 2、任务调度概述
&&&&& 2.1 调度的概念
&&&&&& 构成应用软件系统的程序集合中,独立的、相互作用的程序单元,在其执行时称之为任务。单个CPU 中,多任务机制制造了一个多个任务同时执行的假象。其实系统只是根据一个多任务调度算法,将内核插入到这些任务中执行。实时系统VxWorks的一个任务可有多种状态,但最基本的状态有以下四种:
&&&&& 1) 就绪态(Ready):任务只等待系统分配CUP资源。
&&&&& 2) 挂起态(Pend):任务需等待某些不可利用的资源而被阻塞。
&&&&& 3) 休眠态(Sleep):如果系统不需要某一个任务工作,则这个任务处于休眠状态。
&&&&& 4) 延迟态(Delay):任务被延迟时所处的状态。
&&&&&& 当系统函数对某一个任务进行操作时,任务从一种状态跃迁到另一种状态。处于任一状态的任务都可被删除。VxWorks的任务跃迁如图1所示。
&&&&&& &任务由系统内核调度运行一段固定长度的时间,称为时间片。调度是指为任务分配资源和时间,使系统满足特定的性能要求。调度算法的目的是在正常情况下,尽可能满足所有任务的时限:在峰值负载条件下,保证强实时任务满足时限。因为时限是区分实时系统和非实时系统的关键因素,因此调度算法是实时系统的基本问题。实时操作系统所具有的运行性能,如吞吐量的大小、周转时间的长短、相应的及时性和可预测性等在很大程度上都取决于实时调度。
&&&&& 2.2调度的类型
&&&&&& 虽然调度的主要目的都是为了分配处理机,但在不同的OS中所采用的调度方式是完全不同的。在执行调度时所采用的调度算法也可能不同。因此,常按照调度的层次把调度分成高级、中级和低级调度。
&&&&&& 高级调度又称长程调度或作业调度,用于决定把外存上处于后备队列中的哪些作业调入内存,并为它们创建进程、分配必要的资源,然后再将新创建的进程排在就绪队列上,准备执行。然而在实时系统中,为了能及时响应,用户通过键盘输入的数据都是直接送入内存,因而实时系统通常不需要作业调度。
&&&&&& 中级调度又称中程调度,引入它的主要目的是为了提高内存利用率和系统吞吐量。它使那些暂时不能运行的进程不再占用宝贵的内存空间,而将它们调到外存上去等待,此时的状态称为挂起状态。当这些进程重新具备运行条件,且内存又有空闲,由中级调度决定,将外存上的那些重新具备运行条件的就绪进程重新调入内存,并使它为就绪状态,挂在就绪队列上等待进程调度。
&&&&&& &低级调度又称进程调度。它决定就绪队列中的哪个进程将获得处理机,然后由分派程序执行把处理机分配给该进程的操作。进程调度是最基本的一种调度,各种OS中都必须配置这级调度。进程调度可采用下述两种方式。
&&&&& 1)非抢占方式。
&&&&&& 采用这种调度方式,一旦把处理机分配给某进程后,便让该进程一直执行,直到该进程完成或发生某事件而被阻塞,才再把处理机分配给其他进程,决不允许某进程抢占已经分配出去的处理机。显然它难于满足紧急任务的要求,实时系统中不宜采用这种调度方式。
&&&&& 2)抢占方式。
&&&&& 允许调度程序根据某种原则,去停止某个正在执行的进程,将已分配给该进程的处理机,重新分配给另一进程。抢占的原则有:
&&&&&& ① 时间片原则。各进程按时间片运行,当一个时间片用完后,便停止该进程的执行而重新进行调度。
&&&&&& ② 优先权原则。当一个进程到来时,如果其优先级比正在执行的进程的优先级高,便停止正在执行的进程,将处理机分配给优先级高的进程,使之执行。实时系统中一般采用基于优先级的抢占式调度和轮转调度的进程调度和中程调度相结合的调度策略。因此既可具有较大的灵活性,又能获得极小的调度延迟。
&&&& 3、任务调度分析
&&&&&& Wind内核缺省调度机制为基于优先级的抢占式调度。采用这种机制时,系统把处理机分配给优先级最高的进程,使之执行。一旦出现了另一个优先级更高的进程时,进程调度程序剥夺当前任务的执行,将处理机分配给高优先级任务。而在相同优先级的多个任务之间,采用时间片轮转调度机制。采用这种机制时,当一个任务到达时,它被排在轮转队列的后面,等待分配给自己的时间片的到来,如果在时间片内没有结束,则再等待属于自己的时间片的到来,直到任务完成。
&&&&& 3.1 优先级抢占式
&&&&&& 采用基于优先级的抢占式调度,系统中每个任务都有一个介于最高0到最低255之间的优先级。任一时刻,系统内核一旦发现一个优先级更高的任务转变为就绪态,内核就保存当前任务的上下文并把当前任务状态转换为阻塞态,同时切换到这个高优先级任务的上下文执行。如图2,低优先级的task1被中优先级的task2抢占,task2又被高优先级的task3抢占。
&&&&& 3.2 轮转调度算法
&&&&&&& 采用轮转调度算法,系统让处于就绪态的优先级相同的一组任务依次轮流执行预先确定长度的时间片。这是一种处理机平均分配的方法。如果不使用轮转调度算法,优先级相同的一组任务中第一个获得处理机的任务将不会被阻塞而独占处理机,如果没有阻塞或其他情况发生,它不会放弃处理机的使用权。如图3,相同优先级的task1、task2和task3平均分配预先确定的处理机时间片。
&&&&& 3.3 抢占调度与轮转调度混合方式
&&&&&& 有时,基于优先级的抢占式调度可与轮转调度相结合。当优先级相同的一组任务依次轮流平均分配处理机时,若有高优先级的任务转变为就绪态则可抢占该组任务。直到再一次符合执行条件时,该组任务才可再次共享处理机。如图4,相同优先级的task1、task2和task3轮流占有处理机时,高于该组优先级的task4抢占处理机,等task4执行结束,该组任务再次共享处理机。
&&&&&& 为了任务控制的灵活性,wind内核还提供了动态优先级机制,任务的优先级在运行期间可动态地变化。同时,为了防止优先级反转,还具有优先级继承机制,通过使用互斥信号量可以防止高优先级的任务被迫等待一段不确定时间,直到一个低优先级任务完成。
&&&& 4、结论
&&&&& 任务是代码运行的一个映像,从系统的角度来看,任务是竞争系统资源的最小运行单元。vxworks内核使任务能快速共享系统的绝大部分资源,同时有独立的上下文来控制个别线程的执行。内核调度是一个实时系统的核心,它的好坏直接影响整个系统的好坏,通过对这种内核调度分析,可以更深入的理解实时操作系统设计的独到之处。
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一

我要回帖

更多关于 宇宙少女歌曲 的文章

 

随机推荐