QPC 状态机笔记随记

事件

 static QEvt const *tableQueueSto[N_PHILO];

 本事件精妙之处在于使用地址而不是实际的事件,通过指向地址,事件可以任意扩展。

订阅

static QSubscrList subscrSto[MAX_PUB_SIG];

订阅的好处不用在驱动中写发送消息,在订阅任务中不需要写发送任务,可以减少程序之间的耦合。

MAX_PUB_SIG 是最大消息数目。

软件定时器

QTicker_ctor(&l_ticker0, 0U); /* ticker AO for tick rate 0 */

软件定时器初始化。

//   启动软件定时器任务

QACTIVE_START(the_Ticker0, (uint_fast8_t)(N_PHILO + 1),

                  0, 0, 0, 0, 0);

 

在QPC中增加了 任务实现实现软件定时器,代码看起来稍微冗杂了一点,实际是在定时中断中 发送了一个基准消息给指定的任务,任务再去处理,而不是原来必须在中断中处理,这样做可以让中断只作为响应而不作为处理。

另外一个一直在中断中处理,定时器消息可以选择有无缓冲区,一个缓冲区还是多个缓冲区。

意思只要定义了事件队列就定义了至少一个元素,不要去修改别人的代码,看不懂证明还没有理解到。

 

尤其是嵌套部分比较复杂,程序执行很多层状态机,然后再出去。

 

QPC 状态机笔记随记_第1张图片

事件队列,这个比较特别,额外增加了一些参数,frontEvt 可以快速的读取发送过来的事件,ringbuff是通用的环形缓冲队列。

 

 

你可能感兴趣的:(随记,QPC)