Capl事件和事件程序


前言

CAPL程序是围绕事件过程组织的,每个事件过程都与单个事件相关联,每当发生预定义的CAPL事件时,将执行相应的事件过程。


CAPL事件程序的功能分类如下:

  • 消息事件.
  • 计时器事件.
  • 键盘事件.
  • 错误帧事件.
  • 可以控制器事件.
  • 系统(工具)的事件.
  • 环境变量事件(仅限CANoe).

 下图显示了可识别的CAPL事件列表和将被执行的相应过程。

事件过程要求

每当定义一个新的事件过程时,通常会实现附加的CAPL代码来执行任务。如果没有实现事件过程,则定义事件是没有用的,因为事件将在没有流程可执行的情况下触发。有些事件过程需要特定的参数来定义事件。

例如,每当按键被按下时,键盘输入事件就会触发——需要为事件过程专门定义所需的按键。如果未为该键定义键盘输入事件,则按下该键时不会发生任何事情。

使用关键字“this”的一些事件

 this关键字由于CAPL提供了事件驱动的程序设计,因此使用this关键字来引用触发事件的对象。这个关键字用于引用来自对象或对象值本身的数据,例如对应事件过程中的消息或环境变量(仅CANoe)。

本关键字在CAN Controller事件中使用的唯一时间是访问发送和接收的错误计数。虽然这个关键字可能在概念上难以理解,但它的使用很简单。把它想象成一个指向对象的指针。例如,设置一个事件过程,当收到ID为十进制555的CAN消息时执行。然后使用this指针访问消息的选择器或数据字节。

唯一可以使用此关键字的事件过程是

on message, on envVar, on key, on errorframe(只为获取can通道号)

和四个can控制器事件:

on busOff, on errorPassive, on errorActive和on warningLimit。

 因为这个关键字可以在许多事件中使用,所以它在每个事件中引用的内容都是不同的,包括相同类型的事件(例如两个关键事件)。

因为一旦事件执行完毕,This关键字就初始化为null。如果另一个事件使用了this关键字,它将有一个新的引用。您不必每次使用关键字时都引用和释放。它自动引用使用关键字的事件,并在事件完成后释放。

注意:对this关键字引用内容所做的任何更改仅在该事件过程中有效。换句话说,您只能使用它引用的内容,但不能给它赋新值。

 

*符号

在CAPL中,*符号是一个通配符,可用于替换on键和on消息事件过程的key参数。如果对两个或多个键执行相同的操作,则使用此符号,因为它表示所有按键。所有具有类似任务的传入消息也可以使用这个符号。

以下是使用*符号的例子:

on key*     //for all key
{
            // print the key that was pressed
    write(“The key you have pressed is %c”, this);

}

事件优先级

事件在执行方面没有任何优先级。只要条件合适,它们就会执行,不会在执行过程中停止。

换句话说,事件不能嵌套。一次只能处理一种类型的事件。如果需要在事件过程中调用函数,则该函数将在事件过程继续之前首先执行。

如果事件正在执行,并且在执行过程中紧急停止,则使用stop()函数。调用stop()函数将终止CANalyzer或CANoe中的测量。

如果CANoe以模拟模式运行(不与物理总线接口),那么可以使用halt()函数暂停所有进程。要继续,请按键盘上的“F9”键或单击“start”。

注意:halt()函数只会在模拟模式下执行。当您可以实时访问物理CAN总线时,它将不会执行。

因为*符号可以在Keyboard和Message事件过程中用作通配符,所以要执行的事件有一个优先级级别。并非所有键或传入消息通常都执行相同的任务。如果除一个键外的所有键都执行相同的任务,那么必须定义两个键事件过程。

下面是一个例子:

on key *         // for all keys other than ‘a’
{
                 // print the key that was pressed
write(“The key you have pressed is %c”, this);
}
on key ‘a’       // for the lowercase ‘a’ key only
{
                 // print the ‘a’ key
write(“The ‘a’ key is pressed”);
}
on key * // respond to all keys
{
switch (this) // “this” holds the value of the key pressed
{
case ‘a’:
case ‘b’:
write(“a or b was pressed.”);
break;
default:
write(“You have pressed the %c key.”, this);
break;
}
}

 按下'a'键将只执行on键'a'事件过程,因为该事件过程更特定于Keyboard事件。其他每个键将执行第一个事件过程。

优先级对message也不例外。下面是一个例子:

on message *                    // for all messages
{
// print
write(“The message received is %c”, this.id);
}
on message CAN1.*               // for all messages received on CAN channel 1
{ 
// print
write(“The message received on CAN channel 1 is %c”, this.id);
}
on message 0x100                // for messages with ID equal to 100 in hex only
{
// print
write(“The message with ID 0x100 is received.”);
}
on message CAN2.0x100       // for messages with ID equal to 0x100 from CAN channel 2
{
// print
write(“The message with ID 0x100 is received from CAN channel 2.”);
}

在优先级方面,消息事件定义比键盘事件更复杂。随着CAN通道特定的消息事件的增加,有两个规则CAPL来决定执行哪个事件过程:一个指定的CAN通道优先于没有一个CAN通道。第二个指定的消息ID号优先于*符号通配符。

遵循上面例子中的两条规则,如果在CAN通道1上接收到消息Ox100,它将打印,“ID为Ox100的消息已收到”。如果该消息是在CAN通道2上接收到的,它将打印,“ID为Ox100的消息是从CAN通道2接收到的”。


  • 4
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值