接口消息

如下表所示,定义的就是系统和应用程序直接的接口消息,以及消息的方向和运行环境,所有系统预定义消息都在头文件中:fw-stm32l1-wbed-usr/wnet/wipc.h

消息名称方向运行环境描述
WIPC_MSG_PON_INITsys –> usrtask系统上电消息
WIPC_MSG_SYS_INITsys –> usrtask系统初始消息
WIPC_MSG_SYS_EXITusr –> systask系统退出消息
WIPC_MSG_SYS_RSTusr –> systask系统复位请求
WIPC_MSG_LPM_REQsys –> usrtask请求进入睡眠,只有所以模块同意才能进入睡眠
WIPC_MSG_LPM_INITsys –> usrtask进入睡眠前,所有模块各自完成睡眠设置
WIPC_MSG_LPM_EXITsys –> usrtask退出睡眠后,所有模块各自完成恢复设置
WIPC_MSG_LPM_HALTusr –> systask停止进入睡眠
WIPC_MSG_LPM_CONTusr –> systask恢复进入睡眠
WIPC_MSG_NET_CONNsys –> usrtask网络连接通知
WIPC_MSG_NET_DISCsys –> usrtask网络断开通知
WIPC_MSG_NET_RSTusr –> systask重新连接网络
WIPC_MSG_TMR_INITusr–>
sys
task设置定时器
WIPC_MSG_TMR_HALTusr–>
sys
task取消定时器
WIPC_MSG_TMR_TICKsys –> usrtask定时器溢出
WIPC_MSG_QRY_TICKusr–>
sys
task查询硬件计数,可用于计算经过时间差
WIPC_MSG_SYS_TICKsys –> usrtask系统时钟节拍,只有禁止睡眠时才会保持
WIPC_MSG_CKS_TICKsys –> usrtask系统监控节拍,持续保持,周期是32秒
WIPC_MSG_NTS_INITsys –> usrtask节点时隙开始
WIPC_MSG_NTS_DONEsys –> usrtask节点时隙结束
WIPC_MSG_BTS_INITsys –> usrtask广播时隙开始
WIPC_MSG_BTS_DONEsys –> usrtask广播时隙结束
WIPC_MSG_USR_DATAsys <->usrtask收发用户数据
WIPC_MSG_QRY_STATusr –> systask查询系统状态
WIPC_MSG_QUE_FINDusr –> sysboth查询消息队列
WIPC_MSG_IRQ_VTORsys –> usrIRQ中断向量处理入口
WIPC_MSG_IRQ_DISusr –> systask进入临界区
WIPC_MSG_IRQ_ENAusr –> systask退出临界区
WIPC_MSG_FSH_SAVEusr –> systask保存flash数据
WIPC_MSG_FSH_LOADusr –> systask装载flash数据
WIPC_MSG_NVM_SAVEusr –> systask保存NVM数据
WIPC_MSG_NVM_LOADusr –> systask装载NVM数据
WIPC_MSG_LOG_TEXTusr –> systask调试输出信息
WIPC_MSG_SLP_USECusr –> systask微秒级别延时,毫秒级延时不能使用这种同步延时的方法, 避免系统阻塞
WIPC_MSG_CFG_SETFusr –> systask设置配置项,它会重载系统配置,保存在NVM中
WIPC_MSG_CFG_RSTFusr –> systask复位配置项
WIPC_MSG_CFG_LOADusr –> systask用默认值清除配置
WIPC_MSG_QRY_RTCusr –> systask查询RTC时钟

系统初始化

当网络侧允许启动用户程序时,会发送消息WIPC_MSG_SYS_INIT, 消息体包含网络的状态以及ctx的大小,这里ctx就是用户程序可以使用的内存空间,用户程序可以进行相应的初始化动作,包括ctx内容以及相应设备的初始化。

定时器使用

提供两类定时器,同步和异步定时器,同步主要相对节点无线分配的时隙,可以通过定时设置消息WIPC_MSG_TMR_INIT使用,当定时器溢出时会触发WIPC_MSG_TMR_TICK消息。

类型说明
同步定时器参数oft是相对节点无线分配的时隙,可以提前或滞后oft个时隙触发,它是周期性,一般应用场景是,提前n个时隙启动传感器转换,当收发时隙到了是就可以读取转换结果了
异步定时器设置和时隙无关的定时器,它是非周期性的,通常应用场景是,节点是睡眠模式,它也会周期触发,启动传感器进行监测。

