lora

Committer:
mbed_official
Date:
Wed Apr 18 06:30:24 2018 +0100
Revision:
12:5015dfead3f2
Parent:
2:dc95ac6d6d4e
Child:
26:f07f5febf97f
Reduce example application memory usage

Our currently supported targets DISCO_L072CZ_LRWAN1 and MTB_MURATA_ABZ
only have 20kB of RAM which requires some memory usage optimizations
to LoRa example application especially when compiled with GCC compiler.

This commit reduces application tx and rx buffers to 30 bytes (instead of
255) as application only sends short messages.

Also main thread stack size is reduced to 1024 bytes for these two targets.
NOTE! Due to small stack size, mbed traces cannot be enabled for these targets!

.
Commit copied from https://github.com/ARMmbed/mbed-os-example-lorawan

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:7037ed05f54f 1 # Example LoRaWAN application for Mbed-OS
mbed_official 0:7037ed05f54f 2
mbed_official 0:7037ed05f54f 3 This is an example application based on `Mbed-OS` LoRaWAN protocol APIs. The Mbed-OS LoRaWAN stack implementation is compliant with LoRaWAN v1.0.2 specification.
mbed_official 0:7037ed05f54f 4
mbed_official 0:7037ed05f54f 5 ## Getting started
mbed_official 0:7037ed05f54f 6
mbed_official 0:7037ed05f54f 7 This application can work with any Network Server if you have correct credentials for the said Network Server.
mbed_official 0:7037ed05f54f 8
mbed_official 0:7037ed05f54f 9 ### Download the application
mbed_official 0:7037ed05f54f 10
mbed_official 0:7037ed05f54f 11 ```sh
mbed_official 0:7037ed05f54f 12 $ mbed import mbed-os-example-lorawan
mbed_official 0:7037ed05f54f 13 $ cd mbed-os-example-lorawan
mbed_official 0:7037ed05f54f 14
mbed_official 0:7037ed05f54f 15 #OR
mbed_official 0:7037ed05f54f 16
mbed_official 0:7037ed05f54f 17 $ git clone git@github.com:ARMmbed/mbed-os-example-lorawan.git
mbed_official 0:7037ed05f54f 18 $ cd mbed-os-example-lorawan
mbed_official 0:7037ed05f54f 19 $ mbed deploy
mbed_official 0:7037ed05f54f 20 ```
mbed_official 0:7037ed05f54f 21
mbed_official 0:7037ed05f54f 22 ### Selecting radio
mbed_official 0:7037ed05f54f 23
mbed_official 0:7037ed05f54f 24 Mbed OS provides inherent support for a variety of modules. If your device is one of the those modules, you may skip this part. The correct radio type and pin set is already provided for the modules in the `target-overrides` field. For more information on supported modules, please refer to the [module support section](#module-support)
mbed_official 0:7037ed05f54f 25
mbed_official 0:7037ed05f54f 26 If you are using an Mbed Enabled radio shield such as [Mbed SX1276 shield LoRa](https://os.mbed.com/components/SX1276MB1xAS/) or [Mbed SX1272 LoRa shield ](https://os.mbed.com/components/SX1272MB2xAS/) with any Mbed Enabled board, this part is relevant. You can use any Mbed Enabled board that comes with an arduino form factor.
mbed_official 0:7037ed05f54f 27
mbed_official 0:7037ed05f54f 28 Please select your radio type by modifying the `lora-radio` field and providing a pin set if it is different from the default. For example:
mbed_official 0:7037ed05f54f 29
mbed_official 0:7037ed05f54f 30 ```json
mbed_official 0:7037ed05f54f 31 "lora-radio": {
mbed_official 0:7037ed05f54f 32 "help": "Which radio to use (options: SX1272,SX1276)",
mbed_official 0:7037ed05f54f 33 "value": "SX1272"
mbed_official 0:7037ed05f54f 34 },
mbed_official 0:7037ed05f54f 35 ```
mbed_official 0:7037ed05f54f 36
mbed_official 0:7037ed05f54f 37 ### Add network credentials
mbed_official 0:7037ed05f54f 38
mbed_official 2:dc95ac6d6d4e 39 Open the file `mbed_app.json` in the root directory of your application. This file contains all the user specific configurations your application and the Mbed OS LoRaWAN stack need. Network credentials are typically provided by LoRa network provider.
mbed_official 0:7037ed05f54f 40
mbed_official 0:7037ed05f54f 41 #### For OTAA
mbed_official 0:7037ed05f54f 42
mbed_official 0:7037ed05f54f 43 Please add `Device EUI`, `Application EUI` and `Application Key` needed for Over-the-air-activation(OTAA). For example:
mbed_official 0:7037ed05f54f 44
mbed_official 0:7037ed05f54f 45 ```json
mbed_official 0:7037ed05f54f 46
mbed_official 0:7037ed05f54f 47 "lora.device-eui": "{ YOUR_DEVICE_EUI }",
mbed_official 0:7037ed05f54f 48 "lora.application-eui": "{ YOUR_APPLICATION_EUI }",
mbed_official 0:7037ed05f54f 49 "lora.application-key": "{ YOUR_APPLICATION_KEY }"
mbed_official 0:7037ed05f54f 50 ```
mbed_official 0:7037ed05f54f 51
mbed_official 0:7037ed05f54f 52 #### For ABP
mbed_official 0:7037ed05f54f 53
mbed_official 0:7037ed05f54f 54 For Activation-By-Personalization (ABP) connection method, modify the `mbed_app.json` to enable ABP. You can do it by simply turning off OTAA. For example:
mbed_official 0:7037ed05f54f 55
mbed_official 0:7037ed05f54f 56 ```json
mbed_official 0:7037ed05f54f 57 "lora.over-the-air-activation": false,
mbed_official 0:7037ed05f54f 58 ```
mbed_official 0:7037ed05f54f 59
mbed_official 0:7037ed05f54f 60 In addition to that, you need to provide `Application Session Key`, `Network Session Key` and `Device Address`. For example:
mbed_official 0:7037ed05f54f 61
mbed_official 0:7037ed05f54f 62 ```json
mbed_official 0:7037ed05f54f 63 "lora.appskey": "{ YOUR_APPLICATION_SESSION_KEY }",
mbed_official 0:7037ed05f54f 64 "lora.nwkskey": "{ YOUR_NETWORK_SESSION_KEY }",
mbed_official 0:7037ed05f54f 65 "lora.device-address": " YOUR_DEVICE_ADDRESS_IN_HEX "
mbed_official 0:7037ed05f54f 66 ```
mbed_official 0:7037ed05f54f 67
mbed_official 0:7037ed05f54f 68 ## Configuring the application
mbed_official 0:7037ed05f54f 69
mbed_official 0:7037ed05f54f 70 The Mbed OS LoRaWAN stack provides a lot of configuration controls to the application through the Mbed OS configuration system. The previous section discusses some of these controls. This section highlights some useful features that you can configure.
mbed_official 0:7037ed05f54f 71
mbed_official 0:7037ed05f54f 72 ### Selecting a PHY
mbed_official 0:7037ed05f54f 73
mbed_official 0:7037ed05f54f 74 The LoRaWAN protocol is subject to various country specific regulations concerning radio emissions. That's why the Mbed OS LoRaWAN stack provides a `LoRaPHY` class that you can use to implement any region specific PHY layer. Currently, the Mbed OS LoRaWAN stack provides 10 different country specific implementations of `LoRaPHY` class. Selection of a specific PHY layer happens at compile time. By default, the Mbed OS LoRaWAN stack uses `EU 868 MHz` PHY. An example of selecting a PHY can be:
mbed_official 0:7037ed05f54f 75
mbed_official 0:7037ed05f54f 76 ```josn
mbed_official 0:7037ed05f54f 77 "phy": {
mbed_official 0:7037ed05f54f 78 "help": "LoRa PHY region. 0 = EU868 (default), 1 = AS923, 2 = AU915, 3 = CN470, 4 = CN779, 5 = EU433, 6 = IN865, 7 = KR920, 8 = US915, 9 = US915_HYBRID",
mbed_official 0:7037ed05f54f 79 "value": "0"
mbed_official 0:7037ed05f54f 80 },
mbed_official 0:7037ed05f54f 81 ```
mbed_official 0:7037ed05f54f 82
mbed_official 0:7037ed05f54f 83 ### Duty cycling
mbed_official 0:7037ed05f54f 84
mbed_official 0:7037ed05f54f 85 LoRaWAN v1.0.2 specifcation is exclusively duty cycle based. This application comes with duty cycle enabled by default. In other words, the Mbed OS LoRaWAN stack enforces duty cycle. The stack keeps track of transmissions on the channels in use and schedules transmissions on channels that become available in the shortest time possible. We recommend you keep duty cycle on for compliance with your country specific regulations.
mbed_official 0:7037ed05f54f 86
mbed_official 0:7037ed05f54f 87 However, you can define a timer value in the application, which you can use to perform a periodic uplink when the duty cycle is turned off. Such a setup should be used only for testing or with a large enough timer value. For example:
mbed_official 0:7037ed05f54f 88
mbed_official 0:7037ed05f54f 89 ```josn
mbed_official 0:7037ed05f54f 90 "target_overrides": {
mbed_official 0:7037ed05f54f 91 "*": {
mbed_official 0:7037ed05f54f 92 "lora.duty-cycle-on": false
mbed_official 0:7037ed05f54f 93 },
mbed_official 0:7037ed05f54f 94 }
mbed_official 0:7037ed05f54f 95 }
mbed_official 0:7037ed05f54f 96 ```
mbed_official 0:7037ed05f54f 97
mbed_official 0:7037ed05f54f 98 ## Module support
mbed_official 0:7037ed05f54f 99
mbed_official 0:7037ed05f54f 100 Here is a nonexhaustive list of boards and modules that we have tested with the Mbed OS LoRaWAN stack.
mbed_official 0:7037ed05f54f 101
mbed_official 0:7037ed05f54f 102 - MultiTech mDot.
mbed_official 0:7037ed05f54f 103 - MultiTech xDot.
mbed_official 0:7037ed05f54f 104 - LTEK_FF1705.
mbed_official 0:7037ed05f54f 105 - Advantech Wise 1510.
mbed_official 0:7037ed05f54f 106 - ST B-L072Z-LRWAN1 LoRa®Discovery kit (with muRata radio chip).
mbed_official 0:7037ed05f54f 107
mbed_official 0:7037ed05f54f 108 ## Compiling the application
mbed_official 0:7037ed05f54f 109
mbed_official 0:7037ed05f54f 110 Use Mbed CLI commands to generate a binary for the application.
mbed_official 0:7037ed05f54f 111 For example:
mbed_official 0:7037ed05f54f 112
mbed_official 0:7037ed05f54f 113 ```sh
mbed_official 0:7037ed05f54f 114 $ mbed compile -m YOUR_TARGET -t ARM
mbed_official 0:7037ed05f54f 115 ```
mbed_official 0:7037ed05f54f 116
mbed_official 0:7037ed05f54f 117 ## Running the application
mbed_official 0:7037ed05f54f 118
mbed_official 0:7037ed05f54f 119 Drag and drop the application binary from `BUILD/YOUR_TARGET/ARM/mbed-os-example-lora.bin` to your Mbed enabled target hardware, which appears as a USB device on your host machine.
mbed_official 0:7037ed05f54f 120
mbed_official 0:7037ed05f54f 121 Attach a serial console emulator of your choice (for example, PuTTY, Minicom or screen) to your USB device. Set the baudrate to 115200 bit/s, and reset your board by pressing the reset button.
mbed_official 0:7037ed05f54f 122
mbed_official 0:7037ed05f54f 123 You should see an output similar to this:
mbed_official 0:7037ed05f54f 124
mbed_official 0:7037ed05f54f 125 ```
mbed_official 0:7037ed05f54f 126 Mbed LoRaWANStack initialized
mbed_official 0:7037ed05f54f 127
mbed_official 0:7037ed05f54f 128 CONFIRMED message retries : 3
mbed_official 0:7037ed05f54f 129
mbed_official 0:7037ed05f54f 130 Adaptive data rate (ADR) - Enabled
mbed_official 0:7037ed05f54f 131
mbed_official 0:7037ed05f54f 132 Connection - In Progress ...
mbed_official 0:7037ed05f54f 133
mbed_official 0:7037ed05f54f 134 Connection - Successful
mbed_official 0:7037ed05f54f 135
mbed_official 0:7037ed05f54f 136 Dummy Sensor Value = 2.1
mbed_official 0:7037ed05f54f 137
mbed_official 0:7037ed05f54f 138 25 bytes scheduled for transmission
mbed_official 0:7037ed05f54f 139
mbed_official 0:7037ed05f54f 140 Message Sent to Network Server
mbed_official 0:7037ed05f54f 141
mbed_official 0:7037ed05f54f 142 ```
mbed_official 0:7037ed05f54f 143
mbed_official 0:7037ed05f54f 144 ## [Optional] Adding trace library
mbed_official 0:7037ed05f54f 145 To enable Mbed trace, add to your `mbed_app.json` the following fields:
mbed_official 0:7037ed05f54f 146
mbed_official 0:7037ed05f54f 147 ```json
mbed_official 0:7037ed05f54f 148 "target_overrides": {
mbed_official 0:7037ed05f54f 149 "*": {
mbed_official 0:7037ed05f54f 150 "target.features_add": ["COMMON_PAL"],
mbed_official 0:7037ed05f54f 151 "mbed-trace.enable": true
mbed_official 0:7037ed05f54f 152 }
mbed_official 0:7037ed05f54f 153 }
mbed_official 0:7037ed05f54f 154 ```
mbed_official 12:5015dfead3f2 155 The trace is disabled by default to save RAM and reduce main stack usage (see chapter Memory optimization).
mbed_official 12:5015dfead3f2 156
mbed_official 12:5015dfead3f2 157 **Please note that some targets with small RAM size (e.g. DISCO_L072CZ_LRWAN1 and MTB_MURATA_ABZ) mbed traces cannot be enabled without increasing the default** `"main_stack_size": 1024`**.**
mbed_official 0:7037ed05f54f 158
mbed_official 0:7037ed05f54f 159 ## [Optional] Memory optimization
mbed_official 0:7037ed05f54f 160
mbed_official 0:7037ed05f54f 161 Using `Arm CC compiler` instead of `GCC` reduces `3K` of RAM. Currently the application takes about `15K` of static RAM with Arm CC, which spills over for the platforms with `20K` of RAM because you need to leave space, about `5K`, for dynamic allocation. So if you reduce the application stack size, you can barely fit into the 20K platforms.
mbed_official 0:7037ed05f54f 162
mbed_official 0:7037ed05f54f 163 For example, add the following into `config` section in your `mbed_app.json`:
mbed_official 0:7037ed05f54f 164
mbed_official 0:7037ed05f54f 165 ```
mbed_official 0:7037ed05f54f 166 "main_stack_size": {
mbed_official 0:7037ed05f54f 167 "value": 2048
mbed_official 0:7037ed05f54f 168 }
mbed_official 0:7037ed05f54f 169 ```
mbed_official 0:7037ed05f54f 170
mbed_official 0:7037ed05f54f 171 Essentially you can make the whole application with Mbed LoRaWAN stack in 6K if you drop the RTOS from Mbed OS and use a smaller standard C/C++ library like new-lib-nano. Please find instructions [here](https://os.mbed.com/blog/entry/Reducing-memory-usage-with-a-custom-prin/).
mbed_official 0:7037ed05f54f 172
mbed_official 0:7037ed05f54f 173
mbed_official 0:7037ed05f54f 174 For more information, please follow this [blog post](https://os.mbed.com/blog/entry/Reducing-memory-usage-by-tuning-RTOS-con/).