在擦除和写入闪存的程序中,我不理解这些行
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做的那样。
答案 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分配用于存储类型和当前状态附闪光灯。