Как объявить статическую переменную в определенной области памяти в Rust? - PullRequest
2 голосов
/ 03 апреля 2019

У меня есть статическая константа, которую я хочу разместить в определенной области памяти моего MCU, и программа написана на Rust для ARM stm32m4 MCU.

В моем тестовом примере я определил переменную какнапример:

#[link_section = ".device_info"]
static DEVINFO: &'static str = "This is in the correct place no?";

В моем файле memory.x я указал:

MEMORY
{
    FLASH           : org = 0x08000000, len = 15k
    DEVICE_INFO     : org = 0x08003C00, len = 1k
    EEPROM          : org = 0x08004000, len = 16k
    ..Others
}

SECTIONS {
     .device_info :  {
       *(.device_info);
       . = ALIGN(4);
     } > DEVICE_INFO
} INSERT AFTER .text;

Это построено, но когда я проверяю свой выходной файл, я хочу найти текст "This is in the correct place no?"находится в 0x8003c00, но вместо этого, когда я ищу с этим:

arm-none-eabi-objdump  target/thumbv7em-none-eabihf/debug/binaryfile -s | rg -C4 This

Это дает в качестве вывода:

 8001b80 401b0008 2b000000 6b1b0008 15000000  @...+...k.......
 8001b90 59010000 15000000 00000000 00000000  Y...............
 8001ba0 696e6465 78206f75 74206f66 20626f75  index out of bou
 8001bb0 6e64733a 20746865 206c656e 20697320  nds: the len is
 8001bc0 54686973 20697320 696e2074 68652063  This is in the c
 8001bd0 6f727265 63742070 6c616365 206e6f3f  orrect place no?
 8001be0 4e6f2076 616c6964 20666972 6d776172  No valid firmwar
 8001bf0 65737372 632f6c69 622e7273 e01b0008  essrc/lib.rs....
 8001c00 12000000 f21b0008 0a000000 ac000000  ................

Как получить строку для хранения на 8003c00 при компиляции?Или какое-нибудь значение по этому вопросу?

В основном, в конце я хочу сохранить большую структуру в этой конкретной позиции, так как это мой загрузчик, и я хочу прочитать значение этой структуры из кода моего приложения позже.

1 Ответ

3 голосов
/ 03 апреля 2019

Значение &'static str по-прежнему является просто указателем, поэтому вы храните только адрес в разделе .device_info, а не данные, на которые он указывает. Чтобы сохранить действительное значение, вы можете использовать:

#[link_section = ".device_info"]
static DEVINFO: [u8; 32] = *b"This is in the correct place no?";
...