fix: can't call C code from the stm32
chore: vscode debug stuff
This commit is contained in:
parent
aaab15e72d
commit
7808fb55e3
9 changed files with 99 additions and 7 deletions
|
@ -3,6 +3,7 @@ runner = 'probe-rs run --chip STM32L053R8'
|
||||||
|
|
||||||
[alias]
|
[alias]
|
||||||
arun = "run --target thumbv6m-none-eabi"
|
arun = "run --target thumbv6m-none-eabi"
|
||||||
|
abuild = "build --target thumbv6m-none-eabi"
|
||||||
atest = "test --target x86_64-unknown-linux-gnu"
|
atest = "test --target x86_64-unknown-linux-gnu"
|
||||||
acheck = "check --target thumbv6m-none-eabi"
|
acheck = "check --target thumbv6m-none-eabi"
|
||||||
aclippy = "clippy --target thumbv6m-none-eabi"
|
aclippy = "clippy --target thumbv6m-none-eabi"
|
||||||
|
|
20
.vscode/launch.json
vendored
Executable file
20
.vscode/launch.json
vendored
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"preLaunchTask": "${defaultBuildTask}",
|
||||||
|
"type": "probe-rs-debug",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "probe_rs Run and Debug",
|
||||||
|
"flashingConfig": {
|
||||||
|
"flashingEnabled": true,
|
||||||
|
},
|
||||||
|
"chip": "STM32L053R8",
|
||||||
|
"coreConfigs": [
|
||||||
|
{
|
||||||
|
"programBinary": "${workspaceFolder}/target/thumbv6m-none-eabi/debug/nucleo-l053r8-benches",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
25
.vscode/tasks.json
vendored
Executable file
25
.vscode/tasks.json
vendored
Executable file
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"version": "2.0.0",
|
||||||
|
"tasks": [
|
||||||
|
{
|
||||||
|
"label": "cargo run",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "cargo arun",
|
||||||
|
"problemMatcher": [
|
||||||
|
"$rustc"
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": "cargo build",
|
||||||
|
"type": "shell",
|
||||||
|
"command": "cargo build --target thumbv6m-none-eabi",
|
||||||
|
"problemMatcher": [
|
||||||
|
"$rustc"
|
||||||
|
],
|
||||||
|
"group": {
|
||||||
|
"kind": "build",
|
||||||
|
"isDefault": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -200,6 +200,11 @@
|
||||||
:exclude_setjmp_h: false # Don't use setjmp when running CMock. Note that this might result in late reporting or out-of-order failures.
|
:exclude_setjmp_h: false # Don't use setjmp when running CMock. Note that this might result in late reporting or out-of-order failures.
|
||||||
|
|
||||||
# Configuration options specific to Unity.
|
# Configuration options specific to Unity.
|
||||||
|
:compile:
|
||||||
|
- -Wall # all warnings on
|
||||||
|
- -O3 # optimizations
|
||||||
|
- -g # debug info
|
||||||
|
- -march=armv6-m # NOTE: This is essential! It tells the compiler which target architecture to compile for!!!
|
||||||
:unity:
|
:unity:
|
||||||
:defines:
|
:defines:
|
||||||
- UNITY_EXCLUDE_FLOAT
|
- UNITY_EXCLUDE_FLOAT
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#include "algorithms.h"
|
#include "algorithms.h"
|
||||||
|
|
||||||
bool algorithms_c_is_loaded() { return true; }
|
int algorithms_c_is_loaded() { return 1; }
|
||||||
|
|
|
@ -7,6 +7,6 @@
|
||||||
|
|
||||||
#include "stdbool.h"
|
#include "stdbool.h"
|
||||||
|
|
||||||
extern bool algorithms_c_is_loaded();
|
extern int algorithms_c_is_loaded();
|
||||||
|
|
||||||
#endif // ALGORITHMS_H
|
#endif // ALGORITHMS_H
|
||||||
|
|
|
@ -7,4 +7,6 @@ void setUp(void) {}
|
||||||
|
|
||||||
void tearDown(void) {}
|
void tearDown(void) {}
|
||||||
|
|
||||||
void test_algorithms_loaded(void) { TEST_ASSERT(algorithms_c_is_loaded()); }
|
void test_algorithms_loaded(void) {
|
||||||
|
TEST_ASSERT(algorithms_c_is_loaded() == 1);
|
||||||
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
use core::ffi::c_void;
|
use core::ffi::c_void;
|
||||||
|
|
||||||
unsafe extern "C" {
|
unsafe extern "C" {
|
||||||
fn algorithms_c_is_loaded() -> bool;
|
fn algorithms_c_is_loaded() -> i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn ffi_is_loaded() -> bool {
|
pub fn ffi_is_loaded() -> bool {
|
||||||
unsafe { algorithms_c_is_loaded() }
|
unsafe { algorithms_c_is_loaded() == 1 }
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
43
src/main.rs
43
src/main.rs
|
@ -3,12 +3,12 @@
|
||||||
|
|
||||||
use algorithms::crc::{Crc, Crc32 as Crc32Rust, ffi::Crc32 as Crc32C};
|
use algorithms::crc::{Crc, Crc32 as Crc32Rust, ffi::Crc32 as Crc32C};
|
||||||
|
|
||||||
use defmt::{debug, info};
|
use defmt::{debug, error, info};
|
||||||
use panic_probe as _;
|
use panic_probe as _;
|
||||||
|
|
||||||
use defmt_rtt as _; // global logger
|
use defmt_rtt as _; // global logger
|
||||||
|
|
||||||
use cortex_m_rt::entry;
|
use cortex_m_rt::{ExceptionFrame, entry};
|
||||||
use hal::{pac, prelude::*, rcc::Config};
|
use hal::{pac, prelude::*, rcc::Config};
|
||||||
|
|
||||||
// same panicking *behavior* as `panic-probe` but doesn't print a panic message
|
// same panicking *behavior* as `panic-probe` but doesn't print a panic message
|
||||||
|
@ -39,6 +39,7 @@ fn main() -> ! {
|
||||||
let mut delay = cp.SYST.delay(rcc.clocks);
|
let mut delay = cp.SYST.delay(rcc.clocks);
|
||||||
|
|
||||||
// BUG: this program seems to completely halt whenever a C function is called.
|
// BUG: this program seems to completely halt whenever a C function is called.
|
||||||
|
debug!("Asserting that libalgorithms is correctly loaded");
|
||||||
assert!(algorithms::ffi_is_loaded(), "ffi is not loaded?");
|
assert!(algorithms::ffi_is_loaded(), "ffi is not loaded?");
|
||||||
|
|
||||||
let mut crc;
|
let mut crc;
|
||||||
|
@ -61,3 +62,41 @@ fn main() -> ! {
|
||||||
delay.delay_ms(500_u16);
|
delay.delay_ms(500_u16);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn display_ef(ef: &ExceptionFrame) {
|
||||||
|
struct Wrapper(ExceptionFrame);
|
||||||
|
impl defmt::Format for Wrapper {
|
||||||
|
fn format(&self, fmt: defmt::Formatter) {
|
||||||
|
defmt::write!(
|
||||||
|
fmt,
|
||||||
|
"ExceptionFrame(\n\tr0: {:08x}\n\tr1: {:08x}\n\tr2: {:08x}\n\tr3: {:08x}\n\tr12: {:08x}\n\tlr: {:08x}\n\tpc: {:08x}\n\txpsr: {:08x}\n)",
|
||||||
|
self.0.r0(),
|
||||||
|
self.0.r1(),
|
||||||
|
self.0.r2(),
|
||||||
|
self.0.r3(),
|
||||||
|
self.0.r12(),
|
||||||
|
self.0.lr(),
|
||||||
|
self.0.pc(),
|
||||||
|
self.0.xpsr()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
error!("HardFault: Exception occured!");
|
||||||
|
error!("Exception occured at: {:08x}", ef.pc());
|
||||||
|
error!("XSPR: {:032b}", ef.xpsr());
|
||||||
|
error!("LR: {:08x}", ef.lr());
|
||||||
|
|
||||||
|
error!("HardFault: {:#?}", Wrapper(*ef))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(unreachable_code)]
|
||||||
|
#[cortex_m_rt::exception(trampoline = true)]
|
||||||
|
unsafe fn HardFault(ef: &ExceptionFrame) -> ! {
|
||||||
|
static mut EXCEPTION: Option<ExceptionFrame> = None;
|
||||||
|
unsafe { EXCEPTION = Some(*ef) };
|
||||||
|
|
||||||
|
display_ef(ef);
|
||||||
|
#[allow(clippy::empty_loop)]
|
||||||
|
loop {}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue