| Creating Your First Mynewt Project |
| ---------------------------------- |
| |
| This page shows you how to create a Mynewt project using the ``newt`` |
| command-line tool. The project is a blinky application that toggles a |
| pin. The application uses the Mynewt's simulated hardware and runs as a |
| native application on Mac OS and Linux. |
| |
| **Note:** The Mynewt simulator is not yet supported on Windows. If you |
| are using the native install option (not the Docker option), you will |
| need to create the blinky application for a target board. We recommend |
| that you read the section on creating a new project and fetching the |
| source repository to understand the Mynewt repository structure, create |
| a new project, and fetch the source dependencies before proceeding to |
| one of the :ref:`blinky_tutorials`. |
| |
| This guide shows you how to: |
| |
| 1. Create a new project and fetch the source repository and |
| dependencies. |
| 2. Test the project packages. (Not supported on Windows.) |
| 3. Build and run the simulated blinky application. (Not supported on |
| Windows.) |
| |
| .. contents:: |
| :local: |
| :depth: 2 |
| |
| Prerequisites |
| ~~~~~~~~~~~~~ |
| |
| - Have Internet connectivity to fetch remote Mynewt components. |
| - Install the newt tool: |
| |
| - If you have taken the native install option, see the installation |
| instructions for :doc:`Mac OS <../../newt/install/newt_mac>`, |
| :doc:`Linux <../../newt/install/newt_linux>`, or |
| :doc:`Windows <../../newt/install/newt_windows>`. |
| - If you have taken the Docker option, you have already installed |
| Newt. |
| |
| - Install the :doc:`native toolchain <native_install/native_tools>` to compile and |
| build a Mynewt native application. |
| |
| Creating a New Project and Fetching the Source Repository |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| This section describes how to use the newt tool to create a new project |
| and fetch the core mynewt source repository. |
| |
| Creating a New Project |
| ^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| Choose a name for your project. We name the project ``myproj``. |
| |
| Run the ``newt new myproj`` command, from your **dev** directory, to |
| create a new project: |
| |
| **Note:** This tutorial assumes you created a **dev** directory under |
| your home directory. |
| |
| .. code-block:: console |
| |
| $ cd ~/dev |
| $ newt new myproj |
| Downloading project skeleton from apache/mynewt-blinky... |
| Installing skeleton in myproj... |
| Project myproj successfully created. |
| |
| The newt tool creates a project base directory name **myproj**. All newt |
| tool commands are run from the project base directory. The newt tool |
| populates this new project with a base skeleton of a new Apache Mynewt |
| project in the project base directory. It has the following structure: |
| |
| **Note**: If you do not have ``tree``, run ``brew install tree`` to |
| install on Mac OS, ``sudo apt-get install tree`` to install on Linux, |
| and ``pacman -Su tree`` from a MinGW terminal to install on Windows. |
| |
| .. code-block:: console |
| |
| $ cd myproj |
| $ tree |
| . |
| ├── DISCLAIMER |
| ├── LICENSE |
| ├── NOTICE |
| ├── README.md |
| ├── apps |
| │ └── blinky |
| │ ├── pkg.yml |
| │ └── src |
| │ └── main.c |
| ├── project.yml |
| └── targets |
| ├── my_blinky_sim |
| │ ├── pkg.yml |
| │ └── target.yml |
| └── unittest |
| ├── pkg.yml |
| └── target.yml |
| |
| 6 directories, 11 files |
| |
| The newt tool installs the following files for a project in the project |
| base directory: |
| |
| 1. The file ``project.yml`` contains the repository list that the |
| project uses to fetch its packages. Your project is a collection of |
| repositories. In this case, the project only comprises the core |
| mynewt repository. Later, you will add more repositories to include |
| other mynewt components. |
| 2. The file ``apps/blinky/pkg.yml`` contains the description of your |
| application and its package dependencies. |
| 3. A ``target`` directory that contains the ``my_blinky_sim`` directory. |
| The ``my_blinky_sim`` directory a target information to build a |
| version of myproj. Use ``newt target show`` to see available build |
| targets. |
| 4. A non-buildable target called ``unittest``. This is used internally |
| by ``newt`` and is not a formal build target. |
| |
| **Note:** The actual code and package files are not installed (except |
| the template for ``main.c``). See the next step to install the packages. |
| |
| Fetching the Mynewt Source Repository and Dependencies |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| By default, Mynewt projects rely on a single repository: |
| **apache-mynewt-core** and uses the source in the master branch. If you |
| need to use a different branch, you need to change the ``vers`` value in |
| the project.yml file: |
| |
| .. code-block:: yaml |
| :emphasize-lines: 3 |
| |
| repository.apache-mynewt-core: |
| type: github |
| vers: 1-latest |
| user: apache |
| repo: mynewt-core |
| |
| Changing vers to 0-dev will put you on the latest master branch. **This |
| branch may not be stable and you may encounter bugs or other problems.** |
| |
| **Note:** On Windows platforms, you will need to change vers to 0-dev |
| and use the latest master branch. Release 1.0.0 is not supported on |
| Windows. |
| |
| Run the ``newt install`` command, from your project base directory |
| (myproj), to fetch the source repository and dependencies. |
| |
| **Note:** It may take a while to download the apache-mynewt-core |
| reposistory. Use the *-v* (verbose) option to see the installation |
| progress. |
| |
| .. code-block:: console |
| |
| $ newt install |
| apache-mynewt-core successfully installed version 1.3.0-none |
| |
| **Note:** If you get the following error: |
| |
| .. code-block:: console |
| |
| ReadDesc: No matching branch for apache-mynewt-core repo |
| Error: No matching branch for apache-mynewt-core repop |
| |
| You must edit the ``project.yml`` file and change the line |
| ``repo: incubator-mynewt-core`` as shown in the following example to |
| ``repo: mynewt-core``: |
| |
| .. code-block:: yaml |
| :emphasize-lines: 5 |
| |
| repository.apache-mynewt-core: |
| type: github |
| vers: 1-latest |
| user: apache |
| repo: incubator-mynewt-core |
| |
| View the core of the Apache Mynewt OS that is downloaded into your local |
| directory. |
| |
| (The actual output will depend on what is in the latest 'master' branch) |
| |
| .. code-block:: console |
| |
| $ tree -L 2 repos/apache-mynewt-core/ |
| |
| repos/apache-mynewt-core/ |
| ├── CODING_STANDARDS.md |
| ├── DISCLAIMER |
| ├── LICENSE |
| ├── NOTICE |
| ├── README.md |
| ├── RELEASE_NOTES.md |
| ├── apps |
| │ ├── blecent |
| │ ├── blehci |
| │ ├── bleprph |
| │ ├── bleprph_oic |
| │ ├── blesplit |
| │ ├── bletest |
| │ ├── bleuart |
| │ ├── boot |
| │ ├── btshell |
| │ ├── fat2native |
| │ ├── ffs2native |
| │ ├── ocf_sample |
| │ ├── slinky |
| │ ├── slinky_oic |
| │ ├── spitest |
| │ ├── splitty |
| │ ├── test |
| │ ├── testbench |
| │ └── timtest |
| ├── boot |
| │ ├── boot_serial |
| │ ├── bootutil |
| │ ├── split |
| │ └── split_app |
| ├── compiler |
| │ ├── arm-none-eabi-m0 |
| │ ├── arm-none-eabi-m4 |
| │ ├── gdbmacros |
| │ ├── mips |
| │ ├── sim |
| │ └── sim-mips |
| ├── crypto |
| │ ├── mbedtls |
| │ └── tinycrypt |
| ├── docs |
| │ └── doxygen.xml |
| ├── encoding |
| │ ├── base64 |
| │ ├── cborattr |
| │ ├── json |
| │ └── tinycbor |
| ├── fs |
| │ ├── disk |
| │ ├── fatfs |
| │ ├── fcb |
| │ ├── fs |
| │ └── nffs |
| ├── hw |
| │ ├── bsp |
| │ ├── cmsis-core |
| │ ├── drivers |
| │ ├── hal |
| │ ├── mcu |
| │ └── scripts |
| ├── kernel |
| │ └── os |
| ├── libc |
| │ └── baselibc |
| ├── mgmt |
| │ ├── imgmgr |
| │ ├── mgmt |
| │ ├── newtmgr |
| │ └── oicmgr |
| ├── net |
| │ ├── ip |
| │ ├── nimble |
| │ ├── oic |
| │ └── wifi |
| ├── project.yml |
| ├── repository.yml |
| ├── sys |
| │ ├── config |
| │ ├── console |
| │ ├── coredump |
| │ ├── defs |
| │ ├── flash_map |
| │ ├── id |
| │ ├── log |
| │ ├── mfg |
| │ ├── reboot |
| │ ├── shell |
| │ ├── stats |
| │ └── sysinit |
| ├── targets |
| │ └── unittest |
| ├── test |
| │ ├── crash_test |
| │ ├── flash_test |
| │ ├── runtest |
| │ └── testutil |
| ├── time |
| │ └── datetime |
| └── util |
| ├── cbmem |
| ├── crc |
| └── mem |
| |
| 94 directories, 9 files |
| |
| Testing the Project Packages |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| **Note**: This is not yet supported on Windows. |
| |
| You can use the newt tool to execute the unit tests in a package. For |
| example, run the following command to test the ``sys/config`` package in |
| the ``apache-mynewt-core`` repo: |
| |
| .. code-block:: console |
| |
| $ newt test @apache-mynewt-core/sys/config |
| Testing package @apache-mynewt-core/sys/config/test-fcb |
| Compiling bootutil_misc.c |
| Compiling image_ec.c |
| Compiling image_rsa.c |
| Compiling image_validate.c |
| |
| ... |
| |
| Linking ~/dev/myproj/bin/targets/unittest/sys_config_test-fcb/app/sys/config/test-fcb/sys_config_test-fcb.elf |
| Executing test: ~/dev/myproj/bin/targets/unittest/sys_config_test-fcb/app/sys/config/test-fcb/sys_config_test-fcb.elf |
| Testing package @apache-mynewt-core/sys/config/test-nffs |
| Compiling repos/apache-mynewt-core/encoding/base64/src/hex.c |
| Compiling repos/apache-mynewt-core/fs/fs/src/fs_cli.c |
| Compiling repos/apache-mynewt-core/fs/fs/src/fs_dirent.c |
| Compiling repos/apache-mynewt-core/fs/fs/src/fs_mkdir.c |
| Compiling repos/apache-mynewt-core/fs/fs/src/fs_mount.c |
| Compiling repos/apache-mynewt-core/encoding/base64/src/base64.c |
| Compiling repos/apache-mynewt-core/fs/fs/src/fs_file.c |
| Compiling repos/apache-mynewt-core/fs/disk/src/disk.c |
| Compiling repos/apache-mynewt-core/fs/fs/src/fs_nmgr.c |
| Compiling repos/apache-mynewt-core/fs/fs/src/fsutil.c |
| Compiling repos/apache-mynewt-core/fs/nffs/src/nffs.c |
| |
| ... |
| |
| Linking ~/dev/myproj/bin/targets/unittest/sys_config_test-nffs/app/sys/config/test-nffs/sys_config_test-nffs.elf |
| Executing test: ~/dev/myproj/bin/targets/unittest/sys_config_test-nffs/app/sys/config/test-nffs/sys_config_test-nffs.elf |
| Passed tests: [sys/config/test-fcb sys/config/test-nffs] |
| All tests passed |
| |
| **Note:** If you installed the latest gcc using homebrew on your Mac, |
| you are probably running gcc-6. Make sure you change the compiler.yml |
| configuration to specify that you are using gcc-6 (See :doc:`native_install/native_tools`). You can also |
| downgrade your installation to gcc-5 and use the default gcc compiler configuration for MyNewt: |
| |
| .. code-block:: console |
| |
| $ brew uninstall gcc-6 |
| $ brew link gcc-5 |
| |
| **Note:** If you are running the standard gcc for 64-bit machines, it |
| does not support 32-bit. In that case you will see compilation errors. |
| You need to install multilib gcc (e.g. gcc-multilib if you running on a |
| 64-bit Ubuntu). |
| |
| To test all the packages in a project, specify ``all`` instead of the |
| package name. |
| |
| .. code-block:: console |
| |
| $ newt test all |
| Testing package @apache-mynewt-core/boot/boot_serial/test |
| Compiling repos/apache-mynewt-core/boot/boot_serial/test/src/boot_test.c |
| Compiling repos/apache-mynewt-core/boot/boot_serial/test/src/testcases/boot_serial_setup.c |
| |
| ... |
| |
| Linking ~/dev/myproj/bin/targets/unittest/boot_boot_serial_test/app/boot/boot_serial/test/boot_boot_serial_test.elf |
| |
| ...lots of compiling and testing... |
| |
| Linking ~/dev/myproj/bin/targets/unittest/util_cbmem_test/app/util/cbmem/test/util_cbmem_test.elf |
| Executing test: ~/dev/myproj/bin/targets/unittest/util_cbmem_test/app/util/cbmem/test/util_cbmem_test.elf |
| Passed tests: [boot/boot_serial/test boot/bootutil/test crypto/mbedtls/test encoding/base64/test encoding/cborattr/test encoding/json/test fs/fcb/test fs/nffs/test kernel/os/test net/ip/mn_socket/test net/nimble/host/test net/oic/test sys/config/test-fcb sys/config/test-nffs sys/flash_map/test sys/log/full/test util/cbmem/test] |
| All tests passed |
| |
| Building and Running the Simulated Blinky Application |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The section shows you how to build and run the blinky application to run |
| on Mynewt's simulated hardware. |
| |
| **Note**: This is not yet supported on Windows. Refer to the :ref:`blinky_tutorials` to create a blinky application |
| for a target board. |
| |
| Building the Application |
| ^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| To build the simulated blinky application, run ``newt build my_blinky_sim``: |
| |
| .. code-block:: console |
| |
| $ newt build my_blinky_sim |
| Building target targets/my_blinky_sim |
| Compiling repos/apache-mynewt-core/hw/hal/src/hal_common.c |
| Compiling repos/apache-mynewt-core/hw/drivers/uart/src/uart.c |
| Compiling repos/apache-mynewt-core/hw/hal/src/hal_flash.c |
| Compiling repos/apache-mynewt-core/hw/bsp/native/src/hal_bsp.c |
| Compiling repos/apache-mynewt-core/hw/drivers/uart/uart_hal/src/uart_hal.c |
| Compiling apps/blinky/src/main.c |
| |
| ... |
| |
| Archiving sys_mfg.a |
| Archiving sys_sysinit.a |
| Archiving util_mem.a |
| Linking ~/dev/myproj/bin/targets/my_blinky_sim/app/apps/blinky/blinky.elf |
| Target successfully built: targets/my_blinky_sim |
| |
| Running the Blinky Application |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| |
| You can run the simulated version of your project and see the simulated |
| LED blink. |
| |
| If you natively install the toolchain execute the binary directly: |
| |
| .. code-block:: console |
| |
| $ ./bin/targets/my_blinky_sim/app/apps/blinky/blinky.elf |
| hal_gpio set pin 1 to 0 |
| |
| If you are using newt docker, use ``newt run`` to run the simulated |
| binary. |
| |
| .. code-block:: console |
| |
| $ newt run my_blinky_sim |
| Loading app image into slot 1 |
| ... |
| Debugging ~/dev/myproj/bin/targets/my_blinky_sim/app/apps/blinky/blinky.elf |
| ... |
| Reading symbols from /bin/targets/my_blinky_sim/app/apps/blinky/blinky.elf...done. |
| (gdb) |
| |
| |
| Type ``r`` at the ``(gdb)`` prompt to run the project. You will see an |
| output indicating that the ``hal_gpio`` pin is toggling between 1 and 0 |
| in a simulated blink. |
| |
| Exploring other Mynewt OS Features |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Congratulations, you have created your first project! The blinky |
| application is not terribly exciting when it is run in the simulator, as |
| there is no LED to blink. Apache Mynewt has a lot more functionality |
| than just running simulated applications. It provides all the features |
| you'll need to cross-compile your application, run it on real hardware |
| and develop a full featured application. |
| |
| If you're interested in learning more, a good next step is to dig in to |
| one of the :ref:`tutorials` and get a Mynewt |
| project running on real hardware. |
| |
| Happy Hacking! |