关于ZMacScanReq( 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的地方,范围改小呗。