Delphi 的内存操作函数(3): 给结构体指针分配内存
2010-12-15 14:05
841 查看
参考自:http://blog.21ic.com/user1/1600/archives/2009/58767.html
美国密西西比州立大学的Robert Reese教授出于教学、科研目的开发出一套精简版(subset)ZigBee协议栈。
APS的状态:
typedef enum _APS_STATE_ENUM
{
APS_STATE_IDLE,
APS_STATE_COMMAND_START,
APS_STATE_GENERIC_TX_WAIT,
APS_STATE_NWK_PASSTHRU_WAIT,
APS_STATE_INDIRECT_GETDST,
APS_STATE_INDIRECT_TX,
#ifdef LRWPAN_COORDINATOR
APS_STATE_INJECT_INDIRECT,
#endif
APS_STATE_ACK_SEND_START,
APS_STATE_INDIRECT_TX_WAIT,
APS_STATE_INJECT_LOOPBACK,
APS_STATE_INDIRECT_LOOPBACK
} APS_STATE_ENUM;
从程序可以看出,除了APS_STATE_IDLE其余都是busy状态。
APL层的服务调用【对外功能函数】:
这里的函数(或者宏)都要先循环调用apsBusy()检查aps是否为idle状态,如果不是就调用apsFSM。直到aps为idle状态才进行数据业务填充,并调用apsDoService处理
#define apsDoService() \
a_aps_service.status = LRWPAN_STATUS_APS_INPROGRESS;\
apsState = APS_STATE_COMMAND_START;\
apsFSM();
APL层的访问及设置调用【对内功能函数】:
对于APS(应用支持子层)这一层来说,apsFSM函数是整个的主角,在asp.c文件中定义的函数几乎都为这个函数所调用。协议栈的每一层都有自己的有限状态机(FSM)以追踪要进行的操作
如果节点作为协调器(coordinator),那么需要定义LRWPAN_COORDINATOR;而如果节点作为路由器(router)则需要定义LRWPAN_ROUTER;如果两者都没有定义,将作为RFD节点。协调器节点形成网络,然后进入一个无限循环并调用apsFSM()运行协议栈。调用aplFormNetwork()服务后调用函数aplGetStatus(),如果返回了LRWPAN_SUCCESS则表示服务调用成功。路由器节点通过调用aplJoinNetwork()运行协议栈。
协议栈使用以下APL访问函数接收数据包。
aplGetRxDstEp()返回目的端点
aplGetRxCluster()返回簇号
aplGetRxSrcEp()返回源端点
aplGetRxSADDR()返回源端点的短地址
aplGetRxMsgLen()返回消息长度
aplGetRxMsgData()返回消息数据的指针
aplGetRxRSSI()返回收到消息的信号强度
而后用户回调函数usrRxPacketCallback()将被调用。这个函数将使用用户数据结构保存数据,设置已收到数据的标志位。此函数结束后消息数据的指针将会被释放,所以在函数结束之前要将数据保存以防止下一个包将数据覆盖掉。本文出自 “bluefish” 博客,请务必保留此出处http://bluefish.blog.51cto.com/214870/163424
美国密西西比州立大学的Robert Reese教授出于教学、科研目的开发出一套精简版(subset)ZigBee协议栈。
APS的状态:
typedef enum _APS_STATE_ENUM
{
APS_STATE_IDLE,
APS_STATE_COMMAND_START,
APS_STATE_GENERIC_TX_WAIT,
APS_STATE_NWK_PASSTHRU_WAIT,
APS_STATE_INDIRECT_GETDST,
APS_STATE_INDIRECT_TX,
#ifdef LRWPAN_COORDINATOR
APS_STATE_INJECT_INDIRECT,
#endif
APS_STATE_ACK_SEND_START,
APS_STATE_INDIRECT_TX_WAIT,
APS_STATE_INJECT_LOOPBACK,
APS_STATE_INDIRECT_LOOPBACK
} APS_STATE_ENUM;
从程序可以看出,除了APS_STATE_IDLE其余都是busy状态。
APL层的服务调用【对外功能函数】:
函数 | 功能 |
aplSendMSG | 发送消息 |
aplSendEndDeviceAnnounce (saddr) | 发送终端设备宣告 |
aplSendNodeInfo (saddr) | 发送节点信息 |
aplSendAlarm (saddr,mde) | 发送警告 |
aplPingParent () | 查询父节点连接状态 |
aplPingNode (saddr) | 查询某个节点的连接状态 |
aplFormNetwork() | 协调器形成网络 |
aplJoinNetwork() | 尝试接入网络 |
aplRejoinNetwork() | 尝试再次接入网络 |
#define apsDoService() \
a_aps_service.status = LRWPAN_STATUS_APS_INPROGRESS;\
apsState = APS_STATE_COMMAND_START;\
apsFSM();
APL层的访问及设置调用【对内功能函数】:
函数 | 功能 |
aplInit() | 初始化协议栈 |
aplShutdown | 关闭协议栈 |
aplWarmstart | 唤醒协议栈 |
apsGenTSN() | 产生事务对列号 |
aplGetMyShortAddress() | 获取节点的短地址 |
aplGetParentLongAddress() | 获取父节点的长地址 |
aplGetParentShortAddress() | 获取父节点的短地址 |
aplSetMacMaxFrameRetries(x) | 设置MAC层帧重传的最大次数 |
aplSetApsMaxFrameRetries(x) | 设置APS层帧重传的最大次数 |
aplIsUsrBufferFree() | 最后一个消息是否被拷贝 |
aplMacTicksToUs | 转MAC滴答为微秒 |
如果节点作为协调器(coordinator),那么需要定义LRWPAN_COORDINATOR;而如果节点作为路由器(router)则需要定义LRWPAN_ROUTER;如果两者都没有定义,将作为RFD节点。协调器节点形成网络,然后进入一个无限循环并调用apsFSM()运行协议栈。调用aplFormNetwork()服务后调用函数aplGetStatus(),如果返回了LRWPAN_SUCCESS则表示服务调用成功。路由器节点通过调用aplJoinNetwork()运行协议栈。
协议栈使用以下APL访问函数接收数据包。
aplGetRxDstEp()返回目的端点
aplGetRxCluster()返回簇号
aplGetRxSrcEp()返回源端点
aplGetRxSADDR()返回源端点的短地址
aplGetRxMsgLen()返回消息长度
aplGetRxMsgData()返回消息数据的指针
aplGetRxRSSI()返回收到消息的信号强度
而后用户回调函数usrRxPacketCallback()将被调用。这个函数将使用用户数据结构保存数据,设置已收到数据的标志位。此函数结束后消息数据的指针将会被释放,所以在函数结束之前要将数据保存以防止下一个包将数据覆盖掉。本文出自 “bluefish” 博客,请务必保留此出处http://bluefish.blog.51cto.com/214870/163424
相关文章推荐
- Delphi 的内存操作函数(3): 给结构体指针分配内存
- Delphi 的内存操作函数(3): 给结构体指针分配内存
- Delphi 的内存操作函数(3): 给结构体指针分配内存
- Delphi 的内存操作函数(2): 给数组指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 的内存操作函数(1): 给字符指针分配内存( 给字符指针(PChar、PWideChar、PAnsiChar)分配内存最佳的选择是StrAlloc。分配内存的时候会对字符串进行初始化)
- Delphi 的内存操作函数(1): 给字符指针分配内存
- Delphi 给结构体指针分配内存,用new(p),释放用dispose(p)
- 终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good
- [Delphi]内存分配和释放 内存操作函数(4): 清空与填充内存
- 指针数组与数组指针 指针函数与函数指针,内存动态分配
- 内存、指针操作函数
- delphi.memory.分配及释放---New/Dispose, GetMem/FreeMem及其它函数的区别与相同,内存分配函数
- 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明
- 程序猿之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程可以分配的内存大小)
- C和指针之动态内存分配之(编写calloc函数,函数内部使用malloc函数来获取内存)