stm32的地址分配方面的问题求解,恳请大神细心指针,不胜感激~~~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了stm32的地址分配方面的问题求解,恳请大神细心指针,不胜感激~~~相关的知识,希望对你有一定的参考价值。

小弟最近对stm32的地址分配理解不了,很是疑惑,请大神指点~~~(我尽量把问题描述清楚哈)
如下为什么STM32官方库文件中摘取的一部分
问题1:STM32的中地址是按Bit,Byte,还是Word作为单位的? 例如0x8000000,它后面的单位是什么?
问题2:为什么有的地址是按照uint16_t,有的是按照uint32_t,这个是为什么?
问题3:如GPIOC和DMA1_Channel1,它们其实都是一个指针,按我的理解,在32位系统下,所有的指针都是占用4个Byte,那干嘛还需要区分 ((GPIO_TypeDef *) 类型指针和 ((DMA_Channel_TypeDef *)指针?
#define GPIO_Pin_0 ((uint16_t)0x0001) /*!< Pin 0 selected */
#define GPIO_Pin_1 ((uint16_t)0x0002) /*!< Pin 1 selected */
#define GPIO_Pin_2 ((uint16_t)0x0004) /*!< Pin 2 selected */

#define FLASH_BASE ((uint32_t)0x08000000) /*!< FLASH base address in the alias region */
#define SRAM_BASE ((uint32_t)0x20000000) /*!< SRAM base address in the alias region */
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */

#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define DMA1_Channel1 ((DMA_Channel_TypeDef *) DMA1_Channel1_BASE)

1 地址单位一定是字节

2 表示在这个地址的数据宽度
3 指针的区分类型 ,是给你看的 ,对于cpu来说只有地址,偏移,数据大小的区别 ,对人来说才有意义, 通过定义不同的类型可以让指针对一个确定的基址、 偏移量、数据大小
比如 u32 * p1=(u32 *)0x20000000; u8 * p2=(u8 *)0x20000000;
*p1=0x ff ff ff ff;
*p2=0; +0 +1 +2 +3
此时0x20000000处的四个字节是 0x00 0xff 0xff 0xff追问

非常感谢大神你的回答
问题1:地址的单位是字节,1Byte=8Bit,那对于stm32来说,假定A是stm32的一个寄存器,它是32位的,那是不是这个寄存器就需要4个Byte的地址来表示?小弟这样理解正确吗?
问题2:请问大神:例如A的地址是uint16_6类型,那是不是代表A的数据类型就是16位的?uint32_t依次类推?
问题3:这个问题小弟搞明白了,谢谢哈

追答

问题1:一个32位的寄存器占用从xx地址开始的4个字节,这样描述可能更好理解, 这样描述某个存储变量也是可以的

问题2:应该说是该数据类型的大小是多少字节(一般不使用位来描述数据类型的大小)建议参考c语言的关键字 sizeof 它的结果就是字节

参考技术A 关注这个问题

java在内存分配方面的效率比较

【中文标题】java在内存分配方面的效率比较【英文标题】:java efficiency comparison in terms of memory allocation 【发布时间】:2013-04-03 07:15:30 【问题描述】:

这可能是一个重复的问题,但我找不到我正在搜索的内容。如果存在,抱歉重复。

我想知道以下部分代码在内存分配方面是否相同。

//first
int n = some_number;
for(int i = 0; i < n; i++)
    for(int j = 0; j < n; j++)
        int a = something;
    


//second
int i, j, a;
for(i = 0; i < n; i++)
    for(j = 0; j < n; j++)
        a = something;
    

我想知道,如果java在第一个代码中分配变量an^2次jn次,或者两者都只分配一次,如第二个代码。

我在 java 中尝试了这几次,但结果不一致,第一次是 8 秒,第二次是 9 秒,在另一次试验中相反。所以,我想确定它们是否相等,

谢谢

【问题讨论】:

【参考方案1】:

查看是否存在差异的一种简单方法是检查字节码。

第一个版本编译为:

  public static void f();
    Code:
       0: bipush        100
       2: istore_0      
       3: iconst_0      
       4: istore_1      
       5: goto          26
       8: iconst_0      
       9: istore_2      
      10: goto          18
      13: iconst_3      
      14: istore_3      
      15: iinc          2, 1
      18: iload_2       
      19: iload_0       
      20: if_icmplt     13
      23: iinc          1, 1
      26: iload_1       
      27: iload_0       
      28: if_icmplt     8
      31: return        

而第二个编译为:

  public static void g();
    Code:
       0: bipush        100
       2: istore_3      
       3: iconst_0      
       4: istore_0      
       5: goto          26
       8: iconst_0      
       9: istore_1      
      10: goto          18
      13: iconst_3      
      14: istore_2      
      15: iinc          1, 1
      18: iload_1       
      19: iload_3       
      20: if_icmplt     13
      23: iinc          0, 1
      26: iload_0       
      27: iload_3       
      28: if_icmplt     8
      31: return        

如果你仔细比较它们,你会发现它们本质上是相同的。

从风格上讲,我认为最好在尽可能接近首次使用时声明变量。考虑到这一点,我会选择第一个版本而不是第二个版本。

【讨论】:

很好的建议。我将添加如何获取字节码反汇编:javap -c package.Class

以上是关于stm32的地址分配方面的问题求解,恳请大神细心指针,不胜感激~~~的主要内容,如果未能解决你的问题,请参考以下文章

java在内存分配方面的效率比较

STM32F407宏定义定义的地址的疑惑?

内存分配方面的分页

stm32串口发送正常,接受只能收到一个字符,求解,急

怎么解决用stm32 发射2m方波,求大神!!!!!

怎么在keil5里面添加stm32的库,求大神给详细步骤,谢谢