取消引用指针不会在内存地址中返回真实值

时间:2019-07-18 18:31:42

标签: c pointers memory embedded

我正在使用--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-5-d3bbc28ef9bf> in <module> 3 Fx_ = zeros_aligned(x.shape, dtype='complex64') 4 ----> 5 fft = FFTW(fx_, Fx_, direction='FFTW_FORWARD', threads=1) pyfftw/pyfftw.pyx in pyfftw.pyfftw.FFTW.__cinit__() ValueError: Invalid shapes: The input array and output array are invalid complementary shapes for their dtypes. IDE和STM8S编译器在STVD上开发嵌入式应用程序。我正在尝试逐字节读取FLASH内存以计算Cosmic C。以下是我的代码段:

CRC

直到从闪存中读取uint32_t crc32_buffer(const uint8_t *buf, uint32_t len) { uint32_t index = 0; uint32_t crc = 0xFFFFFFFF; uint32_t flashIndex = 0; uint8_t *ptr = buf; volatile uint8_t value = 0; volatile uint8_t i = 0; for (index = 0; index < len; index++) { value = *ptr; flashIndex = (crc & 0xFF) ^ value; ptr++; crc = (crc >> 8) ^ table[flashIndex]; if(bytesCntr >= 2685) { i++; } } return ~crc; } 个字节为止,代码才能正常工作。在调试会话中查看2694,请确保FLASH中的下一个字节的值为Memory。检查0C的值,确保它具有FLASH中此ptr字节的地址(为0x8B15)。但是,0C变量在取消引用value之后始终获得8B而不是0C的值。

我还试图排除不必要的变量,所以它就像这样:

ptr

但是表索引不是应该的,因为存储位置被读取为crc = (crc >> 8) ^ table[(crc & 0xFF) ^ buf[index]]; 而不是8B

我发现正确读取了地址0C之前的字节和之后的字节。仅此地址被错误地读取。

UPDATE-1

0x8B15的反汇编如下:

value = *ptr;

当读取地址LDW X, (0x11,SP) LD A, (X) LD (0x13,SP),A 上的字节时,如果我在第二条组装线处放置一个断点,然后将存储位置中的值正确读取为0x8B15。但是,如果我将断点放在第三条组装线,则会发现寄存器0C具有X(正确的地址),但是寄存器0x8B15具有A(错误的值)。

UPDATE-2

我在0x8B循环中添加了if语句以进行调试(放置断点)。我发现错误地读取保存在内存字节中的代码始终是此for语句中的代码。这段代码的反汇编总是与if有关。即使更改了代码,有问题的内存字节也始终是SP语句中的第一条指令。而且我还注意到,无论正确的值是多少,错误的读取值始终为if。这是保存在此内存位置的反汇编:

0x8B

2 个答案:

答案 0 :(得分:0)

上周我遇到了同样的问题.. 这似乎是调试固件和您的代码都访问同一位置的问题。如果您在尝试使用代码读取的同一 Flash 位置有一个活动断点,则您的代码最终会从该位置读取 0x8B。如果您删除或停用所有断点,则会正确读取该位置..

答案 1 :(得分:0)

除了我之前的答案(见上文或下文..我无法编辑那个..活动断点用 BREAK 指令(操作码 0x8B)替换该特定闪存位置的现有指令,所以当那个从应用程序代码中读取内存位置,结果为 0x8B。 因此,这并不是真正的“问题”,而是在 STM8S 上的 SWIM 调试固件中实现的软件断点的限制。