硬汉嵌入式论坛

 找回密码
 立即注册
查看: 343|回复: 3
收起左侧

关于cube,hal库文件包含关系的疑问?

[复制链接]

8

主题

128

回帖

152

积分

初级会员

积分
152
发表于 2024-2-22 22:09:04 | 显示全部楼层 |阅读模式
我一直以来的理解, c工程中,文件的包含(#include)顺序, 理想状态下, 应该是单向的,

每一层的文件, 被更外层的文件包含和引用, A文件包含B, 那么B就不应该反过来包含A文件
比如硬件驱动文件, 被用户应用文件包含和调用,  那么硬件驱动文件, 就不应该再去包含用户应用的头文件了.
如果硬件驱动层需要调用用户的函数 比如硬件驱动的中断函数执行用户代码 , 就应该使用回调函数方式实现.

但是实际情况是 :使用cube生成的hal库工程, 硬件层的每个文件都在包含main.h.   
比如cube生成的adc.c文件,他就在adc.h中包含了main.h, 其中实现了硬件的初始化, MX_ADC1_Init   然后在main.c中,调用了此函数. 这样就成为了双向调用.
在后续编写自己的应用代码My_app.c, 其中又包含adc相关的文件和功能, 然后main函数包含和调用我的应用代码, 这种双向的包含关系就导致了编译出错.

所以,是文件包含的用法不是我理解的这样, 还是cube生成的代码, 对于文件包含的处理并不完善?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2024-2-23 11:14:28 | 显示全部楼层
HAL库推出后,MDK AC5编译非常慢,一直没有深究这个是什么地方造成的。

楼主提到这个链接关系问题,应该就是一方面。
回复

使用道具 举报

11

主题

36

回帖

69

积分

初级会员

积分
69
发表于 2024-2-23 11:31:19 | 显示全部楼层
初学的时候我也弄不清楚 后来仔细看了下

所有生成的.h文件都有一个宏定义 判断已经有这个宏了就不再调用这个.h文件
所以理论上.h即便是套娃也不会出现重复定义了,就是我自己写.h也现在也加上一个唯一的宏定义了
2.png


回复

使用道具 举报

8

主题

128

回帖

152

积分

初级会员

积分
152
 楼主| 发表于 2024-2-23 12:06:56 | 显示全部楼层
LinY 发表于 2024-2-23 11:31
初学的时候我也弄不清楚 后来仔细看了下

所有生成的.h文件都有一个宏定义 判断已经有这个宏了就不再调用 ...

这个仅仅是一方面, 双向包含和引用, 会导致编译顺序出问题, 这种问题可能不会马上出现, 随着代码和函数越来越多, 就会出现莫名其妙的报错, 也不利于代码的管理
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 04:22 , Processed in 0.161648 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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