从转储挥发性指针硬件寄存器

说我有映射到组到,可以在任何时候改变硬件寄存器的结构。

例如,

typedef struct { int register1; char register2; ... (varying sizes, etc) ... int registerX; } registers_t;

而我定义为暂存器挥发性指针的基础

例如,

#define regs (* (volatile registers_t *) ADDR_OF_REGS)

我想在特定的时间来转储寄存器和关闭其保存到一个数组存储寄存器的历史。

例如,

registers_t register_history[5];

我明白的memcpy不能/不会让铸造挥发性*为const *,因为它是不确定的行为。

例如,我试图做类似如下:

memcpy(&register_history[0], regs, sizeof(registers_t));

有没有什么办法寄存器内存复制没有明确反跳和保存每个寄存器?

谢谢你的帮助。

编辑:

因为我没有足够的信誉来回答我的问题,直到我8小时后贴的问题,我会在这里发布答案现在:

因为我知道,当我试图捕捉到的数据寄存器将不会改变,我可以投的ADDR_OF_REGS为void *和使用的memcpy。

例如,

memcpy(&register_history[0], (void *)ADDR_OF_REGS, sizeof(registers_t));

--------------解决方案-------------

使用跨编译域结构是有风险的业务。 在内存/寄存器等是指向一个“编译域”。

第二,是的memcpy只是要顺序读取寄存器和复制它们按顺序,有试图与你不能只是做自己的结构和memcpy这样做没有什么神奇。 例如,如果这些都是32位寄存器和对齐你可以做的比memcpy的好....只是自己做。

要复制例如8 32位寄存器:

.globl myregcopy
myregcopy:
push {r4,r5}
ldmia r0!,{r2-r5}
stmia r1!,{r2-r5}
ldmia r0!,{r2-r5}
stmia r1!,{r2-r5}
pop {r4,r5}
bx lr

把它与

myregcopy(base_add_of_registers,base_add_of_destination_ram);

memcpy的换档从字节到半字到词,然后游轮往往采用四个字每个指令然后转移回落到一个半字和字节停止之前(如果需要,但校验码是存在的),这样​​你就会出来执行memcpy和习惯必须处理同的方式获得这些编译器的问题。

你要验证与硬件乡亲,一个四字LDM或STM或LDRD / STRD可以/将64位transctions不是32位的交易,如果你的核心具有64位总线。 如果寄存器硬件不说明该寄存器与64位交易对访问你可能只得到解码的两个寄存器和垃圾的32位总线上的。 所以你需要知道这是一个具有32位总线或64位总线,如果你是捕捉I / O硬件也好,处理正确的交易核心。 如果它不更改代码以这样的事:

.globl wordcopy
wordcopy:
ldr r3,[r0],#4
str r3,[r0],#4
subs r2,r2,#1
bne wordcopy
bx lr

调用

wordcopy(regbase,destmembase,numregs);

不一定比memcpy的速度,可能会更快,相同或慢一点,如果你要使用此功能,因为你不能处理64位的寄存器中读取针对32位寄存器,然后所以没有速度对比,你不能使用mempcy,这是因为好得不能再好。

不管你是什么仍负责该寄存器惯于变化的假设。 这也是一个危险的假设,因为你不知道这个副本多久要采取除非你采取一些额外的措施。 甚则复印时间可能有所不同。

分类:C# 时间:2015-03-15 人气:0
本文关键词:
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.546 (s). 10 q(s)