北邮研究生嵌入式系统实验课程——第4-3节 VxWorks信号中断和定时
邝坚_北邮嵌入式实验报告
嵌入式系统期末实验一、实验要求题目:支持消息驱动模式的实时软件框架目的:在充分理解嵌入式处理器特点、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,等待其他所有任务都被阻塞,解锁所有等待信号量的任务,让它们同时启动。
《嵌入式系统实现》课件—04定时器及其中断
何为定时器?
❖ 定时器就如同一个杯子,一个容器 ❖ 中间哪条线就如同初值
❖ STM32F103有8个16位的定时器TIM1~ TIM8
❖ TIM1和TIM8为高级定时器(定时、比较、 PWM 、死区时间控制)
❖ TIM6和TIM7是基本定时器(定时功能) ❖ TIM2~TIM5为通用定时器(定时、比较、
❖ 而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器 TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数 值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反 地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平( 或高电平)。
模拟仿真图 实测图
❖ TIM6和TIM7是基本定时器(不能产生PWM) ❖ TIM2~TIM5为通用定时器(可产生PWM) ❖ TIM1\TIM8是高级定时器(可产生PWM)
TIM1的独立通道是PA8、PA9、PA10、PA11; TIM2的独立通道是PA0、PA1、PA2、PA3; TIM3的独立通道是PA6、PA7、PB0、PB1。 具体见《 STM32F10xxx参考手册.pdf》(754页)
❖ 向上计数:从0开始计数并且产生一个计数器溢 出事件
❖ 16位自动重装载累加计数器
❖ 定时器:对内部的时钟计数(脉冲),因此,需 要确定内部时钟的周期等;需要确定触发方式
定时器及PWM产生
❖ 定时器的基本用法是定时器中断, 即当计数溢出时,产生定时器中断 ,因而周期性的去中断处理函数做 一些事情
❖ 如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值 (N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR 的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为 A/(N+1) 。
vxworks操作系统中中断的应用
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);(写不完时,可调整表结构。
北邮研究生嵌入式系统实验课程——第4-2节 VxWorks任务间通信
创建信号量
SEM_ID semBCreate( options, initialState)
– Options 为阻塞在该信号量的任务规定排队的类 型(SEM_Q_PRIORTY或SEM_Q_FIFO) – initialState 初始化信号量为可用(SEM_FULL)或 不可用(SEM_EMPTY)
VxWorks提供三种类型的信号量
–二进制信号量:最快和常用的信号量,提供阻塞方式,用 于实现同步或互斥 –互斥信号量:用于实现互斥问题的特殊的二进制信号量, 解决具有互斥、优先级继承、删除安全和递归等情况 –计数信号量:类似于二进制信号量,记录信号量被释放的 次数。适合于一个资源的多个实例需要保护的情况
LOCAL SEM_ID fooBinSemId, fooMutexId; LOCAL FOO_BUF fooBuffer; fooSet(); 互斥信号量 … 共享内存 fooGet(); …
链表
lstLib库提供对双向链表进行操作的函数
List Descriptor Header Tail User node1 User node2 NODE
任务锁的使用
taskLock()/taskUnlock()
– 禁止所有其它任务执行 – 当非常频繁地做某事时使用 – 注意要保持critical region短
funcA () {
taskLock (); . . /* critical region of code that cannot be interrupted */ . taskUnlock ();
等待事件的任务调用semTake(),并一直阻塞 到得到信号量 检测到事件的任务或中断调用semGive();解锁 了等待事件的任务
VxWorks任务调度与中断学步园
VxWorks任务调度与中断学步园最近在看有关任务调度和中断的文章,主要的话题或者讨论点可以归为如下几个递进的问题:(1)引发任务调度的情况、原因(2)何为抢占调度?抢占调度是否就指中断引发的调度?(3)关中断是否禁止任务调度?针对上述问题,本文简单说一下个人的理解,有不妥之处还请大家多指点。
下面就以VxWorks操作系统为例,讨论任务调度和中断的关系。
问题(1)引发任务调度的情况、原因首先,看一下VxWorks任务调度时机的两种情况:1) 同步任务切换引起的原因是当前运行的任务可能执行了如下下列操作:①进行阻塞、延迟、挂起的调用如,调用 taskDelay、taskSuspend、semTake等。
②使更高优先级任务就绪而发生优先级抢占如,通过semGive释放信号量,导致更高优先级的任务就绪。
③降低自身优先级或者退出如,任务可通过taskPrioritySet改变自身优先级;通过exit终止自身执行等。
2) 异步任务切换通常由中断服务使高优先级任务就绪引起(如)由上面的描述可知,中断是导致任务可能发生调度的一种情况,而且一般被归为异步任务切换。
而除了同步任务切换和异步任务切换之外,可能还有提及到抢占调度和非抢占调度,进而又联系到中断。
问题(2)何为抢占调度?抢占调度是否就指中断引发的调度?个人认为,VxWorks的抢占调度就是指,由于有高优先级的任务处于就绪状态,而导致系统需要进行任务切换。
另外,我们知道VxWorks系统(wind内核)采用的调度策略为:默认采用基于优先级的抢占式调度;同时,还使用轮转调度。
从这点也能说明,所谓抢占式调度主要是基于任务优先级而言的,而不是针对中断(或者异步任务切换)。
如果非要额外再给抢占式调度下个定义或者归类的话(虽然个人觉得没必要,理解即可),应该包括:1)异步任务切换(中断引发)2)同步任务切换中的第②类,即由于当前运行任务的某种操作,使更高优先级任务就绪而发生优先级抢占除了上述两种情况之外的其他任务切换,都可以认为是当前运行的任务主动放弃CPU使用权,而非被抢占。
北邮研究生嵌入式系统实验课程——第4-4节 VxWorks网络编程
VxWorks网络组件
basic network initialization components: 基本的网络初始化组件
– VxWorks基本网络支持 – 网络设备的启动
network devices:网络设备
– 网络设备的类型
networking protocols:网络协议
– TCP/IP组件 – 应用及路由协议
2
1、网络基础
OSI七层协议 TCP/IP协议 路由 Internet Protocol(IP)
– 数据报(Datagram)通信协议 – 是一种尽力而为业务(Best-effort ) 数据丢失(Loss) 重新排序(Reordering) 数据重复(Duplication) 延时(Delay) – 主机到主机的数据传送
Block until connection established
Socket() Connect()
Connection establishment
send()
Communication message (request)
recv()
Process request
send()
Communication message (reply)
传输协议(Transport Protocols)
用户数据报协议( User Datagram Protocol (UDP))
– 对数据进行校验 – 仍然是尽力而为的服务
传输控制协议(Transmission Control Protocol (TCP))
– 对数据进行校验 – 可靠的字节流传送 – 流量和拥塞控制
3
IP地址
32-bit的识别符 (IPv4, IPv6=128 bits) 点分方式的四个十进制数来表示: 192.118.56.25 -> 167.208.101.28
VxWorks通用定时器设计与实现
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并给出以秒为单位的定时器周期,就可以建立一个定时器。
第4.3节 VxWorks信号中断和定时
18
VxWorks中断处理流程
保存CPU寄存器 从中断控制器读中断向量号 顺序调用该中断服务程序 通知中断控制器中断服务程序结束 恢复CPU寄存器 返回
第4章
.
19
中断和优先级
第4章
.
20
ISR的使用限制
第4章
.
ISR执行完成之前,其它任务不能执行 ISR中不能调用某些VxWorks函数,尤其是,ISR不
信号量
ISR释放信号量,任务等待接收信号量
消息队列
ISR发送消息,任务等待接收消息,如果消息队列满,该消息被丢弃
管道
ISR向管道写消息,任务读消息
信号
ISR可以向任务发送signal。
23
调试中断
第4章
.
中断处理程序可以调用logMsg()向系统输出诊断信 息
logMsg(“foo = %d\n”,foo,2,3,4,5,6) 向tLogTask发送请求为我们实现printf()的功能
轮询硬件 检查系统错误
VxWorks提供对两种定时器的相同的接口
系统时钟 辅助时钟
26
系统时钟
第4章
.
系统时钟完成下列工作
增加ticks计数(使用tickGet()获得计数值)
更新延时和超时计数器
检查循环调度
默认的时钟频率是60Hz
sysClkRateSet()
设置时钟频率
参考sigLib (组件:INCLUDE_SIGNALS)
6
信号编号
第4章
.
31个信号编号,从1-31
#define #define #define #define
嵌入式-中断实验
嵌入式-中断实验本次实验是一项关于嵌入式系统中断的实验,通过本次实验,我们可以深入了解中断的概念和实现原理,并通过程序代码实现中断的应用。
一、实验原理在嵌入式系统中,中断是一种非常重要的机制,它能够使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灯的亮灭状态会发生变化。
邝坚-北邮嵌入式实验报告
嵌入式系统期末实验一、实验要求题目:支持消息驱动模式的实时软件框架目的:在充分理解嵌入式处理器特点、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,等待其他所有任务都被阻塞,解锁所有等待信号量的任务,让它们同时启动。
北邮 嵌入式 实验报告
北邮嵌入式实验报告北邮嵌入式实验报告一、引言嵌入式系统是将计算机技术与其他工程领域相结合的一种综合应用技术,广泛应用于各个领域。
本实验旨在通过对北邮嵌入式系统的学习与实践,深入了解嵌入式系统的原理和应用。
二、实验背景北邮嵌入式实验是计算机科学与技术专业的一门重要实践课程。
通过该实验,学生可以掌握嵌入式系统的基本原理、设计方法和调试技巧,提高对计算机硬件和软件的综合应用能力。
三、实验内容1. 硬件平台本实验使用的硬件平台为北邮嵌入式系统开发板,该开发板集成了ARM Cortex-M3内核的处理器,具有丰富的外设接口和扩展能力。
2. 软件开发环境本实验使用的软件开发环境包括Keil MDK-ARM集成开发环境和ST-Link调试工具。
Keil MDK-ARM提供了一套完整的软件开发工具链,包括编译器、汇编器、链接器和调试器等,方便学生进行嵌入式软件的开发和调试工作。
3. 实验任务本实验主要包括以下几个任务:(1) 学习嵌入式系统的基本原理和架构,了解处理器的工作原理和寄存器的使用方法。
(2) 学习嵌入式软件开发的基本流程,包括编译、烧写和调试。
(3) 编写简单的嵌入式应用程序,实现对外设的控制和数据处理功能。
(4) 调试和测试嵌入式应用程序,验证程序的正确性和稳定性。
四、实验过程1. 学习嵌入式系统的基本原理和架构在实验开始前,我们首先学习了嵌入式系统的基本原理和架构。
了解了处理器的工作原理,包括指令执行过程、寄存器的使用方法等。
同时,我们还了解了嵌入式系统的外设接口和扩展能力,为后续的实验任务做好准备。
2. 学习嵌入式软件开发的基本流程在掌握了嵌入式系统的基本原理后,我们开始学习嵌入式软件开发的基本流程。
首先,我们安装了Keil MDK-ARM集成开发环境,并配置了相应的编译器和调试器。
然后,我们学习了嵌入式软件的编译、烧写和调试方法,掌握了如何将编写的程序烧写到开发板上,并通过调试工具进行程序的调试和测试。
vxworks中断处理[精彩]
Vxworks作为一个实时嵌入式操作系统,通常采用中断的方式来满足系统实时性的要求,因此,熟悉其中断的处理过程对于VxWorks操作系统的开发是至关重要的.本文通过编写和调试基于A T91RM9200处理器的VxWorks嵌入式操作系统的BSP,来讨论VxWorks操作系统的中断机制。
1 VxWorks中断处理机制及AICAT91RM9200使用一个8优先级,可单独屏蔽中断的中断向量控制器AIC。
在ARM体系结构中,有7种异常中断,对应有一个异常中断向量表。
ARM体系结构要求这个异常中断向量表从0地址处开始,对于外部中断请求IRQ,系统又增加了一块由中断控制器控制的中断向量表。
2 AT91RM9200 BSP的中断驱动的实现2.1 中断驱动中定义的函数STATUS at91rm9200LvlVecChk (int*,int*);STATUS at91rm9200LvlVecAck(int,int);STATUS at91rm9200LvlEnable(int);STATUS at91rm9200LvlDisable(int);2.2 高级中断控制器AIC的初始化在usrInit()中excVecInit()函数对异常中断向量进行初始化.整个中断库,以及中断控制器的初始化都是在syslib.c中的sysHwInit2()函数中完成的.该函数在sysClkConnect()中被调用,因为系统时钟中断要在内核开放中断后就要使能,因此内核在初始化为一个多任务环境后,就产生一个usrRoot()的任务,在该任务中要建立系统时钟中断,因此调用了sysClkConnect()函数,中断库以及中断控制器的初始化也就完成了。
高级中断控制器必须进行初始化,其初始化是在板级支持包BSP的中断驱动程序中。
具体的实现函数是void at91rm9200IntDevInit(void)。
该函数在文件syslib.c的sysHwInit2()函数中调用。
北邮研究生嵌入式系统实验课程——第4-1节 VxWorks任务的基本原理
任务优先级
从0(最高)到255(最低) 程序员可以动态地对优先级进行操作
– taskPriorityGet (tid, &priority) – taskPrioritySet (tid, priority) 使用这些函数会使得程序分析起来比较困难
创建一个任务
int taskSpawn( name, priority, options, stackSize, entryPt, arg1,…,arg10)
Name 任务名,如果是NULL系统就给一个默认的名字 Priority 任务优先级,值从0-255 Options 任务选项,如VX_UNBREAKABLE stackSize 所分配的以字节为单位的堆栈大小 entryPt 开始执行的代码的地址 Arg1…arg10 entryPt总共可以有10个参数
执行速度要快
– 快速响应 – 开销小
确定性要求
– 迟到的响应就是错误的响应
如何选择一个设计方案
如何设计一 个系统来控 制机械手
采用单个任务的方法
如果以单个任务的方式来设计系统 一个任务在一个循环中控制所有的部件 arm() { for(; ;) {if (shoulder needs moving) moveShoulder(); if (elbow needs moving) moveElbow(); if (wrist needs moving) moveWrist(); …} }
基于优先级的重新调度可以在任何时间发生
– 基于轮转的调度要以系统的ticks为间隔
VxWorks中的任务
任务的创建 任务名和任务标识 任务的优先级 任务堆栈 任务选项 任务删除 安全删除 资源重用
04_VxWorksInterruptsTimers
异常, 中断和定时器3Exception Handling Overview•exception是计划外的事件–例如: 非法指令, 数据或指令错误, 浮点或整数溢出, 除以0等–CPU产生内部中断–强制改变PC指针到一个预定地址来处理exception •BSP 在启动阶段安装异常处理程序–VxWorks 通过发送信号(signal)跟用户任务通信–用户安装signal 服务程序然后运行–如果不安装signal 服务程序, 执行系统的缺省操作•典型情况下任务被中止•打印异常信息5VxWorks Signals•对于没有安装服务程序的signal, 都将被忽略•可以安装处理程序处理SIGKILL信号(否则将忽略)•没有SIGPIPE, 或SIGURG的信号处理函数可用•如果执行taskDelay() 的任务被信号中断, 将设置errno= EINTR并返回ERROR6Important Caveats•对于通常的任务间通信不建议使用signal, 因为:–当发生优先级继承时, 处理signal 的任务优先级不是期望的优先级–扰乱了预期的执行顺序–如果signal 的处理函数和接收signal 的任务调用了相同的函数, 将引发重入问题–收到signal 的任务将即时终止, 如果持有互斥信号量将引起共享资源状态不一致•sigLib(以及POSIX) 支持SystemV和BSD 类型的signal 接口–不要混合使用8Registering a Signal Handlersignal (signo, handler)signo Signal numberhandler signal 服务程序(如果忽略这个signal, 则使用SIG_IGN)•返回前面注册的signal 服务程序或者SIG_ERR •Signal 服务程序应该按照下面的模式声明void sigHandler(int sig); /* Or */void sigHandler(int sig, int code, struct sigcontext* p);/* (See notes below) */10Exception Signal Handler•Exception 典型的signal 服务程序–taskExit()–终止任务–taskRestart()–重启任务–longjmp()–恢复到setjmp() 存储的位置执行–exit()–结束进程–直接返回•出异常的任务处于挂起状态12Hardware Device Interrupts•中断用于通知cpu有事件发生•用户可以自定义中断服务程序, 当中断发生后系统会自动执行•中断服务程序–中断服务程序不是任务–中断服务程序不能阻塞(pend)–中断服务程序与任务通信只能通过信号量, 队列或“volatile”类型的全局变量等–中断服务程序应该设计得尽量简单•在cpu内, 定时器是最普通的中断源14Interrupts API•intConnect(vector, pISR, pArg)–为中断向量注册中断服务程序•intDisconnect(vector, pISR, pArg)–删除指定中断向量上的中断服务程序•intEnable(vector)–使能中断•intDisable(vector)–禁止中断15Device Drivers•相关内容可以参考:–VxWorks Device Driver Developer’s Guide–VxWorks BSP Developer’s Guide–VxWorks Kernel Programmer’s Guide–Wind River Workbench Users Guide–General Purpose Platform,VxWorks Edition, Board Support Package Workshop21ISR Restrictions•所有就绪的中断服务程序都执行完, 任务才能执行, 无论多高的任务优先级, 都不能凌驾于中断之上•部分函数在中断服务程序中不允许调用–不允许带有阻塞操作的拿函数–不能调用semTake()–不能调用malloc()(可能使用semTake)–不能调用IO系统函数(no printf()) (可能使用信号量)–对于使用外部浮点协处理器(FP co-processor)的cpu, 不能使用浮点指令•没有对这部分寄存器执行压栈出栈操作•VxWorks Kernel Programmer’s Guide 中包含了一份可以在中断中调用的列表22ISR Guidelines•保持中断服务程序尽量短, 否则:–将对同优先级或低优先级中断造成延迟–延迟所有的任务执行–难以调试•避免在中断中使用浮点操作–速度太慢–中断服务程序必须显式的调用fppSave() 和fppRestore() •尽最大可能把工作交给相关任务去做, 尤其是:–持续时间长的工作–重要程度不高的工作23Typical ISR•读写IO寄存器•或通过下列方式与任务通信–写内存–以non-block方式写消息队列–释放二进制信号量或计数信号量–任务和中断共享的变量通常增加“volatile”类型24Debugging ISRs•调用logMsg 把调试信息打印在串口logMsg (“foo =%d\n”, foo, 0, 0, 0, 0, 0);•发送请求给tLogTask 做打印–格式化字符串带有6个参数–参数必须是4字节的类型(long, int, unsigned long)•Or,–系统级调试•WDB agent•Emulator26Timers•定时器使用户定义的中断服务程序, 将在定期执行, 用于:–论询(polling)硬件–检查系统错误(例如热插拔)–中止不合时宜的操作•VxWorks 提供了两个定时通用接口–系统时钟(System clock )(必选)–辅助时钟(Auxiliary clock)(可选)27System Clock•系统时钟中断服务程序–增加tick 计数(使用tickGet()测试)–更新任务的delay 时间和信号量的timeout 时间–检查时间片轮转调度(round-robin rescheduling)–这些操作都可能引起重新调度•缺省时钟频率是60hz–int sysClkRateGet()–返回每秒的tick 数–void sysClkRateSet(freq)–设置主时钟频率(每秒的ticks)•如果超出范围返回-1•应该只在系统初始化阶段调用一次29Watchdog Timers•Kernel space only–Use POSIX timers in user space (not covered here)•User interface to system clock•Allows a C routine to execute after a specified time delay •Upon expiration of delay, connected routine runs –As part of system clock ISR–Subject to ISR restrictions•No printf(),malloc(),and so on30Creating Watchdog Timers•To create a watchdog timerWDOG_ID wdCreate ()Returns watchdog id, or NULL on error•To start (or restart) a watchdog timerSTATUS wdStart (wdId, delay, pRoutine, parameter) wdId Watchdog id, returned from wdCreate()delay Number of ticks to delaypRoutine Routine to call when delay has expiredparameter Argument to pass to routine (int)33Stopping Watchdogs•To cancel a previously started watchdogSTATUS wdCancel (wdId)•To free watchdog timer resources (and cancel previous start) STATUS wdDelete (wdId)35Polling Issues•Could poll at task time or interrupt time–Interrupt time polling is more reliable, but–Task time polling has a smaller impact on the rest of the system •Polling at interrupt time typically done using watchdogs •To poll at task time, there are two options–taskDelay()–efficient, but imprecise since subject to “drift”–wdStart() +semGive()–much more robust since synchronized with system clock38Auxiliary Clock•For high speed polling•Precludes using shell routine spy(), which also uses auxiliary clock•Some routines to manipulate auxiliary clock sysAuxClkConnect( )Connect ISR to aux clocksysAuxClkRateSet( )Set aux clock ratesysAuxClkEnable( )Start aux clocksysAuxClkDisable( )Stop aux clock39Summary•Using signals for exception handling–signal()–exit()–taskRestart()–longjmp()•Interrupt Service Routines have a limited context –No Blocking–No I/O system calls40Summary (Continued) Polling with timers41Questions1.What is an exception?2.How do VxWorks exception handlers communicate with user tasks?3.If an exception signal handler returns, the offending task will bestopped. (true/false)4.What are a common source of interrupts?5.Interrupts cannot preempt the highest priority task. (true/false)6.An ISR can call semTake() if it needs to do something fast. (true/false)7.What will an exception occurring during interrupt time generate?8. A watchdog timer can run in the context of any task, as long asinterrupts are serviced. (true/false)42ReviewIn this chapter you learned to:•Install signals to handle exceptions•Register a signal handler•Handle interrupts•Debug ISRs•Use watchdog timers to execute user-defined routines at periodic intervals or after specified time delays •Change the system clock rate•Poll at both task, and interrupt, time•Use the auxiliary clock for high speed polling。
嵌入式系统中的中断处理
嵌入式系统中的中断处理在嵌入式系统中,中断处理是一项至关重要的任务。
中断是指由硬件或软件引发的事件,它打断了CPU的正常执行流程,需要在最短的时间内进行响应和处理。
本文将详细探讨嵌入式系统中的中断处理过程以及相关的技术和策略。
一、中断的概念与分类中断是指CPU接收到一个来自硬件或软件的信号,要求其立即停止正在执行的任务,转而执行一个与之相关的处理程序。
根据中断的来源,可以将中断分为硬件中断和软件中断两种类型。
硬件中断是由外设或内部电路触发的,它可以是定时器超时、外部设备请求等。
硬件中断一般由硬件电路直接与CPU相连,并通过电平或脉冲等信号进行触发。
软件中断是由软件指令触发的,它包括系统调用、异常、陷入等。
软件中断通常是由程序员通过编写相关的中断处理程序来触发和处理的。
二、嵌入式系统中的中断处理过程1. 中断请求与触发当一个中断事件发生时,外设或软件将向CPU发送一个中断请求信号。
CPU在接收到中断请求信号后,需要及时进行中断处理。
在硬件中,中断请求信号通常是通过IRQ(中断请求)引脚发送给CPU;在软件中,通过相关的指令将中断请求传递给CPU。
2. 中断响应与保存上下文CPU在接收到中断请求信号后,需要立即停止当前执行的指令,并保存当前正在执行的程序状态。
这个过程称为中断响应。
为了保存中断发生时的上下文环境,CPU会将当前的程序计数器PC、状态寄存器和一些重要的寄存器的值保存到特定的内存中,以便在中断处理结束后能够正确地恢复现场。
3. 中断处理程序的执行中断处理程序是用来处理中断事件的代码段,它通常被事先定义和初始化。
当中断响应完成后,CPU会跳转到对应的中断处理程序的入口地址开始执行。
中断处理程序根据中断类型进行相应的处理,可以包括读取和处理外设数据、更新系统状态、保存和恢复其他寄存器等操作。
4. 中断处理程序的结束与恢复现场在中断处理程序执行完毕后,CPU会根据程序计数器PC中保存的值,返回到中断发生前的执行状态,即恢复现场。
嵌入式软件开发基础实验报告 中断实验
上海电力学院嵌入式软件开发基础实验报告题目:ARM 【实验4.3】中断实验专业:电子科学与技术年级:姓名:学号:一、实验目的(1)、学会使用 Embest IDE 编写简单的 C 语言程序并进行调试;(2)、了解不同中断触发方式对中断产生的影响;(3)、理解 S3C44B0X 处理器的中断响应过程;(4)、熟练掌握如何进行 ARM 处理器中断处理的软件编程方法。
二、实验设备硬件:Embest EduKit-III 实验平台,Embest ARM 标准/增强型仿真器套件,PC 机。
软件:Embest IDE Pro ARM 集成开发环境,Windows 98/2000/NT/XP。
三、实验步骤1. 准备实验环境使用 Embest 仿真器连接目标板,使用 Embest EduKit-III 实验板附带的串口线,连接实验板上的 UART0 和 PC 机的串口。
2. 串口接收设置在PC 机上运行windows 自带的超级终端串口通信程序(波特率115200、1 位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。
3. 打开实验例程1)拷贝光盘CD1\Software\EduKit44b0 文件夹到EmbestIDE\Examples\Samsung\ 目录下;2) 使用 Embest IDE 通过 Embest JTAG 仿真器连接实验板,打开实验例程目录 4.3_int_test 子目录下的 int_test.pjf 例程,编译链接工程;3) 点击 IDE 的 Debug 菜单,选择 Remote Connect 项或 F8 键,远程连接目标板;4) 点击 IDE 的 Debug 菜单,选择 Download 下载调试代码到目标系统的 RAM 中;5) 打开 View 菜单>Debug Windows>Register 寄存器观察窗口(快捷键Alt+5 ),在寄存器观察窗口下面选择外围寄存器(Peripheral),将 INTERRUPT 中断寄存器组展开,重点观察 INTPND 和 I_ISPR 寄存器值的变化。
嵌入式系统软件设计VxWorks【第4章】嵌入式操作系统原理
任务 P0 P1 P2 P3 P4
运行时间 350 125 475 250 75
1275
20
最短任务优先调度
任务等待时间
W p0 450 W p1 75 W p2 800 W p4 0
W p3 200
28
轮转调度
系统采用计时器中断;
每个时间中断产生后,执行时间中断处理程序; 时间中断处理程序调用调度器; 调度器选择新的任务执行;原有任务进入任务 就绪队列,等待下次执行。
29
轮转调度
假设时间额度为50,忽 略任务Contex切换时间, 则调度结果如下图。
任务 P0 P1 P2 P3 P4 运行时间 350 125 475 250 75
12
调度策略
内核调度策略选择依据
如何设计调度程序为竞争的任务分配CPU,以满足 外部的目标要求?
是否应该基于优先级来分配CPU?
是否应该基于公平的原则分配CPU? 是否应该基于任务执行时间的长短来分配CPU?
13
调度策略
非抢占式调度
任何一个任务一旦被分配CPU,该任务可以运行到 结束;中断可以打断任务的执行,但中断返回后 CPU控制权仍回到被中断的任务。
W p3 475 475 950
W p4 950 250 1200
平均等待时间
W 0 350 475 950 1200 5 595
19
最短任务优先调度
假设所有任务的服务 时间都事先知道,一 个合理的调度策略是 先选择服务时间少的 任务执行;
(4)
就绪态
时间
北邮嵌入式系统设计实验-实验报告
嵌入式实验报告学院:xxx班级:xxx学号:xxx姓名:xxx成员:xxx一、基础知识部分1.多线程实验本章主要讲解线程的概念和线程间的同步方式。
实验一主要介绍线程的概念和线程的创建,实验二、实验三、实验四分别介绍了信号量、互斥锁、条件变量的作用和使用。
1.1 线程的介绍线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。
线程是程序中一个单一的顺序控制流程。
进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。
在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程是允许应用程序并发执行多个任务的一种机制,是程序运行后的任务处理单元,也是SylixOS操作系统任务调度的最小单元。
在多核CPU中,同时可以有多个线程在执行,实现真正意义上的并行处理。
线程入口函数是一个能够完成特定任务的函数,因此线程入口函数的编写上与普通函数没有太多区别。
线程的创建函数如下:●创建线程失败,函数返回非0的错误代码,成功返回0;●*thread pthread_t类型的缓冲区,保存一个线程的线程ID;●*attr 设置线程属性,设置为NULL标识创建的新线程使用默认属性;●*(*start_routine) 线程入口函数函数名●*arg 向所创建线程传入的参数1.2 信号量的概念信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用。
在进入一个关键代码段之前,线程必须获取一个信号量;一旦该关键代码段完成了,那么该线程必须释放信号量。
其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。
信号量是一个在进程和线程中都可以使用的同步机制。
信号量类似于一个通知,某个线程发出一个通知,等待此通知的线程收到通知后,会执行预先设置的工作。
当接收通知的线程没有收到通知前,会处于阻塞状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中断号 handler 硬件 中断
myISR() { … }
设置中断处理程序
VxWorks提供函数intConnect(), 它允许将指 定的C函数与任意中断相联系
STATUS intConnect() { VOIDFUNCPTR *vector; /*要联系的中断向量*/ VOIDFUNCPTR *routine; /*中断发生时要调用的函数*/ int parameter; /*传递给中断处理函数的参数*/ }
– 轮询硬件 – 检查系统错误
VxWorks提供对两种定时器的相同的接口
– 系统时钟 – 辅助时钟
系统时钟
系统时钟完成下列工作
– 增加ticks计数(使用tickGet()获得计数值) – 更新延时和超时计数器 – 检查循环调度
默认的时钟频率是60Hz
sysClkRateSet() sysClkRateGet() 设置时钟频率 获得时钟频率
向tLogTask发送请求为我们实现printf()的功能
和printf()相似,但必须注意
– 参数必须为4字节 – 函数有6个入口参数
使用具有系统级调试的机制进行调试
– WDB Agent – emulator
3. 定时器
系统时钟中断服务程序 看门狗定时器 辅助时钟
定时器
板上的定时器会周期性地中断CPU 定时器使得用户自定义的程序可以周期性地执行 ,这对下列情况非常有用
信号
Kill (tid, signal)
Task或ISR
Task
Void nomalcode() {… /*incoming signal*/ … } Void Handler() {… /*deal with signal*/ … }
信号的特性
软件信号机制,相当于软中断。主要用于错误和异常处 理; VxWorks中总共有31个信号,每个信号对应一个不同的 事件,编号(1-31) 任务可以提供一个信号处理程序对到来的信号进行处理 信号可以异步改变任务的控制流。获得信号的任务立即 挂起当前的执行,在下次调度它运行时转而执行指定的 信号处理程序 当信号处理程序执行完后,任务重新开始执行 即使任务被阻塞,信号服务程序仍可以被激活; UNIX BSD-style信号 、POSIX-compatible信号; 参考sigLib (组件:INCLUDE_SIGNALS)
在异常信号处理程序返回后:
– 出现异常的任务将被挂起 – 控制台显示出错信息
异常信号处理程序通常调用:
– Exit():终止当前任务 – taskRestart():重启任务 – Longjmp():从setjmp()保存的位置继续执行
2. 中断服务程序
ISR基本知识 ISR的限制
中断的概念
wdStart()可以在超时时运行看门狗程序,要想周期性 执行,看门狗程序必须调用wdStart()自己重新启动
使用看门狗定时器
使用看门狗定时器可以使一段程序周期性地执行
wdId = wdCreate(); wdStart ( wdId, DELAY_PERIOD, myWdIsr, 0); void myWdIsr (param) { doit (param); wdStart ( wdId, DELAY_PERIOD, myWdIsr, 0); }
#define SIGRTMIN 23 #define SIGRTMAX 29 #define SIGUSR1 30 #define SIGUSR2 31
基本的Signal函数
信号处理流程
Pend Queue
4
3 1 2
Ready Queue
运行信号 处理程序
1. 当任务处于阻塞状态时收到signal 2. 任务离开阻塞队列,进入就绪队列,准备运行 3. 当任务成为就绪队列中优先级最高的任务时, 执行信号处理程序 4. 信号处理程序执行完后,任务返回阻塞状态, 保持原始超时信息不变
嵌入式系统实验
第4-3节 VxWorks信号、中断和定时
夏海轮 xiahailun@
北京邮电大学 信息与通信工程学院
本节主要内容
1. 异常处理和信号 2. 中断服务程序 3. 定时器
1. 异常处理和信号
异常的处理 信号 加载用户自定义的信号
异常(exception)处理概述
SIGHUP 1 SIGINT 2 SIGQUIT3 SIGILL 4 SIGTRAP5
SIGABRT 6 SIGEMT 7 SIGFPE 8 SIGKILL 9 SIGBUS 10 SIGSEGV
/* /* /* /*
hangup */ interrupt */ quit */ illegal instruction (not reset when ca
– – – – 不能调用semTake() 不能调用malloc(),free() 不能调用I/O系统函数(如printf()) 不能调用使用浮点协处理器的程序
非法指令或总线错导致硬件异常时,该任务被挂 起,其他任务继续执行 如果ISR没有context被挂起,vxworks将在低 端内存保存对异常的描述,并重启系统
异常是CPU所产生的非预料的事件,包括如:陷 阱、中断指令、被零除、浮点指针或整数溢出、 错误指令或地址错误。 一个异常将产生一个内部中断。 VxWorks在系统启动时安装异常处理器,当发 生异常事件时,异常处理器将会对该异常进行处 理并发起一个用户定义的异常处理。 VxWorks的异常处理器通过向用户任务发送信 号来进行通信,使得用户任务开始执行。
该函数将指定的C函数与指定的中断向量相联系 ,函数的地址存放在这个中断向量中。当发生中 断时,系统调用该函数。
中断堆栈
大多数体系结构的CPU的ISR使用相同的中断 堆栈 中断堆栈在系统启动时分配 堆栈大小由宏ISR_STACK_SIZE控制,默认 值在configAll.h中定义 堆栈必须足够大,以保证能够处理系统最坏情 况下的中断嵌套 ISR没有任务控制块(TCB),并且所有的ISR 共享一个堆栈
/* trace trap (not reset when caught) *
/* used by abort, replace SIGIOT in the /* EMT instruction */ /* floating point exception */ /* kill */ /* bus error */ 11 /* segmentation violation */ /* /* /* /* Realtime signal min */ Realtime signal max */ user defined signal 1 */ user defined signal 2 */
注册一个信号处理程序
使用下面的函数注册一个信号处理函数
– Signal (signo,handler) – Signo 信号号 – Handler 信号到来时所触发的处理程序
返回值为信号处理函数的入口地址,或SIG_ ERR 信号处理程序的声明如下:
Void sigHandler (int sig ); /*signal number* /
doit程序可以
– 轮询某些硬件设备 – 解锁某些任务 – 检查系统是否出现错误
用看门狗定时器处理超出时限
实时系统任务的一个重要特征是具有时限约束, 任务执行一旦超出时限,系统可能导致灾难性的 后果。看门狗定时器可以用来启动时限事故处理 任务。
WDOG_ID wdId; void foo( void ){ wdId = wdCreate ( ); /*must finished each cycle in under 10 senconds*/ FOREVER{ wdStart( wdId, DELAY_10_SEC, fooISR, 0 ); fooDoWork (); } } void fooDoWork (void ){ /*handle missed deadline*/ }
停止看门狗定时器
要取消原来已经启动的看门狗定时器
STATUS wdCancel (wdId)
要删除一个看门狗定时器(并取消原先启动的定 时器)
STATUS wdDelete ( wdId )
信号编号
31个信号编号,从1-31
– – – – –
– – – – – – – – – –
#define #define #define #define ught) */ #define / #define future */ #define #define #define #define #define
sysClkRateSet()通常在系统启动时进行设置( VxSim方式下可以随时设置)
看门狗定时器
系统时钟的一个用户接口 能够使C程序在一个给定延时后开始执行 一旦延时超时,指定的程序开始执行 作为系统ISR的一部分,要遵守ISR的编程要求
创建看门狗定时器
创建一个看门狗定时器
– WDOG_ID wdCreate () – 返回wotchdog id或NULL或ERROR
启动(或重启)一个看门狗定时器
STATUS wdStart (wdId, delay, pRoutine, parameter ) wdId 由wdCreate返回的watchdog Id delay 要延时的ticks pRoutine 当延时超时时,要调用的程序 parameter 传递给程序的参数
信号量
– ISR释放信号量,任务等待接收信号量
消息队列
– ISR发送消息,任务等待接收消息,如果消息队列满 ,该消息被丢弃
管道
– ISR向管道写消息,任务读消息
信号
– ISR可以向任务发送signal。
调试中断
中断处理程序可以调用logMsg()向系统输出诊 断信息