【问题标题】:On a PIC32, how are arrays of INT16's allocated in memory?在 PIC32 上,INT16 的数组是如何在内存中分配的?
【发布时间】:2015-04-22 20:56:13
【问题描述】:

基本上,我在 32 位闪存中顺序写入了一堆 2 字节整数。如何以 int16 数组的形式访问它们?

我不考虑单词边界而编写了数组。但如果需要,我可以添加填充,以便数组从单词边界开始。

这是我写入闪存的代码(基本上它只是将每 4 个字节组合成一个字,然后将该字写入闪存):

   for(flash_page = 0; flash_page < protocol_pages; flash_page++){ //loop through all the pages
       for(flash_address = 0; flash_address < NUMBER_OF_INSTRUCTIONS_IN_PAGE; flash_address++){ //loop through all the words in the page
           for (byte_address = 0; byte_address < 4; byte_address++){ //loop through the byte in each word
               buffer_check();
               flash_word += buffer[buffer_index] << (8*(3-byte_address));
               buffer_index++;
               bytes_written++;
               if(bytes_written >= data_length)
                   break;
           }
           ///////Write word here
           NVMWriteWord((void*) &(proto_data_addr[flash_page][flash_address]), flash_word);
           flash_word = 0;
           if(bytes_written >= data_length)
                break;
       }
       if(bytes_written >= data_length)
            break;
   }

混合到这个字节块中的是首尾相连的 2 字节整数序列。将它们写入闪存后,如何将它们作为数组访问?我是否必须填充数组以便每个单词中有 2 个 int16?

谢谢!

【问题讨论】:

  • 你用的是什么编译器?
  • buffer 是什么类型?如果uint8_t buffer[],则&lt;&lt; (8*(3-byte_address)); 可能是个问题,具体取决于int 的大小。
  • 我在 MPLAB X 中使用 xc32。缓冲区是 BYTE 类型的数组,但闪存字是 32 位,因此即使最大位移为 24 也应该没问题。
  • 注意:flash_word 类型与buffer[buffer_index] &lt;&lt; (8*(3-byte_address)) 无关。如果移位 24 可以,则取决于 int 大小,而不是 flash_word 大小。 IAC、xc32 可能使用 32 位 int 并且移位不是问题。

标签: c pointers embedded pic pic32


【解决方案1】:

好的,我明白了!我创建了一些不同类型的 const 数组,并使用调试器在内存中查看了它们。事实证明......它们都只是像你期望的那样按顺序排列。没有填充。

诀窍是:每个 BYTE 都有自己的地址,而不是每个字(32 位)。因此,在将一堆 int16 写入 flash 之后,您可以使用指针正常访问它们。

我误以为INT16的array[a]等价于*(array+a),但它知道数据大小,所以实际上等价于*(array+(a*VARIABLE_SIZE))

【讨论】:

  • 你的解释很可怕,因为你似乎假设 C 的指针运算是以字节为单位完成的,这是不正确的。
  • 好吧,它只需要在一台设备上工作(图片32)。而且它似乎是以字节为单位完成的。
  • 在 C 中,如果你有INT16 array[10];,那么表达式array[1] = 3;*(array + 1) = 3; 完全相同。该添加以INT16 为单位发生,无论它的实际字节大小可能是多少。
  • 谢谢,我明白你的意思了。地址是字节,但是执行“指针+1”会增加地址,无论指针类型的大小是多少,不一定是1。
猜你喜欢
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
相关资源
最近更新 更多