北邮研究生嵌入式系统实验课程——第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并给出以秒为单位的定时器周期,就可以建立一个定时器。
- 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()向系统输出诊 断信息