2016-08-22 14 views
1

我已通过使用mbed-cli工具拉下了mbed-os的新副本。如何使用mbed-os中的可用库?

$ mbed new mbed-os-test 
[mbed] Creating new program "mbed-os-test" (git) 
[mbed] Adding library "mbed-os" from "https://github.com/ARMmbed/mbed-os" at latest revision in the current branch 
[mbed] Updating reference "mbed-os" -> "https://github.com/ARMmbed/mbed-os/#dda7f7d77abd4330b05e686ce3bbe58230eb7876" 

最终我的工作我的恩智浦FRDM-K64F设备上启用uVisor,但现在我只使用了QuickStart教程得到一个简单的例子,而不启用uVisor工作。

所以,在上面的链接的建议,我做一个source目录mbed-OS的新创建的克隆:

$ mkdir mbed-os-test/mbed-os/source 

我的基本main.cpp复制和编译。有用。但是,当我尝试使用一些库例程创建问题时,特别是EthernetInterface。我会见了编译

mbed compile -m K64F -t GCC_ARM

#include "mbed.h" 
#include "EthernetInterface.h" 

int main() { 
    EthernetInterface eth; 
    eth.init(); //Use DHCP 
    eth.connect(); 
    printf("IP Address is %s\n", eth.getIPAddress()); 

    TCPSocketConnection sock; 
    sock.connect("mbed.org", 80); 

    char http_cmd[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\n\n"; 
    sock.send_all(http_cmd, sizeof(http_cmd)-1); 

    char buffer[300]; 
    int ret; 
    while (true) { 
     ret = sock.receive(buffer, sizeof(buffer)-1); 
     if (ret <= 0) 
      break; 
     buffer[ret] = '\0'; 
     printf("Received %d chars from server:\n%s\n", ret, buffer); 
    } 

    sock.close(); 

    eth.disconnect(); 

    while(1) {} 
} 

与编译:

从uVisor例如具有更复杂的一个(使用EthernetInterface)从上面的链接更换我的简单main.cpp错误指出EthernetInterface类没有我试图调用的成员。

../../mbed-os/source/main.cpp: In function 'int main()': 
../../mbed-os/source/main.cpp:34:9: error: 'class EthernetInterface' has no member named 'init' 
    eth.init(); //Use DHCP 
     ^
../../mbed-os/source/main.cpp:36:38: error: 'class EthernetInterface' has no member named 'getIPAddress' 
    printf("IP Address is %s\n", eth.getIPAddress()); 
            ^
../../mbed-os/source/main.cpp:38:5: error: 'TCPSocketConnection' was not declared in this scope 
    TCPSocketConnection sock; 
    ^
../../mbed-os/source/main.cpp:39:5: error: 'sock' was not declared in this scope 
    sock.connect("mbed.org", 80); 
    ^

当,当然,EthernetInterface类确实有这样的成员。我认为这个问题与mbed工具没有针对正确的源代码编译有关,因为它似乎找到了头文件。如果我将一个--source=选项添加到mbed编译中,我遇到了有关EthernetInterface.cpp包含的其他错误。

mbed compile -m K64F -t GCC_ARM --source=../libraries/net/eth/EthernetInterface/

[ERROR] In file included from ../libraries/net/eth/EthernetInterface/EthernetInterface.cpp:19:0: 
../libraries/net/eth/EthernetInterface/EthernetInterface.h:27:18: fatal error: rtos.h: No such file or directory 

这些文件肯定包含有mbed-OS,我只是不知道如何真正使用他们。

$ find . -name EthernetInterface.cpp 
./libraries/net/eth/EthernetInterface/EthernetInterface.cpp 
./features/net/FEATURE_IPV4/lwip-interface/EthernetInterface.cpp 

TL;博士 - 我们怎么能反对libraries/给出的库代码链接?我可以通过直接包含文件直接包含头文件,但相应的源似乎位于features/目录中,而不是libraries/中的那个。

+1

这个问题说mbed操作系统,但你链接的文档是mbed经典,这是不一样的事情。 [我在这里没有看到任何'init()'成员](https://docs.mbed.com/docs/mbed-os-api/en/mbed-os-5.1.0/api/features_2net_2FEATURE__IPV4_2lwip-interface_2EthernetInterface_8h_source。 HTML)(也不在超类)。 – Notlikethat

+0

@Notlikethat,有什么区别?在我最后的问题末尾的'find'命令中,有两个结果:'libraries'中的第一个是与[文档]相对应的源文件(https://developer.mbed.org/handbook/Ethernet-Interface ),而'features'中的后者与您在评论中链接的源相同。如果我在源文件中包含“EthernetInterface.h”,它似乎包含后者而不是前者(它具有更多的特性,如'init'等)。 – sherrellbc

+1

_“本文档涵盖了可用于mbed 2的网络库。对于mbed 5,网络库已进行了修订,以更好地支持更多的网络堆栈和线程安全[此处](https://docs.mbed.com/docs/mbed -os-api-reference/en/5.1/APIs/communication/network_sockets /)。“__ - 据我所知,mbed Classic(版本2)基本上只是一套HAL库,而mbed OS(版本5)是一个完整的以连接为中心的RTOS,两者之间存在重要的源级不兼容问题。尽管如此,我不能说我实际上曾经使用过自己。 – Notlikethat

回答

2

我想知道你在做什么我失踪,因为这个工作对我来说:

$ mbed new ethernet-test 
$ cd ethernet-test 
$ mbed target K64F 
$ mbed toolchain GCC_ARM 

打开ethernet-test/main.cpp和投入:

#include "mbed.h" 
#include "EthernetInterface.h" 

int main(int, char**) { 
    EthernetInterface eth; 
    eth.connect(); 
} 

然后:

$ mbed compile 
... 
Total Flash memory (text + data + misc): 108092 bytes 
Image: ./.build/K64F/GCC_ARM/ethernet-test.bin 
+0

的确如此,但是,正如我发现的那样,EthernetInterface实现具有更多的功能(如静态分配而不是使用DHCP),可以在这里找到(https://developer.mbed.org/handbook/Ethernet-Interface),还没有成为mbed5([来源](https://developer.mbed.org/questions/73258/How-does-mbed-cli-create-includes-and-li/))。虽然这两个实现都包含在mbed repo中,但实际上只编译了一个[this](https://docs.mbed.com/docs/mbed-os-api-reference/en/5.1/APIs/communication/network_sockets/)并与之相关联。 – sherrellbc

+0

虽然有趣的是,我在上面提到的API([此处显示](https://docs.mbed.com/docs/mbed-os-api-reference/en/5.1/APIs/communication/ethernet/))没有实际上工作。如果您查看'features'目录中的源文件(参见OP,'libraries'具有完整的实现,'features'似乎有一个子集),它只有'Public Member Functions'的代码,而不是'静态Public Member Functions“。尝试使用状态成员函数之一 - .e.g EthernetInterface.init()或类似的;这是行不通的。 – sherrellbc

相关问题