OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2838|回复: 7

关于gpio初始化的问题 ,关于C语言的困扰

[复制链接]

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-5-21
在线时间
42 小时
发表于 2019-6-11 11:10:51 | 显示全部楼层 |阅读模式
GPIO_InitTypeDef  GPIO_sss;
GPIO_sss.GPIO_Mode= GPIO_Mode_Out_PP;//设置输出模式
GPIO_sss.GPIO_Pin=GPIO_Pin_8;//输出引脚
GPIO_sss.GPIO_Speed=GPIO_Speed_50MHz;//输出速度
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOD,ENABLE);//初始化GPIOA GPIOB时钟
GPIO_Init(GPIOA,&GPIO_sss);

定义了一个结构体变量 GPIO-sss,为什么 在初始化的时候要用一个取地址附&

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-6-11 12:26:20 | 显示全部楼层
本帖最后由 edmund1234 于 2019-6-11 12:34 编辑

函数的参数经常只传地址不传实体, 是因为直接传实体会浪费很多资源。
直接传结构体,参数总长度大于4个Word就需要入栈, 这样内存消耗大, 又浪费CPU的资源。
如果只传指针就不需要入栈。
回复 支持 反对

使用道具 举报

0

主题

143

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2019-5-30
在线时间
4 小时
发表于 2019-6-11 13:11:27 | 显示全部楼层
帮忙顶顶
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-5-21
在线时间
42 小时
 楼主| 发表于 2019-6-11 16:16:50 | 显示全部楼层
edmund1234 发表于 2019-6-11 12:26
函数的参数经常只传地址不传实体, 是因为直接传实体会浪费很多资源。
直接传结构体,参数总长度大于4个Wo ...

就是采用结构体指针的形式 ,可以快速的访问结构体的地址 进行对变量的取值
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-6-11 16:58:07 | 显示全部楼层
本帖最后由 edmund1234 于 2019-6-11 16:59 编辑
程浩俊 发表于 2019-6-11 16:16
就是采用结构体指针的形式 ,可以快速的访问结构体的地址 进行对变量的取值

访问与取值没分别的
分别在调用函数前加载参数的部分
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2019-5-6
在线时间
13 小时
发表于 2019-6-11 17:04:34 | 显示全部楼层
定义了一个结构体变量 GPIO-sss,为什么 在初始化的时候要用一个取地址附&
不用&符说明是传值方法,无法返回你要初始化的变量初始值.
回复 支持 反对

使用道具 举报

7

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2019-5-21
在线时间
42 小时
 楼主| 发表于 2019-6-11 19:01:16 | 显示全部楼层
edmund1234 发表于 2019-6-11 16:58
访问与取值没分别的
分别在调用函数前加载参数的部分

感觉越说越不明白了 。。。。谢谢老哥
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-6-11 22:45:26 | 显示全部楼层
程浩俊 发表于 2019-6-11 19:01
感觉越说越不明白了 。。。。谢谢老哥

要说明这个就要能理解调用函数时的过程, 需要懂汇编, 勉强用C语言表达用不用指针传参的分别是这样的
struct {
        int a[4];
        int b[4];
}ABC;

fun(ABC)  这是调用参数为实体的过程
   r0=a[0]; r1=a[1]; r2=a[2]; r3=a[3];
   push  b[0];  push  b[1]; push  b[2]; push  b[3];   //入栈
   fun()                                                                              

fun(&ABC)   这是调用参数为指针的过程
   r0 = &ABC
   fun()
  
用C语言不能完全准确的表达, 但大慨是这个过程, 对比分别就应该理解为什么要以指针作为参数而不传实体, 特别是你的结构体很大的时候。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 09:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表