Добавление flash перед стиранием и записью во flash - PullRequest
0 голосов
/ 04 июня 2018

В программе для стирания и записи во флэш я не понимаю строки

struct kinetis_flash *kf = calloc(1, sizeof(*kf));
    struct target_flash *f = &kf->f;

из приведенного ниже раздела кода.И всю программу можно найти по адресу https://github.com/blacksphere/blackmagic/blob/master/src/target/kinetis.c

struct kinetis_flash {
    struct target_flash f;
    uint8_t write_len;
};

static void kl_gen_add_flash(target *t, uint32_t addr, size_t length,
                             size_t erasesize, size_t write_len)
{
    struct kinetis_flash *kf = calloc(1, sizeof(*kf));
    struct target_flash *f = &kf->f;
    f->start = addr;
    f->length = length;
    f->blocksize = erasesize;
    f->erase = kl_gen_flash_erase;
    f->write = kl_gen_flash_write;
    f->done = kl_gen_flash_done;
    f->erased = 0xff;
    kf->write_len = write_len;
    target_add_flash(t, f);
}

Было бы здорово, если бы кто-нибудь помог мне разобраться выше двух строк, заранее спасибо. Многие цели, например KL25, K22, K64, могут быть соответственно использованычто я понял из проекта.Эти две строки хранят специфичные для цели спецификации для флэш-памяти?

В общем случае нам не нужно выделять место для флэш-памяти прямо с использованием calloc или malloc, как мы делаем это для оперативной памяти.

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Данный код расширяет GDB, позволяя использовать различные интерфейсы JTAG или Serial Wire для программирования и отладки определенных устройств ARM.Идентификация подключенных устройств флэш-устройство является трудоемкой и разрушительной (поскольку не может выполнить код устройства), поэтому вы хотите сделать это только один раз, отсюда выделение локальной оперативной памяти для хранения типа и текущего состояния подключенной флэш-памяти..

0 голосов
/ 04 июня 2018

Эта строка

struct kinetis_flash *kf = calloc(1, sizeof(*kf));

- это динамическое выделение struct kinetis_flash где-то в ОЗУ.Вероятно, он используется для хранения информации об устройстве флэш-памяти, присутствующем в системе.

Эта строка

struct target_flash *f = &kf->f;

указывает f на struct target_flash - с именем f - внутри struct kinetis_flash, чтобы вы могли писать в него, используя f->some_var = ...

Таким образом, вся функция просто создает и инициализирует объект типа struct kinetis_flash

Хотя код правильный, он (IMOнемного сбивает с толку наличие переменной f, указывающей на f внутри структуры.Возможно, имя типа ptr_f будет более понятным.

Также обратите внимание, что код эквивалентен:

static void kl_gen_add_flash(target *t, uint32_t addr, size_t length,
                             size_t erasesize, size_t write_len)
{
    struct kinetis_flash *kf = calloc(1, sizeof(*kf));
    kf->f.start = addr;
    kf->f.length = length;
    ...
}
...