2016-08-22 4 views
1

Я снял новую копию mbed-os, используя инструмент mbed-cli.Как использовать доступные библиотеки из 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" 

В конечном счете я работаю, чтобы позволить uVisor на устройстве NXP FRDM-K64F, но сейчас я только с помощью QuickStart учебник, чтобы получить простой пример работает без включения uVisor.

Так, как это было предложено в ссылке выше, я делаю source каталог вновь созданный клон mbed-Os:

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

Я скопировать в основной main.cpp и компилировать. Оно работает. Однако, когда я пытаюсь создать проблему, используя некоторые из подпрограмм библиотеки, в частности, EthernetInterface.

Замена мой простой main.cpp из примера uVisor с более сложным (с использованием EthernetInterface) из приведенной выше ссылке:

#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) {} 
} 

Compiling с:

mbed compile -m K64F -t GCC_ARM

Я встретился с компиляцией ошибки, указывающие, что класс 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-зева, я просто не знаю, как на самом деле использование их.

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

Т.Л., др - Как мы можем связать с кодом библиотеки данного в libraries/? Я могу напрямую включать заголовочные файлы напрямую, включая файл, но соответствующий источник, по-видимому, находится в каталоге features/, а не в libraries/.

+1

Вопрос касается mbed OS, но документация, которую вы связали, относится к mbed Classic, что не то же самое. [Я не вижу здесь элемента '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' в конце вопроса есть два результата: первый в' library' является источником, соответствующим документации [здесь] (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/API/связь/network_sockets /).__ - как я понимаю, mbed Classic (версия 2) - это всего лишь набор библиотек HAL, тогда как mbed OS (версия 5) полнофункциональная ОСРВ, ориентированная на взаимодействие, и между ними существует значительная несовместимость исходного уровня. Не могу сказать, что я когда-либо использовал меня сам. – 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-репо, только [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', а не ' Static Public Member Functions' из этой ссылки. Попробуйте использовать одну из функций статуса - .e.g EthernetInterface.init() или аналогичную; это не работает. – sherrellbc