我正在使用---------------------------------------------------------------------------
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
答案 0 :(得分:0)
上周我遇到了同样的问题.. 这似乎是调试固件和您的代码都访问同一位置的问题。如果您在尝试使用代码读取的同一 Flash 位置有一个活动断点,则您的代码最终会从该位置读取 0x8B。如果您删除或停用所有断点,则会正确读取该位置..
答案 1 :(得分:0)
除了我之前的答案(见上文或下文..我无法编辑那个..活动断点用 BREAK 指令(操作码 0x8B)替换该特定闪存位置的现有指令,所以当那个从应用程序代码中读取内存位置,结果为 0x8B。 因此,这并不是真正的“问题”,而是在 STM8S 上的 SWIM 调试固件中实现的软件断点的限制。