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.

[参考译文] CC3135:如何将 simplelink 驱动程序移植到非 TI 平台?

Guru**** 2393725 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/976543/cc3135-how-to-port-simplelink-drivers-to-a-non-ti-platform

器件型号:CC3135

TI/drivers/net/wifi/slnetifwifi.h 文件包括 ti/net/slnetsock.h,该文件又调用我的 RTOS 不提供的 POSIX 信标 API。 移植指南 swru455m 未涵盖此内容。 我应该在这里做什么? 我只想打开 WiFi 并与服务器进行 TCP 连接。 我不需要在 net 目录中使用任何 http、MQTT 和 SNTP 库。 另外,为什么它不使用已经使用信标的 sl_SyncObj*宏?

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

    您好!

    如果您要编写可移植应用、尤其是当您的应用同时具有 Wi-Fi 和以太网时、SlNetIf 和 SlNetSock 库非常有用。 否则、不需要它们。 您可以直接使用主机驱动程序 SL_* API 调用,如 SWRU455所示。 例如、您可以从 network_terminal、配置和 power_measurement 示例中删除这些链接的库、而无需进行其他更改。

     sl_SyncObj*宏特定于我们器件的主机驱动程序,但其他库在其他 SimpleLink 器件中是通用的。 所有这些库都使用 POSIX、后者是 IEEE 标准 RTOS API 层、使希望使用这些预构建库的客户能够更轻松地移植 RTOS。 我们的插件为 TI-RTOS 和 FreeRTOS 提供此 API 层、但它可用于任何 RTOS。

    此致、

    Sarah

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

    我已经开始工作了、但速度不能超过40Kibps。 我怀疑它与我调用 sl_Task 的方式有关。 驱动程序设置为非 RTOS 模式。 我在启动时创建一个新的线程、该线程将继续调用 sl_Task 函数。 在主线程中、我调用其余的 sl_Start -> sl_Connect -> sl_Send 函数。 在我的 PC 上运行 TCP 服务器时、它可以获得的最大速度为40 KIPS。 如果我将其置于 AP 模式并卷曲内置的 HTTP 服务器、我可以得到大约250Kibps。 主机是 STM32 L476 Nucleo 板。 在2.5GHz 接入点上可以期望多高的速度?

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

    您好!

    CC3135数据表中列出的最大数据吞吐量 为16Mbps UDP 和13Mbps TCP、但前提是主机驱动程序层也处于最大吞吐量。 根据调用 sl_Task 的频率、这可能是瓶颈所在。

    为什么在一个线程中调用 sl_Task 而不是将 RTOS 直接与驱动程序一起使用? 调用 sl_Task 的线程的优先级是多少?

    此 E2E 帖子可能有助于解释我们如何在测试 中测量吞吐量:e2e.ti.com/.../733986

    此致、

    Sarah

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

    >为什么在线程中调用 sl_Task 而不是将 RTOS 直接与驱动程序一起使用

    驱动程序调用的是我的 RTOS 未提供的 POSIX API。 我现在进行了所需的更改、现在运行了驱动程序的 sl_platform_multi_threaded 版本、但性能仍然完全相同。

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

    >调用 sl_Task 的线程的优先级是多少

    设置为比主线程更高的优先级。 此外,除非我在 sl_Send()之后调用 yet()(或 printf),否则它会发送几个 KiB,然后停止。 也许 sl_Send()中有导致 sl_Task()启动的东西。

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

    您好!

    您能否分享您如何调用 sl_Send()? 您能否测试 network_terminal 示例并比较行为?

    此致、

    Sarah

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

    这是我使用的代码

    #include "mbed.h"
    #include "ti/drivers/net/wii/device.h"
    #include "ti/drivers/net/wii/sl_socket.h"
    #include "ti/net/slnetsock.h"
    
    
    void runSlTask()
    {
    sl_Task (nulptr);
    }
    
    int main()
    {
    螺纹螺纹;
    thread.set_priority(osPriorityHigh);
    thread.start (callback (runSlTask));
    
    DigitalOut LED (LED1);
    DigitalOut nReset (PC_8、false);
    ThisThread:sleep_for (500);
    nRESET =真;
    
    printf ("=================== \r\n");
    
    自动结果= sl_Start (nulptr、nulptr、nullptr);
    const auto sockid = sl_Socket (sl_AF_iNet、sl_sock_stream、0);
    
    constexpr SlTimever_t timeVal{20、0};
    
    Auto sockOptSetResult = sl_SetSockOpt (sockid、sl_SOL_socket、sl_SO_RCVTIMEO、&timeVal、sizeof (timeVal));
    if (sockOptSetResult!= 0){
    printf ("ERR\r\n");
    NVIC_SystemReset();
    }
    constexpr SlSockNonblocking_t enableOption{1};
    
    sockOptSetResult = sl_SetSockOpt (sockid、sl_SOL_socket、sl_SO_NONBLOCKING、(_u8 *)&enableOption、sizeof (enableOption));
    if (sockOptSetResult!= 0){
    printf ("ERR\r\n");
    NVIC_SystemReset();
    }
    
    SlSockAddrIn_t addr;
    Addr.Sin_Family = SL_AF_iNet;
    Addr.Sin_port = sl_Htons (8888);
    
    addr.sin addr.s_addr = sl_Htonl (sl_IPv4_VAL (192、168、42、130));
    
    结果= SLNETERR_BSD_EALREADY;
    
    constexpr auto POLL_interval = 2;
    constexpr auto MAX_POLL = 20000;
    constexpr auto MAX_POLL_connect = MAX_POLL;
    
    对于(int i = 0;i < MAX_POLL_CONNECT && RESULT = SLNETERR_BSD_EALREADY;i++){
    结果= sl_Connect (sockid、reinterpret_cast (addr)、sizeof (SlSockAddrIn_t));
    thisThread::yield ();
    如果(结果< 0){
    该主题::SLEEP_for (POLL_INTERVAL);
    }
    }
    
    如果(结果< 0){
    printf ("连接%d\n"失败、结果);
    NVIC_SystemReset();
    }
    
    constexpr auto buffer_size = 1 * 1024;
    静态 char buffer[buffer_size];
    std:::transform (std:开始(buffer)、std:结束(buffer)、std:开始(buffer)、
    [](char)-> char{return static_cast (标准:rand();});
    
    对于(int i = 0;i < 1024 * 1024;i++){
    结果= SLNETERR_BSD_EAGAIN;
    对于(int k = 0;k < MAX_POLL && RESULT = SLNETERR_BSD_EAGAIN;k++){
    {
    结果= sl_Send (sockid、buffer、sizeof (buffer)、0);
    }
    if (result!= sizeof (buffer)){
    该主题::SLEEP_for (POLL_INTERVAL);
    } 否则{
    LED =!LED;
    }
    }
    thisThread::yield ();
    
    如果(结果< 0){
    printf ("发送%d\n"失败、结果);
    NVIC_SystemReset();
    }
    }
    
    sl_close (sockid);
    sl_Stop (0xFFFF);
    }
    

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

    您好!

    您能否说明发送货摊时的行为? 您是否看到一些数据包已正确发送、然后不再发送? 还是单步执行代码并看到函数挂起?

    请确保您已刷写最新的服务攻击版本。

    此致、

    Sarah

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

    借助 DMA、我可以使其达到1.5Mibps。