【问题标题】:C char array address issueC char数组地址问题
【发布时间】:2014-05-21 21:39:12
【问题描述】:

我在 C 语言中遇到了在结构中寻址 char 数组的问题。当我在数组中写入字符时,它会将它们写入字边界而不是字符边界。这是结构声明。

typedef struct RxBuffer {
    int Status;
    int ByteCount;
    int Index;
    char Data[SCI_BUFFER_LENGTH];
} RxBuffer;

这是实际编写的代码,

RxBuffer SciaRxBuffer;

char SciaRxData;
int LoopBackCrFlag;
int RxDataReady;

interrupt void scia_rx_isr()
{

// Get Rx Data and first LoopBack
SciaRxData = SciaRegs.SCIRXBUF.all;     // Read data
SciaRegs.SCITXBUF = SciaRxData;     // Send loop back Tx data

// Check to see if carriage return
if (SciaRxData == CR)
{
    // Set the loopback flag so Line-feed is transmitted
    LoopBackCrFlag = TRUE;
}

//!
//! Problem is right here.  SciaRxData is being written into
//! SciaRxBuffer.Data[SciaRxBuffer.ByteCount++] on Word
//! boundaries instead of byte boundaries.
//!

// Stuff RxBuffer & Mark as busy
SciaRxBuffer.Data[SciaRxBuffer.ByteCount++] = SciaRxData;
SciaRxBuffer.Status = RX_BUSY;

if (SciaRxData == CR)
{
    SciaRxBuffer.Status = RX_READY;
    SciaRxBuffer.Index = 0;
    RxDataReady = TRUE;
}


// Clear Overflow and interrupt flags
SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;   // Clear Overflow flag
SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;   // Clear Interrupt flag

// Issue the PIE ack
PieCtrlRegs.PIEACK.all|=0x100;

}

欢迎任何帮助

最好的问候, 史蒂夫·曼斯菲尔德

【问题讨论】:

  • 那是什么架构?是CHAR_BIT 8 吗?
  • “写在单词边界上”是什么意思?插入的字符是您认为应该是双倍的索引,还是每个单词的高字节根本没有被修改,或者......?
  • SciaRxData = SciaRegs.SCIRXBUF.all; 看起来不像 C。什么语言?
  • 语言是 C。我正在开发 TI DSP。 SciaRegs.SCIRXBUF.all 只是一个内存映射寄存器。我正在将 Rx 数据从 SCIRXBUF 移动到 SciaRxData。字节作为字放置在数组中,即 0048 0065 006C 006C 006F 而不是 4865 6C6C 6F00。所以是的,它被放置在索引的两倍。我将数组定义为 char 数组“字符串数组”并期望 C 处理正确的索引。
  • 您是否有 char = int 的 typedef(或宏)。 sizeof(char) 说什么

标签: c arrays struct char


【解决方案1】:

感谢大家的意见。我刚刚对硬件进行了一些挖掘,发现我使用的 TI DSP 不支持字节操作。它的最小操作是一个字(2 个字节)。即使我将数组声明为 char 数组,当我写入数组时,它也会将其写入为整数。如果我想处理字节操作,我必须将第一个字符左移 8 位,然后 OR 下一个字符,然后将其写入数组。就像大家常说的那样,如果硬件出现问题,请用软件解决!

最好的问候, 史蒂夫·曼斯菲尔德

【讨论】:

    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 2011-11-24
    • 2012-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    • 2020-06-07
    相关资源
    最近更新 更多