【发布时间】:2016-10-16 18:06:02
【问题描述】:
我正在编写一个 MCU 应用程序,该应用程序从 UART 加载串行数据并将其写入闪存。我在“将传入数据存储在空缓冲区中,而我们清空整个缓冲区”(又名“缓冲区切换”)方法中使用了两个缓冲区。 UART 接收的写入方式是“存储传入数据”应直接存储到缓冲区的正确字节位置。缓冲区长 512 字节,因为每个闪存扇区长 512 字节。
我想使用索引:一个指示正在加载哪个缓冲区的索引;具有每个缓冲区第一个字节的地址的双索引数组;和一个索引,该索引在传入字节的实际目标存储地址的缓冲区 (0-511) 内具有偏移量。该代码旨在使用“哪个缓冲区?” index 以获取要加载的缓冲区的地址,然后将缓冲区内的偏移量添加到该地址中,这应该就是所需要的。我正在尝试缩短路径长度,以尽一切可能避免缓冲区溢出。
但是,我在 C 方面有点不合时宜。虽然检查两个 aFlashBuffah 显示了两个缓冲区 bFlashBuffah0[512] 和 bFlashBuffah1[512] 的正确地址,但似乎下面的代码导致指针指向缓冲区 (aFlashBuffahInUse) 为零,因此表达式 *(aFlashBuffahInUse+hBuffahByteInUse) 是假的。
uint32_t fFlashEndingAddress = 0x2765A6;
uint8_t iBuffahInUse = 0;
uint16_t hBuffahByteInUse = 0;
uint16_t *aFlashBuffahInUse;
uint16_t *aFlashBuffahs[2];
uint8_t bFlashBuffah0[512];
uint8_t bFlashBuffah1[512];
aFlashBuffahs[0] = &bFlashBuffah0;
aFlashBuffahs[1] = &bFlashBuffah1;
iBuffahInUse = 0;
aFlashBuffahInUse = aFlashBuffahs[iBuffahInUse];
hBuffahByteInUse = 0;
for (i = 0; i < fFlashEndingAddress; i++) {
*(aFlashBuffahInUse+hBuffahByteInUse) = usart_getchar(UASRT_SERIAL);
如果有人能指出我犯错的地方,我将不胜感激。蒂亚!
【问题讨论】:
-
在询问运行时问题时,发布干净编译、简短且仍然显示问题的代码。如果问题与数据有关,请发布实际输入数据(合理样本)和实际输出数据(合理样本)。
-
我不知道你的循环
for (i = 0; i < fFlashEndingAddress; i++)是如何工作的,除非你每 512 个字节交换一次缓冲区。 -
你甚至没有使用
i来索引任何东西,无论循环做什么,它都会将每个传入的字节写入同一个地方。 -
典型术语不是
buffer toggling,而是double buffering