低功耗处理

系统进入低功耗模前,会通过WIPC_MSG_LPM_REQ询问用户程序是否同意,用户程序可以根据自己的状态进行回复, 只有所有的模块都同意,才会进入低功耗模。在进入和退出低功耗模式都会通过WIPC_MSG_LPM_INIT和WIPC_MSG_LPM_EXIT通知,用户程序可以进行相应的设置。

另外一种方式时,用户程序可以通过WIPC_MSG_LPM_HALT暂停低功耗模, 这时系统会周期发送系统节拍消息WIPC_MSG_SYS_TICK, 用户程序可以在这个消息中检查操作是否完成,然后再通过消息WIPC_MSG_LPM_CONT恢复低功耗模, 目前例程中设备驱动程序框架使用的就是这种方式: fw-stm32l1-wbed-usr\drivers\drv.c, 当它启动一个设备操作时,它暂停低功耗模式,等待操作完成后,再恢复低功耗模式。

由于用户程序采用的事件驱动模型,当启动设备的一个操作时,是不能直接轮询等待操作完成的,因为这会给整个系统带来较大的延时,可以利用下面两个事件

消息说明
WIPC_MSG_LPM_REQ如果设备操作没有完成,就返回false,这样这个消息会持续产生,还可以利用查询系统时间WIPC_MSG_QRY_TICK,实现等待溢出操作
WIPC_MSG_SYS_TICK首先发送禁止低功耗WIPC_MSG_LPM_HALT,使得本消息以1ms间隔持续产生,检查设备操作操作是否完成。
如果完成,发送恢复低功耗WIPC_MSG_LPM_CONT,禁止这个消息产生。这是在设备驱动中采用的模型。

根据外部传感器的工作特点,对于外部传感器的定功耗处理

工作周期传感器支持定功耗低功耗处理
传感器需一直工作X关闭处理器侧的相应设备,传感器在工作模式
传感器需周期工作关闭处理器侧的相应设备,传感器低功耗模式
传感器需周期工作关闭处理器侧的相应设备,关闭传感器的电源

在功能扩展板上,传感器的电源是可以通过MOS管控制的,这样就可以实现低功耗的要求

延时的处理

用户程序中如果需要较长时间(大于1ms)的等待,可以参见前面低功耗处理方式,利用异步消息操作,实现延时溢出检查功能。而对于微秒级别的延时,利用发送消息WIPC_MSG_SLP_USEC实现同步微秒级别的延时。

中断的处理

用户程序在初始化时设置和使能中断,当中断发生时,系统以消息WIPC_MSG_IRQ_VTOR通知,这个消息时运行在中断上下文中, 为了提供系统响应时间,通常它只做一些简单的操作,如读出中断状态,然后通过扩展消息通知状态机,复杂耗时的操作都在状态机的任务中完成。

时隙的起止

节点收发时隙起止都会通过消息WIPC_MSG_NTS_INIT通知用户程序,这样用户程序可以在时隙开始时准备数据,数据能在本时隙得到及时发送。

数据的存储

目前提供两种类型的数据存储,特性如下表所示,用户程序可以根据自己的场景进行选择。

类型说明
flash掉电不丢失,有擦写寿命,操作消息WIPC_MSG_FSH_SAVE/LOAD
nvram复位不丢失,无限次读写,操作消息WIPC_MSG_NVM_SAVE/LOAD

配置的修改

系统的配置通常是有配置工具TinyCFG进行,存在在系统的flash的参数区中,但是某些场景中,有些配置需要进行动态修改,可以通过消息WIPC_MSG_CFG_SET/RST进行修改,这些修改保存在NVRAM中,复位不丢失,它会重载系统参数,例如睡眠节点可以暂时设置成在线节点。

自定义消息

上面列表是系统定义的消息,用户可以在这个基础上,自定义扩展消息,例如在文件fw-stm32l1-wbed-usr\inc\event.h, 当这些消息通过net_msg_send发送到消息队列中,最终还会转发到用户程序中,例如中断服务器程序发送消息到用户状态机。利用消息通信的好处是,当消息队列非空时,系统是不会进入低功耗模式,防止消息被延迟处理。而如果仅仅只通过设置状态位进行通信,是无法达到这个效果的。