微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > 射频无线通信设计 > 关于ZMacScanReq( ZMacScanReq_t *pData )的定义

关于ZMacScanReq( ZMacScanReq_t *pData )的定义

时间:10-02 整理:3721RD 点击:
问一个比较小白的问题,在这个函数里面, ZMacScanReq( ZMacScanReq_t *pData )的定义方式是什么意思?括号里是什么意思?ZMacScanReq_t *pData是怎么赋值的?在调用之前是不是要先赋值?不是很能理解这个调用的问题, 麻烦教一下吧。如果可以的话解释下这个函数吧。

ROOT uint8 ZMacScanReq( ZMacScanReq_t *pData )
{
_ScanChannels = pData->ScanChannels; //读取pData中ScanChannels赋值给 _ScanChannels

/* scan in progress */
if (ZMac_ScanBuf != NULL) //扫描缓存区不为空
{
//#define MAC_SCAN_IN_PROGRESS 0xFC 表示扫描请求失败,因为已经在扫描
return MAC_SCAN_IN_PROGRESS; }

if (pData->ScanType != ZMAC_ORPHAN_SCAN) //扫描类型不为为孤点扫描
{
/* Allocate memory depends on the scan type 根据扫描类型分配内存*/
if (pData->ScanType == ZMAC_ED_SCAN) //能量扫描
{
if ((ZMac_ScanBuf = osal_mem_alloc(ZMAC_ED_SCAN_MAXCHANNELS)) == NULL)
{
return MAC_NO_RESOURCES; //操作失败,没有内存资源
}
//设置内存情况,地址指针,字节长,长度
osal_memset(ZMac_ScanBuf, 0, ZMAC_ED_SCAN_MAXCHANNELS);
//赋值给 ED结果
pData->Result.pEnergyDetect = ((uint8*)ZMac_ScanBuf) + MAC_CHAN_11;
}
else if (pData->MaxResults > 0)
{
if ((ZMac_ScanBuf = pData->Result.pPanDescriptor =
osal_mem_alloc( sizeof( ZMacPanDesc_t ) * pData->MaxResults )) == NULL)
{
return MAC_NO_RESOURCES; //无内存资源
}
}
}

/* Right now, set security to zero */
pData->Sec.SecurityLevel = false; //安全参数

/* Channel Page */
pData->ChannelPage = 0x00; //设置信道页

MAC_MlmeScanReq ((macMlmeScanReq_t *)pData);

return ZMacSuccess;
}

这个算不算是数组类型的定义?如何赋值?
typedef struct
{
uint32 ScanChannels;
uint8 ScanType;
uint8 ScanDuration;
uint8 ChannelPage;
uint8 MaxResults;
ZMacSec_t Sec;
union
{
uint8 *pEnergyDetect;
ZMacPanDesc_t *pPanDescriptor;
}Result;
} ZMacScanReq_t;

ZMacScanReq_t 是一个共用体。c语言的关键字。调用ZMacScanReq时,需要传递一个参数。这个参数,之前要用ZMacScanReq_t 定义一下。就好像定义一个int型变量一样。可能要定义共用体内部的一些东西。思路是一样的。只是看着复杂点。 在调用函数前,可能需要给共用体的一些内容赋值,比如ScanChannels。函数会进行一些处理。 总而言之,这个共用体是一个参数,和那些int型变量作为参数的函数是一个性质的。

ZMacScanReq_t这个的赋值跟普通数组赋值类似吗?像_ScanChannels = pData->ScanChannels,在执行这个指令之前就已经对ZMacScanReq_t的ScanChannels进行了赋值的意思吗?还有这个函数MAC_MlmeScanReq ((macMlmeScanReq_t *)pData),我在协议栈里面找不到它的原型定义,是直接使用的,这个原因是什么呢?谢谢你的解答。

在执行ZMacScanReq_t函数之前,你应该对ScanChannels赋值,不赋值,也没有语法错误,但是调用一个没赋值的东西,得到的结果没有实际意义,明白吧。你要明白共用体里面内容的含义。不是死抠语法。MAC_MlmeScanReq 怎么都搜索不到,应该是被封装了。看不到源码。

谢谢你的回复,很有帮助。麻烦你了

不用客气,明白了就好,有问题,多多交流。有经验,多多分享。一起学习,一起进步。

我在编译Zstack-1.4.3的SampleApp的时候,老是出现这个错误,我修改过Stack/Heap选项,也修改过F8wCC2430.xcl这个文件,但是还是不能解决,请问一下这个是什么原因呢?要怎么解决?谢谢。

Error[e16]: Segment XDATA_Z (size: 0x15f0 align: 0) is too long for segment definition. At least 0xb9c more bytes needed. The problem occurred while processing
the segment placement command "-Z(XDATA)XDATA_N,XDATA_Z,XDATA_I=_XDATA_START-_XDATA_END", where at the moment of placement the available
memory ranges were "XDATA:f300-fd53"

此处,XDATA的范围是f300-fd53 fd53 - f300 = a53. 小于0x15f0 ,超过了定义的范围,溢出了,明白了吗

那应该修改哪里的设置啊?不是很会,试过几种改法,都不行。

XDATA 如果定义的范围可以改大,就改大, 不能的话,就把调用XDATA的地方,范围改小呗。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top