在擦除和写入闪存之前添加闪存

时间:2018-06-04 14:31:38

标签: c embedded bootloader

在擦除和写入闪存的程序中,我不理解这些行

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为flash分配任何空间,就像我们为RAM做的那样。

2 个答案:

答案 0 :(得分:1)

这一行

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

是RAM中某处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;
    ...
}

答案 1 :(得分:1)

有问题的代码扩展了GDB,允许它使用各种JTAG或串行线接口来编程和调试某些ARM设备。识别连接的设备闪存设备是一项耗时且具有破坏性(无法运行设备代码)的任务,因此您只需要执行一次,因此本地RAM分配用于存储类型和当前状态附闪光灯。