如下表所示,定义的就是系统和应用程序直接的接口消息,以及消息的方向和运行环境,所有系统预定义消息都在头文件中:fw-stm32l1-wbed-usr/wnet/wipc.h
消息名称 | 方向 | 运行环境 | 描述 |
---|---|---|---|
WIPC_MSG_PON_INIT | sys –> usr | task | 系统上电消息 |
WIPC_MSG_SYS_INIT | sys –> usr | task | 系统初始消息 |
WIPC_MSG_SYS_EXIT | usr –> sys | task | 系统退出消息 |
WIPC_MSG_SYS_RST | usr –> sys | task | 系统复位请求 |
WIPC_MSG_LPM_REQ | sys –> usr | task | 请求进入睡眠,只有所以模块同意才能进入睡眠 |
WIPC_MSG_LPM_INIT | sys –> usr | task | 进入睡眠前,所有模块各自完成睡眠设置 |
WIPC_MSG_LPM_EXIT | sys –> usr | task | 退出睡眠后,所有模块各自完成恢复设置 |
WIPC_MSG_LPM_HALT | usr –> sys | task | 停止进入睡眠 |
WIPC_MSG_LPM_CONT | usr –> sys | task | 恢复进入睡眠 |
WIPC_MSG_NET_CONN | sys –> usr | task | 网络连接通知 |
WIPC_MSG_NET_DISC | sys –> usr | task | 网络断开通知 |
WIPC_MSG_NET_RST | usr –> sys | task | 重新连接网络 |
WIPC_MSG_TMR_INIT | usr–> sys | task | 设置定时器 |
WIPC_MSG_TMR_HALT | usr–> sys | task | 取消定时器 |
WIPC_MSG_TMR_TICK | sys –> usr | task | 定时器溢出 |
WIPC_MSG_QRY_TICK | usr–> sys | task | 查询硬件计数,可用于计算经过时间差 |
WIPC_MSG_SYS_TICK | sys –> usr | task | 系统时钟节拍,只有禁止睡眠时才会保持 |
WIPC_MSG_CKS_TICK | sys –> usr | task | 系统监控节拍,持续保持,周期是32秒 |
WIPC_MSG_NTS_INIT | sys –> usr | task | 节点时隙开始 |
WIPC_MSG_NTS_DONE | sys –> usr | task | 节点时隙结束 |
WIPC_MSG_BTS_INIT | sys –> usr | task | 广播时隙开始 |
WIPC_MSG_BTS_DONE | sys –> usr | task | 广播时隙结束 |
WIPC_MSG_USR_DATA | sys <->usr | task | 收发用户数据 |
WIPC_MSG_QRY_STAT | usr –> sys | task | 查询系统状态 |
WIPC_MSG_QUE_FIND | usr –> sys | both | 查询消息队列 |
WIPC_MSG_IRQ_VTOR | sys –> usr | IRQ | 中断向量处理入口 |
WIPC_MSG_IRQ_DIS | usr –> sys | task | 进入临界区 |
WIPC_MSG_IRQ_ENA | usr –> sys | task | 退出临界区 |
WIPC_MSG_FSH_SAVE | usr –> sys | task | 保存flash数据 |
WIPC_MSG_FSH_LOAD | usr –> sys | task | 装载flash数据 |
WIPC_MSG_NVM_SAVE | usr –> sys | task | 保存NVM数据 |
WIPC_MSG_NVM_LOAD | usr –> sys | task | 装载NVM数据 |
WIPC_MSG_LOG_TEXT | usr –> sys | task | 调试输出信息 |
WIPC_MSG_SLP_USEC | usr –> sys | task | 微秒级别延时,毫秒级延时不能使用这种同步延时的方法, 避免系统阻塞 |
WIPC_MSG_CFG_SETF | usr –> sys | task | 设置配置项,它会重载系统配置,保存在NVM中 |
WIPC_MSG_CFG_RSTF | usr –> sys | task | 复位配置项 |
WIPC_MSG_CFG_LOAD | usr –> sys | task | 用默认值清除配置 |
WIPC_MSG_QRY_RTC | usr –> sys | task | 查询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发送到消息队列中,最终还会转发到用户程序中,例如中断服务器程序发送消息到用户状态机。利用消息通信的好处是,当消息队列非空时,系统是不会进入低功耗模式,防止消息被延迟处理。而如果仅仅只通过设置状态位进行通信,是无法达到这个效果的。