This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LAUNCHXL-CC3235SF:CC3235 SL_SOCK_RAW

Guru**** 2482105 points
Other Parts Discussed in Thread: LAUNCHXL-CC3235SF

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1325640/launchxl-cc3235sf-cc3235-sl_sock_raw

器件型号:LAUNCHXL-CC3235SF

您好!

我使用两个  LAUNCHXL-CC3235SF 以高比特率测试原始数据包。

修改网络终端示例以启动 send/recv (消息末尾的代码)

一侧发送步长为1ms 的数据包。  

 

如果我使用 radiotool recv 统计数据、我可以查看所有数据包。 例如、5秒矩形:

但是、如果我尝试取回所有数据、则结果非常糟糕

此外、我尝试了单线程(非 RTOS)项目。 结果好很多、但仍然不好

和另一个测试。 如果我发送1200字节而不是1536 (取消注释//size = 1200;在代码中)、则结果如下。 请注意"Max" RECT 周期

那么、问题是:是否有任何方法可以发送和接收具有高数据比特率的原始数据包? 我需要真正的低级、不需要任何软件包和超时

我的测试代码(在末尾的 main 函数 test())。 createSocket ()中的一些代码可能是无用的,但我尝试了不同的方式

extern "C" {
#include "network_terminal.h"
#ifdef SL_PLATFORM_MULTI_THREADED
#include "FreeRTOS.h"
#include "task.h"
#endif
#include "uart_term.h"
#include "inc/hw_nvic.h"
#include "inc/hw_types.h"
#include <ti/drivers/net/wifi/source/driver.h>
}

//////////////////////////////////////////////////////////// auxiliary functions begin

void onAssert(const char* exp) {
	UART_PRINT("\r\n!!!ASSERT:%s", exp);
	while (1) ;
}

#define _ASSERT_R(exp) if(!(exp)) onAssert(#exp);
#define CPU_CLOCK_MHZ (80)
#define TICK2US(tick) ((tick) / CPU_CLOCK_MHZ)

#ifndef SL_PLATFORM_MULTI_THREADED
typedef struct _ClockP_Control {
	uint64_t count;
	struct ClockP_Obj *list;
} ClockP_Control;
extern ClockP_Control ClockP_ctrl;
inline uint32_t xTaskGetTickCount() { return *(volatile uint32_t*)&ClockP_ctrl.count; }
#endif

inline uint32_t tickUs32() {
	for (uint32_t count = xTaskGetTickCount();;) {
		uint32_t tick = HWREG(NVIC_ST_CURRENT);
		uint32_t count2 = xTaskGetTickCount();
		if (count == count2)
			return count * (1000000 / _SYS_CLOCK_PERIOD_) - tick / CPU_CLOCK_MHZ;
		count = count2;
	}	
}	
//////////////////////////////////////////////////////////// auxiliary functions end

static _i16 rate = SL_SOCK_TX_RATE_24M;
static _u32 power = 1;
static _u32 preamble = 0;
static _u32 channel = 100;

int createSocket() {
	SlNetCfgIpV4Args_t ipAddr = {0};
	_ASSERT_R(!sl_NetCfgSet(SL_NETCFG_IPV4_STA_ADDR_MODE, SL_NETCFG_ADDR_STATIC, sizeof(SlNetCfgIpV4Args_t), (_u8*)&ipAddr));
	sl_NetAppStop(SL_NETAPP_HTTP_SERVER_ID | SL_NETAPP_DHCP_SERVER_ID | SL_NETAPP_MDNS_ID);
	_ASSERT_R(!sl_Stop(1000));
	_ASSERT_R(!sl_Start(NULL, NULL, NULL)) ;
	SlWlanRxFilterIdMask_t FilterIdMask {};
	_u16 len = sizeof(SlWlanRxFilterIdMask_t);
	_ASSERT_R(!sl_WlanSet(SL_WLAN_RX_FILTERS_ID, SL_WLAN_RX_FILTER_STATE, len, (_u8*)FilterIdMask));
	_ASSERT_R(!sl_WlanPolicySet(SL_WLAN_POLICY_CONNECTION, SL_WLAN_CONNECTION_POLICY(0, 0, 0, 0), NULL, 0));
	_ASSERT_R(!sl_WlanPolicySet(SL_WLAN_POLICY_PM, SL_WLAN_ALWAYS_ON_POLICY, NULL, 0));
	int s = sl_Socket(SL_AF_RF, SL_SOCK_RAW, 0);
	_ASSERT_R(s >= 0);	
	SlSockNonblocking_t BlockingOption { 1 };
	_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_SOCKET, SL_SO_NONBLOCKING, (_u8*)&BlockingOption, sizeof(BlockingOption)));
	_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_PHY_OPT, SL_SO_PHY_RATE, &rate, sizeof(rate)));
	_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_PHY_OPT, SL_SO_PHY_TX_POWER, &power, sizeof(power)));
	_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_PHY_OPT, SL_SO_PHY_PREAMBLE, &preamble, sizeof(preamble)));
	_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_SOCKET, SL_SO_CHANGE_CHANNEL, &channel, sizeof(channel)));
	_u32 timeout = 0;
	_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_PHY_OPT, SL_SO_PHY_TX_TIMEOUT, &timeout, sizeof(timeout))) ;
	_u32 acks = 0;
	_ASSERT_R(!sl_SetSockOpt(s, SL_SOL_PHY_OPT, SL_SO_PHY_ALLOW_ACKS, &acks, sizeof(acks))) ;
	UART_PRINT("\r\nRAW socket is configured on channel %d (rate:%d txpower:%d preamble:%d)", channel, rate, power, preamble);
	return s;
}

