北邮研究生嵌入式系统实验课程——第4-3节 VxWorks信号中断和定时
- 格式:pdf
- 大小:656.93 KB
- 文档页数:32
嵌入式系统期末实验一、实验要求题目:支持消息驱动模式的实时软件框架目的:在充分理解嵌入式处理器特点、RTOS 及强实时嵌入式系统软件设计规范的基础上,构建自己的实时系统软件框架基本功能,并在其上自拟应用(如部分模拟TCP 的C/S两端通信流程),测试软件框架的相关功能。
环境:VxWorks 的VxSim 仿真环境或2440(ARM920T)内容:必选功能:1. 消息驱动的Task 统一框架,包含统一消息格式定义及使用规范;2. 支持消息驱动模式的软定时器的机制;3. Task 启动同步功能;4. 体现前次实验中实现的自定义内存管理机制,最大限度降低外部碎片对系统可靠性的威胁。
可选功能(加分):其它有利于实时处理的有效机制,如:无信号量(互斥)支持的临界资源访问方式,zero copy 等;二、实现的功能1. 消息驱动的Task 统一框架,包含统一消息格式定义及使用规范;STATUS Task(){Initialization(MBox, Data Structure, Timer, etc.)Forever{MsgReceiveIf(…){……}else if(…){……}……}}typedef struct _MESSAGE{int mType; /* 消息类型 0:timer->client*1:client->server 2:server->client*/int mSendId; /* 发送任务的MESSAGE ID */int mRecvId; /* 接收任务的MESSAGE ID */int mData; /* 消息中传递的数据 */}MESSAGE;2. 支持消息驱动模式的软定时器的机制;/* timer(id)向客户端消息队列定时发送的定时器*/STATUS timer(int id){MESSAGE* txMsg;/* 用于从消息队列中接收消息 */int tick;/*创建一个定时,用于提醒发送者任务定时发送消息*/tick=sysClkRateGet();semTake(semSynStart,WAIT_FOREVER);FOREVER{taskDelay((int)(tick*DELAY_SECOND));txMsg = (MESSAGE*)memMalloc(MAX_MSG_LEN);txMsg->mType = 0;txMsg->mSendId = MID_TIMER(id);txMsg->mRecvId = MID_CLIENT(id);txMsg->mData = 0;printf("tTimer%d send message to tClient%d!\n",id,id);if(msgQSend(msgQIdClient[id],(char*)&txMsg,MAX_MSG_LEN,WAIT_FOREVER,MSG_ PRI_NORMAL) == ERROR ){return (ERROR);}}return (OK);}3. Task 启动同步功能;由manager()创建的任务优先级最高,先创建timer()、server()、client()的任务,让他们都在等待信号量semSynStart而被阻塞,最后创建manager()的任务,占据CPU,等待其他所有任务都被阻塞,解锁所有等待信号量的任务,让它们同时启动。
VxW orks操作系统中中断的应用Ξ籍林峰,曹 伟ΞΞ(南京船舶雷达研究所,江苏南京,210003)摘 要:主要介绍了VxW orks操作系统中中断的重要性以及具体应用,其中涉及了信号量的概念并对其进行了简单描述。
关键词:嵌入式实时操作系统;中断服务程序;信号量中图分类号:TP3 文献标识码:A 文章编号:100920401(2004)0320067203Application of interruption in the operating system of VxW orksJI Lin2feng,C AO Wei(Nanjing Marine Radar Institute,Nanjing210003,China)Abstract:The im portance and concrete application of interruption in the operating system of VxW orks is in2 troduced in this paper,in which the concept of the semaphore is inv olved and is sim ply described.K ey w ords:embedded real2time operating system;interruption of service program;semaphore1 引 言对系统的响应时间有严格要求的系统,我们通常称之为实时系统。
近半个世纪以来,随着计算机技术的发展,实时系统在各高精尖技术领域得到迅猛发展,具有实时操作系统的计算机系统在实时系统中也得到了广泛的应用。
实时操作系统是嵌入式应用软件的基础和开发平台,它不同于分时操作系统,它的主要任务是对事件进行实时的处理。
虽然时间可能在无法预知的时刻到达,但是软件必须在事件发生时在严格的时限内作出响应。
VxW orks就是一个由Wind River Sys2 tem公司推出的嵌入式实时操作系统,具有多任务、可裁减、可靠性好、实时性高等特点,其在航天领域的出色表现而使之备受广大电子行业的青睐。
实验步骤与结果分析1、建立工程1)、在工程文件中包含如下文件(int、doc、user、lib、start)2)、选择STM32F103VB芯片3)、分别添加如下文件2、运行过程(1) 使用Keil uVision3 通过ULINK仿真器连接EduKit-M3实验平台,打开实验例程NVIC_test子目录下的NVIC.Uv2例程,编译链接工程;(2) 点击MDK 的Debug菜单,选择Start/Stop Debug Session项或Ctrl+F5键,远程连接EduKit-M3实验平台并下载调试代码到目标系统的RAM中;(3) 程序正常启动运行后,会有以下结果:当第一次发生EXTI9 中断后(按下EduKit-M3实验平台上Key按钮),SysTick 中断的优先级比EXTI0中断优先级高。
因此当EXTI0中断发生时(按下Wakeup按钮),将先执行主要程序代码分析/* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);主从优先级的选择Group_1,有先占优先级1位,从优先级3位//配置一个比特为抢占优先级/* Enable the EXTI0 Interrupt */ //使能EXTI0中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = PreemptionPriorityValue;主优先级的选择PreemptionPriorityValueNVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//从优先级等于0.NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Enable the EXTI9_5 Interrupt */ //使能EXTI9_5中断NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//EXTI9_5主优先级的选择等于0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//EXTI9_5主优先级的选择等于0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);/* Configure the SysTick Handler Priority: Preemption priority and sub priority */ //配置SysTick处理程序优先级:抢占优先级和子优先级NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, !PreemptionPriorityValue, 0);while (1){if(PreemptionOccured != FALSE)//当PreemptionOccured != FALSE)抢占发生{GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_7, (BitAction)(1 -GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_7)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_8, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_8)));Delay(0x5FFFF);GPIO_WriteBit(GPIOC, GPIO_Pin_9, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_9)));Delay(0x5FFFF);}}void GPIO_Configuration(void){/* Configure PC6, PC7, PC8 and PC9 as output push-pull */ 使能为推挽输出GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //使能其速度为50MHz GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //使能为推挽输出GPIO_Init(GPIOC, &GPIO_InitStructure);/* Configure GPIOA Pin0 as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 使能为浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);/* Configure GPIOB Pin9 as input floating */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 使能为推挽输出入GPIO_Init(GPIOB, &GPIO_InitStructure);}GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);/* Configure EXTI Line0 to generate an interrupt on falling edge */ 配置EXTI Line0产生一个中断在下降沿EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);(写不完时,可调整表结构。
VxWorks任务调度与中断学步园最近在看有关任务调度和中断的文章,主要的话题或者讨论点可以归为如下几个递进的问题:(1)引发任务调度的情况、原因(2)何为抢占调度?抢占调度是否就指中断引发的调度?(3)关中断是否禁止任务调度?针对上述问题,本文简单说一下个人的理解,有不妥之处还请大家多指点。
下面就以VxWorks操作系统为例,讨论任务调度和中断的关系。
问题(1)引发任务调度的情况、原因首先,看一下VxWorks任务调度时机的两种情况:1) 同步任务切换引起的原因是当前运行的任务可能执行了如下下列操作:①进行阻塞、延迟、挂起的调用如,调用 taskDelay、taskSuspend、semTake等。
②使更高优先级任务就绪而发生优先级抢占如,通过semGive释放信号量,导致更高优先级的任务就绪。
③降低自身优先级或者退出如,任务可通过taskPrioritySet改变自身优先级;通过exit终止自身执行等。
2) 异步任务切换通常由中断服务使高优先级任务就绪引起(如)由上面的描述可知,中断是导致任务可能发生调度的一种情况,而且一般被归为异步任务切换。
而除了同步任务切换和异步任务切换之外,可能还有提及到抢占调度和非抢占调度,进而又联系到中断。
问题(2)何为抢占调度?抢占调度是否就指中断引发的调度?个人认为,VxWorks的抢占调度就是指,由于有高优先级的任务处于就绪状态,而导致系统需要进行任务切换。
另外,我们知道VxWorks系统(wind内核)采用的调度策略为:默认采用基于优先级的抢占式调度;同时,还使用轮转调度。
从这点也能说明,所谓抢占式调度主要是基于任务优先级而言的,而不是针对中断(或者异步任务切换)。
如果非要额外再给抢占式调度下个定义或者归类的话(虽然个人觉得没必要,理解即可),应该包括:1)异步任务切换(中断引发)2)同步任务切换中的第②类,即由于当前运行任务的某种操作,使更高优先级任务就绪而发生优先级抢占除了上述两种情况之外的其他任务切换,都可以认为是当前运行的任务主动放弃CPU使用权,而非被抢占。
VxWorks通用定时器设计与实现摘要:在进行网络通信设备开发时,需要使用通用定时器。
本文在研究VxWorks系统看门狗函数的基础上,提出了基于看门狗函数的定制定时器的设计方法,可以使定制定时器的最小周期满足网络通信设备开发的需要本文给出了定制定时器实现的思想。
1 概述VxWorks是WindRiver公司开发的具有工业领导地位的高性能实时操作系统内核,具有先进的网络功能,易于设计高效的嵌入式系统目前已成为嵌入式操作系统的首选,并将其作为通信产品的软件平台。
在进行网络通信设备开发时,需要用到定时器,如以周期为m秒对某个端口进行查询、以周期为n分对某个设备的性能数据进行统计等。
而VxWorks只提供了像watchDog(看门狗),而没有提供一个通用的定时器。
本文提出的通用定时器设计方法,占用系统资源少,运行效率高,并可根据需要定制满足要求的定时器。
2 通用定时器的基本原理虽然在Vxworks没有提供像windows中的定时器一样好用的定时器,但可以利用VxWorks的看门狗来实现定时器。
对看门狗的操作函数主要有三个:创建看门狗函数WDOG_ID wdCreate(void);启动看门狗函数STATUS wdStart(WDOG_ID wdId,int delay,FUNCPTR pRoutine,int parameter);删除看门狗函数STATUS wdDelete(WDOG_ID wdId)。
通过对看门狗启动函数进行研究发现,如果能够在看门狗的响应函数中重新启动看门狗.那么就可以实现以一个固定的周期循环执行的定时器。
以下是定时器的基本框架:void settimer(int interval){ int in_interval;m_interval=sysClkRateGet()*interval;/*将延时秒数转化为ticks数*/gm wdID =wdCreate();/*创建看门狗*/if(gm_perfHist_wdID = NULL){printf("Could not create watchdog timer\n");return ;}if(wdStart(gm_wdID,m_interval,(FUNCPTR)action_func,interval) = ERROR)/*启动看门狗*/{printf ("Error in starting routine associated with timer\n");wdDelete(gm_wdlD);/*如果启动看门狗不成功,则删除看门狗*/return;}return;}void action_func(int interval){ int m_interval;m_interval=sysClkRateGet()*interval;/*将延时秒数转化为ticks数*/if(wdStart(gm_wdID,m_interval,(FUNCPTR)action_fnnc,interval)= ERROR)/*启动看门狗*/{printf ("Error in starting routine associated with timer\n");wdDelete(gm_wdID);return;}/*执行用户函数*/……}用户只需调用settimer并给出以秒为单位的定时器周期,就可以建立一个定时器。
嵌入式-中断实验本次实验是一项关于嵌入式系统中断的实验,通过本次实验,我们可以深入了解中断的概念和实现原理,并通过程序代码实现中断的应用。
一、实验原理在嵌入式系统中,中断是一种非常重要的机制,它能够使CPU在执行程序的同时,及时响应外部的事件,例如外部设备的数据传输、计时器的溢出等,从而保证系统的稳定和高效运行。
中断的实现原理是通过CPU计时器实现的,当计时器的值达到某个设定值时,就会发出中断信号,将CPU的执行过程中断,跳转到中断处理程序中,处理完中断事件后,再回到原来的程序中断处继续执行。
二、实验器材1. STC89C52单片机开发板2. LED灯一盏3. 电路连线三、实验步骤1. 首先,在开发板上连接好电路,将LED连接到P1口第0个引脚上,然后在开发环境中编写程序代码。
2. 在程序代码中先设置定时器的计数值,例如本次实验设置为65535。
然后开启定时器中断功能,使CPU在执行程序的同时能够及时响应中断事件,并在中断发生时跳转到中断处理程序中执行。
3. 在中断处理程序中将LED灯的状态进行反转,即每次中断事件发生时,将LED灯的状态从亮转为灭,或从灭转为亮。
4. 在主程序中重复执行LED灯的闪烁操作,从而能够观察到中断事件对LED灯亮灭状态的影响。
四、实验代码#include<reg52.h>unsigned char T0RH=0xff; //定时器高八位unsigned char T0RL=0xff; //定时器低八位void InitTimer0() //初始化定时器0{TMOD &= 0xf0; //清零T0控制位TMOD |= 0x01; //设置T0为模式1TH0 = T0RH; //设置定时器0高八位初值TL0 = T0RL; //设置定时器0低八位初值TR0 = 1; //启动定时器0ET0 = 1; //允许定时器0中断EA = 1; //开放总中断允许}五、实验效果经过以上步骤,就可以实现中断模式下的LED灯闪烁效果,每次定时器中断事件发生时,LED灯的亮灭状态会发生变化。