# Change Log
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## [Unreleased]
## [v0.7.5]
- Fix incorrect dependency on cortex-m-rt-macros in v0.7.4 which led to
incorrect HardFault handlers being generated.
- MSRV is now Rust 1.61 to support syn verions >=2.0.68
- The `_stack_end` symbol is added, e.g. for use with MSPLIM (#565)
- Macros now expand to include an `unsafe` block and `allow(static_mut_refs)`
when generating the `&'static mut` references in entry/interrupt handlers
(#561, #558)
- `expect` attribute now permitted on entry/interrupt handlers (#557)
- Up to 496 interrupts now permitted on ARMv8-M (#555)
- Add new `paint-stack` feature which writes a fixed value to the entire stack
during initialisation (#548)
- The hard fault handler `_HardFault` is now placed in the `.HardFault.user`
linker section (#535)
## [v0.7.4]
- Add `zero-init-ram` feature to initialize RAM with zeros on startup.
This can be necessary to properly initialise hardware error detection.
- Add optional `exception` argument for `HardFault`.
It has one option `trampoline` which is `true` by default. When set to `false`,
no trampoline will be created and the function will be called as the
exception handler directly.
- MSRV increased to 1.60.0 to align with `embedded-hal` version 1.
- Improve linker error message when code does not fit into flash.
- Update documentation on using custom linker scripts and linker sections
and on the `pre_init` function.
## [v0.7.3]
- Fixed a potential miscompilation caused by the initial stack pointer
not being 8-byte aligned. This issue affected 0.7.1 and 0.7.2; for
more details please see [the advisory] ([#467]).
- A linker error is generated if the initial stack pointer is not 8-byte aligned ([#464]).
- The initial stack pointer is now forced to be 8-byte aligned in the linker script,
to defend against it being overridden outside of the cortex-m-rt linker script ([#465]).
[the advisory]: https://github.com/rust-embedded/cortex-m/discussions/469
[#464]: https://github.com/rust-embedded/cortex-m/issues/464
[#465]: https://github.com/rust-embedded/cortex-m/issues/465
[#467]: https://github.com/rust-embedded/cortex-m/issues/467
## [v0.7.2]
- MSRV is now Rust 1.59.
- Moved precompiled assembly blobs to `global_asm!`, requiring Rust 1.59.
- Add new `set_vtor` and `set-sp` features to conditionally set the VTOR and SP
registers at device reset ([#423]).
- Allow (unstable) `naked` attribute on interrupt handlers and `pre_init`.
## Fixes
- Fix `cortex_m_rt::exception` macro no longer being usable fully-qualified ([#414])
- Fix veneer limit position in linker script ([#434]).
[#414]: https://github.com/rust-embedded/cortex-m/issues/414
[#423]: https://github.com/rust-embedded/cortex-m/issues/423
[#434]: https://github.com/rust-embedded/cortex-m/issues/434
## Notes
- From this release onwards, cortex-m-rt lives in the cortex-m repository;
issue numbers refer there.
## [v0.7.1]
## Fixes
- Fix stack unwinding past `Reset` function ([#337])
[#337]: https://github.com/rust-embedded/cortex-m-rt/pull/337
## [v0.7.0]
### New Features
- Add support for CMSE secure gateway veneers ([#297]).
- Allow using the crate with custom target JSON specs ([#304]).
- Export Exception enum for other crates to use ([#224]).
[#224]: https://github.com/rust-embedded/cortex-m-rt/pull/224
[#297]: https://github.com/rust-embedded/cortex-m-rt/pull/297
[#304]: https://github.com/rust-embedded/cortex-m-rt/pull/304
### Fixes
- Various fixes to the linker script ([#265], [#286], [#287], [#323]).
- Use the correct ABI for the `main` symbol ([#278]).
- Add barriers after FPU enabling ([#279]).
- (ARMv6-M) Set LR value to a known value on reset ([#293]).
- Added CFI and size info to external assembly subroutines (`HardFaultTrampoline` and `FpuTrampoline`) ([#294]).
- Allow building the crate for macOS targets ([#306], [#310]).
- Perform RAM initialization in assembly, to avoid potential UB in Rust ([#301]).
- Perform volatile reads of ICSR in DefaultHandler ([#315]).
[#265]: https://github.com/rust-embedded/cortex-m-rt/pull/265
[#278]: https://github.com/rust-embedded/cortex-m-rt/pull/278
[#279]: https://github.com/rust-embedded/cortex-m-rt/pull/279
[#286]: https://github.com/rust-embedded/cortex-m-rt/pull/286
[#287]: https://github.com/rust-embedded/cortex-m-rt/pull/287
[#293]: https://github.com/rust-embedded/cortex-m-rt/pull/293
[#294]: https://github.com/rust-embedded/cortex-m-rt/pull/294
[#301]: https://github.com/rust-embedded/cortex-m-rt/pull/301
[#306]: https://github.com/rust-embedded/cortex-m-rt/pull/306
[#310]: https://github.com/rust-embedded/cortex-m-rt/pull/310
[#315]: https://github.com/rust-embedded/cortex-m-rt/pull/315
[#323]: https://github.com/rust-embedded/cortex-m-rt/pull/323
### Breaking Changes
- Make `ExceptionFrame`s fields private, adding setters and getters instead
([#239]).
- Only allow certain attributes on handlers, and apply them to the trampoline
too ([#228]).
- Make it unsafe to define exception handlers for NMIs ([#289]).
- Check that exceptions exist on the target chip when registering a handler for
them ([#308]).
[#239]: https://github.com/rust-embedded/cortex-m-rt/pull/239
[#228]: https://github.com/rust-embedded/cortex-m-rt/pull/228
[#289]: https://github.com/rust-embedded/cortex-m-rt/pull/289
[#308]: https://github.com/rust-embedded/cortex-m-rt/pull/308
### Other
- Change macros crate to use same version number as cortex-m-rt crate ([#245]).
- Discourage use of `pre_init` in documentation ([#248]).
- Backport: Use `links` in Cargo.toml to prevent multiple linking of
cortex-m-rt ([#276]).
[#245]: https://github.com/rust-embedded/cortex-m-rt/pull/245
[#248]: https://github.com/rust-embedded/cortex-m-rt/pull/248
[#276]: https://github.com/rust-embedded/cortex-m-rt/pull/276
## Backport release: [v0.6.15] - 2021-07-12
### Fixed
- Backport: Mark .bss as NOLOAD ([#265])
- Backport: Fix possible overflow of .data region ([#286])
- Backport: Perform volatile reads of ICSR in DefaultHandler ([#315])
### Other
- Backport: Use `links` in Cargo.toml to prevent multiple linking of
cortex-m-rt ([#276])
- Backport: Use same verison for macros crate as for cortex-m-rt itself
([#245])
[#245]: https://github.com/rust-embedded/cortex-m-rt/pull/245
[#265]: https://github.com/rust-embedded/cortex-m-rt/pull/265
[#276]: https://github.com/rust-embedded/cortex-m-rt/pull/276
[#286]: https://github.com/rust-embedded/cortex-m-rt/pull/286
[#315]: https://github.com/rust-embedded/cortex-m-rt/pull/315
## [v0.6.14] - 2021-05-19
### Fixed
- Backport: Allow building the crate for macOS targets ([#306], [#310]).
[#306]: https://github.com/rust-embedded/cortex-m-rt/issues/306
[#310]: https://github.com/rust-embedded/cortex-m-rt/issues/310
## Backport release: [v0.6.13] - 2020-09-07
### Fixed
- (ARMv6-M) Set LR value to a known value on reset (as the ARM spec requires)
- Added CFI and size info to external assembly subroutines (`HardFaultTrampoline`)
## Backport release: [v0.6.12] - 2020-01-26
### Fixed
- Fixed lint warnings getting emitted on macro-generated code.
## [v0.6.11] - 2019-12-04
### Changed
- Macros now generate a second trampoline function instead of randomizing the
function's symbol name. This makes the build deterministic.
- [breaking-change] `static mut` resources no longer have `'static` lifetime
except in the `#[entry]` function (this is a soundness fix; see [#212]).
[#212]: https://github.com/rust-embedded/cortex-m-rt/issues/212
## [v0.6.10] - 2019-07-25
### Fixed
- Linker template now takes and discard `*(.ARM.exidx)`
## [v0.6.9] - 2019-07-11
### Added
- Input `.uninit.*` sections are now collected into an output `.uninit` section.
Uninitialized static variables are meant to be placed in these sections. The
output `.uninit` section is not initialized by the runtime.
## [v0.6.8] - 2019-04-02
### Fixed
- Correct stack-pointer is selected on `HardFault`
- Linker template now takes and discard `*(.ARM.extab.*)`
- Misc. documentation fixes
### Changed
- Architecture added: `armv8-m.main`
- Cortex-M team added to `authors`
- The nightly build is allowed to fail in CI
## [v0.6.7] - 2018-12-15
### Fixed
- entry / exception / interrupt: `#[cfg]` attributes used on `static mut`
variables are now properly handled.
## [v0.6.6] - 2018-12-06
### Changed
- Misuse of attributes now produce compiler errors with proper spans instead of
panicking messages.
- The `HardFault` symbol has been renamed to `HardFaultTrampoline`; likewise the
`UserHardFault` symbol has been renamed to `HardFault`. If you were using
breakpoints on `UserHardFault` to detect hard fault you should now put those
breakpoints on the `HardFault` symbol.
### Fixed
- Attributes on local `static mut` variables (declared at the beginning of
`entry` / `interrupt` / `exception`) are now respected.
- The "GDB can now unwind HardFault callstacks" fix from the previous release
broke `HardFault`'s' `&ExceptionFrame` argument (the pointer was off by 8
bytes). This release fixes that problem without compromising GDB's ability to
unwind `HardFault`s.
## [v0.6.5] - 2018-10-23
### Changed
- We now keep `.stack_sizes` by default, for use with external tooling.
- (macros) New `#[interrupt]` attribute added, similar to `#[exception]` for
use with device-specific interrupt handlers.
### Fixed
- GDB can now unwind HardFault callstacks
## [v0.6.4] - 2018-09-25
### Changed
- (macros) Improved the error message when any of the attribute is used on the
wrong kind of item.
### Fixed
- (macros) The expansion of the `exception` attribute now uses the `extern "C"`
ABI which is what the hardware expects.
- (macros) `entry` and `exception` now respect the declared unsafety. That is
`#[entry] unsafe main() -> !` won't require `unsafe` blocks to use `unsafe`
API.
## [v0.6.3] - 2018-09-09
### Fixed
- Fixed the `rand` problem for real.
## [v0.6.2] - 2018-09-09
### Fixed
- Worked around a Cargo limitation that broke builds that depend on `rand`.
- Updated the documentation link in the README to point to working docs.
## [v0.6.1] - 2018-09-06
### Changed
- Produce a better error message if two (or more) copies of `cortex-m-rt` are
going to be linked into a binary.
## [v0.6.0] - 2018-09-06
### Changed
- [breaking-change] the `entry!`, `pre_init!` and `exception!` macros have been
replaced with attributes: `#[entry]`, `#[pre_init]` and `#[exception]`,
respectively. This also changes the toolchain requirement to 1.30-beta or
newer.
## [v0.5.3] - 2018-08-27
### Changed
- This crate no longer depends on `arm-none-eabi-gcc`.
## [v0.5.2] - 2018-08-11
### Added
* A `pre_init!` macro and related functionality to run a function immediately
after reset, before memory initialisation
### Changed
- The `entry!` and `exception!` macros now also accept a closure instead of a path.
- `DefaultHandler` and `UserHardFault` now default to an infinite loop if left undefined.
### Fixed
* Linked script modified to correctly detect `FLASH` overflow caused by `.data`
## [v0.5.1] - 2018-05-14
### Fixed
- A recompilation problem where this `cortex-m-rt` would be recompiled every time `cargo build` is
invoked.
## [v0.5.0] - 2018-05-12
### Added
- An `entry!` macro to set the entry point of the program.
- A `heap_start` function that returns a pointer into the start of the heap region.
- A `device` feature. When disabled this crate provides the interrupt vectors; when enabled the
interrupt vectors are expected to be provided by another crate. Read the documentation for
details.
### Changed
- This crate now compiles on the beta and stable channels.
- [breaking-change] this crate now requires `arm-none-eabi-gcc` to be installed and available in
`$PATH` to compile.
- [breaking-change] the `start` lang item has been removed. The standard `main` interface won't
work. Instead use `#![no_main]` and the `entry!` macro. See documentation for details.
- [breaking-change] the `default_handler!` macro has been merged into the `exception!` macro. Use
`exception!(*, ..)` to set the default exception handler.
- [breaking-change] there's no weak default handler so a default handler must be defined by the
application, or one of its dependencies.
- [breaking-change] the syntax of the third argument of the `exception!` handler has changed. See
the documentation of the macro for details.
- [breaking-change] the exception names that the `exception!` macro accepts has changed to match the
CMSIS specification. See the documentation of the macro for the list of names it accepts.
- [breaking-change] The number of symbol interfaces has been reduced. Check the advanced section of
the documentation for details.
## [v0.4.0] - 2018-04-09
### Added
- LLD support. The linker script provided by this crate has been tweaked to support both LLD and GNU
LD. To use LLD as a linker change `.cargo/config` to look like this:
``` diff
[target.thumbv7m-none-eabi]
rustflags = [
"-C", "link-arg=-Tlink.x",
- "-C", "linker=arm-none-eabi-ld",
- "-Z", "linker-flavor=ld",
+ "-C", "linker=lld",
+ "-Z", "linker-flavor=ld.lld",
]
```
### Removed
- [breaking-change] Stack overflow protection has been removed. Unfortunately, supporting this
feature produces totally wrong `arm-none-eabi-size` reports when LLD is used to link the
program. If you need the stack overflow protection feature you can continue to use version
v0.3.13+.
- [breaking-change] The "abort-on-panic" Cargo feature, which provided a `panic_fmt` implementation,
has been removed. If you were using this feature you can instead use a [panic implementation
crate][panic-impl].
[panic-impl]: https://crates.io/keywords/panic-impl
## [v0.3.15] - 2018-04-08
### Fixed
- Support the newest nightly
## [v0.3.14] - 2018-04-01
### Fixed
- `dev` channel support
## [v0.3.13] - 2018-02-17
### Added
- Fictitious `.stack` and `.heap` linker sections that represent the locations of the stack and the
heap in RAM. You can visualize these linker sections by running `arm-none-eabi-size -Ax` over your
binary.
- Zero cost stack overflow protection when you use the `cortex-m-rt-ld` linker. Check documentation
for details.
- A `_heap_size` symbol that indicates how large the heap is. This symbol is only used when
`cortex-m-rt-ld` is used as a linker.
## [v0.3.12] - 2018-01-17
### Fixed
- Support for recent nightlies.
## [v0.3.11] - 2018-01-17 - YANKED
### Changed
- Dynamically support recent nightlies, which have the `termination` lang item, and
nightly-2017-09-22, which doesn't. That nightly version is used by the docs.rs builder. Supporting
that version instead of rejecting it ensures this crate and its reverse-dependencies will get
their documentation built by the docs.rs service.
## [v0.3.10] - 2018-01-17 - YANKED
### Removed
- The nightly date check from build script that improved error messages for users of old,
unsupported nightlies. Unfortunately the check was preventing this crate and reverse-dependencies
from getting their documentation build on docs.rs
## [v0.3.9] - 2018-01-07
### Fixed
- `cargo doc` warnings
## [v0.3.8] - 2017-12-29
### Added
- `Termination` lang item
### Changed
- The `start` lang item to match the new signature
## [v0.3.7] - 2017-12-23
### Added
- Support for overriding the DEBUG_MONITOR exception handler on ARMv7-M.
## [v0.3.6] - 2017-10-03
### Fixed
- Builds with multiple codegen units by forcing the linker to look harder for the exceptions vector
table.
## [v0.3.5] - 2017-07-21
### Fixed
- Remove duplication of default exception handlers. This saves 32 bytes of Flash
memory (.text).
## [v0.3.4] - 2017-07-19
### Changed
- Align the end of .rodata to a 4-byte boundary. With this the sections that
will go into Flash memory will be 4 byte aligned at the start and at the
end. Which seems to be required (?) by Cortex-M0 devices.
- .bss and .data are now padded so their sizes are multiple of 4 bytes. This
improves the output of `objdump`; before, the output showed "Address
0x20000004 is out of bounds".
- Linking now aborts if any of the input files contains a .got section. Dynamic
relocations are not supported and Rust code is not relocatable by default.
This error only occurs if C code that was compiled with the -fPIC flag is
linked in. The error message will tell the user how to compile their C code
without -fPIC.
## [v0.3.3] - 2017-07-14
### Changed
- Updated the documentation: it's no longer necessary to use the
compiler-builtins repository since that crate landed in rust-lang/rust and
it's now available in the `rust-src` component.
## [v0.3.2] - 2017-07-07
### Changed
- Tweaked documentation
## [v0.3.1] - 2017-07-07
### Fixed
- A warning when compiling for x86_64 and the "abort-on-panic" feature is
enabled.
## [v0.3.0] - 2017-07-07
### Added
- A `default_handler!` macro to override the default exception handler.
- An `exception!` macro to override the handler for a particular exception.
### Changed
- The FPU will now be enabled before `main` if the target has FPU support.
- [breaking-change] the features "panic-over-itm" and "panic-over-semihosting"
has been removed. the `panic_fmt` language item is now *not* included by
default. An opt-in feature named "abort-on-panic" can be enabled to make this
crate provide a `panic_fmt` implementation that simply aborts.
- [breaking-change] The sections `.rodata.{exceptions,interrupts}` have been
renamed to `.vector_table.{exceptions,interrupts}`. This break the old
mechanism for registering exceptions (`static EXCEPTIONS`); use the new ones:
`default_handler!` and `exception!`.
- The `_stack_start` is now optional in the `memory.x` file. If unspecified its
value will be set to `ORIGIN(RAM) + LENGTH(RAM)`.
## [v0.2.4] - 2017-06-03
### Added
- A non-allocatable `.stlog` section to support the [`stlog`] logging framework.
[`stlog`]: https://crates.io/crates/stlog
## [v0.2.3] - 2017-05-30
### Added
- A `_stext` symbol which can be specified in the linker script to customize the
location of the `.text` section. If not specified the `.text` section will be
placed right after the `.vector_table` section.
## [v0.2.2] - 2017-05-27
### Added
- A `_sheap` symbol where the heap can be located.
### Changed
- The linker sections have renamed / reorder to make `arm-none-eabi-size -A`
more useful. You'll now see something like this:
```
$ arm-none-eabi-size -A hello
hello :
section size addr
.vector_table 1024 134217728
.text 288 134218752
.rodata 14 134219040
```
- `cortex-m-rt::reset_handler` is now the entry point of all programs that link
to `cortex-m-rt`. This makes GDB's `load` command work correctly. It will now
set the Program Counter to `reset_handler` after flashing the program so
there's no need to reset the microcontroller after flashing.
- Renamed `__exceptions` and `__interrupts` symbols, which are only used
internally, to `_eexceptions` and `_einterrupts` respectively for consistency.
### Fixed
- Include input `.text` and `.rodata` sections (note: no suffix as in
`.text.foo`) in the output file. (C) Code compiled without the equivalent
`-ffunction-sections` / `-fdata-sections` may place stuff in those unsuffixed
sections.
## [v0.2.1] - 2017-05-07
### Fixed
- Do not load the `.debug_gdb_script` section in flash. It's only needed for
debugging.
## [v0.2.0] - 2017-04-27
### Changed
- [breaking-change] the `_stack_start` symbol is now required and must be
provided in the `memory.x` file when using the "linker-script" feature. This
symbol indicates where in memory the call stack will be allocated.
## [v0.1.3] - 2017-04-25
### Fixed
- A `rustdoc` warning
## [v0.1.2] - 2017-04-22
### Changed
- Unclutter the `reset_handler` function for a better debugging experience.
## [v0.1.1] - 2017-04-15
### Changed
- Improved linker error messages
## v0.1.0 - 2017-04-12
Initial release
[Unreleased]: https://github.com/rust-embedded/cortex-m/compare/c-m-rt-v0.7.5...HEAD
[v0.7.4]: https://github.com/rust-embedded/cortex-m/compare/c-m-rt-v0.7.4...c-m-rt-v0.7.5
[v0.7.4]: https://github.com/rust-embedded/cortex-m/compare/c-m-rt-v0.7.3...c-m-rt-v0.7.4
[v0.7.3]: https://github.com/rust-embedded/cortex-m/compare/c-m-rt-v0.7.2...c-m-rt-v0.7.3
[v0.7.2]: https://github.com/rust-embedded/cortex-m/compare/c-m-rt-v0.7.1...c-m-rt-v0.7.2
[v0.7.1]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.7.0...v0.7.1
[v0.7.0]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.11...v0.7.0
[v0.6.15]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.14...v0.6.15
[v0.6.14]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.13...v0.6.14
[v0.6.13]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.12...v0.6.13
[v0.6.12]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.11...v0.6.12
[v0.6.11]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.10...v0.6.11
[v0.6.10]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.9...v0.6.10
[v0.6.9]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.8...v0.6.9
[v0.6.8]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.7...v0.6.8
[v0.6.7]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.6...v0.6.7
[v0.6.6]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.5...v0.6.6
[v0.6.5]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.4...v0.6.5
[v0.6.4]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.3...v0.6.4
[v0.6.3]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.2...v0.6.3
[v0.6.2]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.1...v0.6.2
[v0.6.1]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.6.0...v0.6.1
[v0.6.0]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.5.3...v0.6.0
[v0.5.3]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.5.2...v0.5.3
[v0.5.2]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.5.1...v0.5.2
[v0.5.1]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.5.0...v0.5.1
[v0.5.0]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.4.0...v0.5.0
[v0.4.0]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.15...v0.4.0
[v0.3.15]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.14...v0.3.15
[v0.3.14]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.13...v0.3.14
[v0.3.13]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.12...v0.3.13
[v0.3.12]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.11...v0.3.12
[v0.3.11]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.10...v0.3.11
[v0.3.10]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.9...v0.3.10
[v0.3.9]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.8...v0.3.9
[v0.3.8]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.7...v0.3.8
[v0.3.7]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.6...v0.3.7
[v0.3.6]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.5...v0.3.6
[v0.3.5]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.4...v0.3.5
[v0.3.4]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.3...v0.3.4
[v0.3.3]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.2...v0.3.3
[v0.3.2]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.1...v0.3.2
[v0.3.1]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.3.0...v0.3.1
[v0.3.0]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.2.4...v0.3.0
[v0.2.4]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.2.3...v0.2.4
[v0.2.3]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.2.2...v0.2.3
[v0.2.2]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.2.1...v0.2.2
[v0.2.1]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.2.0...v0.2.1
[v0.2.0]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.1.3...v0.2.0
[v0.1.3]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.1.2...v0.1.3
[v0.1.2]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.1.1...v0.1.2
[v0.1.1]: https://github.com/rust-embedded/cortex-m-rt/compare/v0.1.0...v0.1.1