void makeHdr(_u8* buf)
{
#define FRAME_TYPE 0x88
#define FRAME_CONTROL 0x00
#define DURATION 0xc0,0x00
#define RECEIVE_ADDR 0x08, 0x00, 0x28, 0x5A, 0x72, 0x3C
#define TRANSMITTER_ADDR 0x08, 0x00, 0x28, 0x5a, 0x78, 0x1e
#define BSSID_ADDR 0x22, 0x44, 0x88, 0x11, 0x22, 0x33
#define FRAME_NUMBER 0x00, 0x00
#define QOS_CTRL 0x00, 0x00
	char FrameBaseData[] = {
		FRAME_TYPE, FRAME_CONTROL, DURATION, RECEIVE_ADDR, TRANSMITTER_ADDR, BSSID_ADDR, FRAME_NUMBER, QOS_CTRL
	};
	memcpy(buf, FrameBaseData, sizeof(FrameBaseData));
}

extern "C" void test(int bSend) {
	_u8 buf[1536 + 8] {};
	int s = createSocket();
	makeHdr(buf);
	int size = 1536;
	//size = 1200;
	for (uint32_t nIndex = 0, us = tickUs32(), sec = us, start = us, dt = 0, dtmax = 0, nextsend = us;; us = tickUs32()) {
		if (bSend) {
			while (tickUs32() < nextsend);			
			while (1) {
#ifndef SL_PLATFORM_MULTI_THREADED
				_SlNonOsHandleSpawnTask();
#endif
				if (sl_Send(s, buf, size, 0) == size)
					break;
			}
			nextsend += 1000;
		}
		else {
			while(sl_Recv(s, buf, sizeof(buf), 0) <= 0);
		}
		++nIndex;
		uint32_t now = tickUs32(), stepUs = now - us;
		dt += stepUs;
		if (dtmax < stepUs)
			dtmax = stepUs;
		if (now - sec < 1000000)
			continue;
		sec += 1000000;
		UART_PRINT("\r\n%u: %s %u packets avg:%uus max:%uus", (now - start) / 1000, bSend ? "SEND" : "RECV", nIndex, dt / nIndex, dtmax);
		nIndex = dt = dtmax = 0;
	}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    收发器模式未针对处理高吞吐量进行优化、因此毫无疑问它不能被视为可靠(即可能存在丢包)。

    根据您的实验、NWP 内部 RX 缓冲区似乎已满-因此数据包被驱动。 您可以 尝试简化 Rx 循环、以减少从 NWP RX 缓冲区提取数据包时的延迟(因为即使上下文开关也会影响性能)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢。 在一些测试后,如果我使用步骤1050我们都为 recv 和 send 侧,我没有损失(每秒950个包-全部收到)。 所以,这似乎是最好的结果,这是可以实现的。