找回密码
 立即注册
查看: 3656|回复: 5

Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数

[复制链接]
  • TA的每日心情
    开心
    2024-1-4 08:56
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    16

    主题

    711

    回帖

    2522

    积分

    超级版主

    积分
    2522
    发表于 2023-4-21 22:08:02 | 显示全部楼层 |阅读模式
    在多文件项目的源文件中声明并使用外部变量和外部函数-Keil小技巧
    在Keil环境下开发比较大的项目时,往往需要在项目中加入多个源文件
    而不同源文件内,可能会有一些变量和函数是开放为其它源文件使用的
    但默认情况下,在源文件内部定义的变量和函数只在本源文件可见(可使用)
    如果需要跨源文件使用则需要遵循一定的规则进行定义和声明

    对于需要跨源文件访问变量:
    1、变量必须定义为全局变量
         所谓全局变量就是在函数外部定义,在函数内部定义的变量为局部变量
         由于局部变量的作用域仅在定义的函数内部,且生命周期在函数返回时就结束了
         所以要使变量能跨源文件访问,变量必须定义为全局变量
    2、变量必须定义为非静态变量
         使用static关键字定义的变量为静态变量,静态变量作用域仅为本源文件,外部源文件不可访问。
         所以要使变量能跨源文件访问,变量必须定义为非静态变量,即定义时不要使用static关键字
          Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-1.png
    3、不同的源文件中不可定义名称相同的全局变量
         如果在不同源文件中定义名称相同的全局变量,编译器会如下错误提示
          Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-2.png
    4、在需要使用外部变量的源文件内使用extern声明变量
          Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-3.png
         如果需要在多个源文件中使用同一个外部变量,可将上面的外部声明语句
         放在.h文件中,在需要使用这个变量的源文件中include一下这个头文件即可

    同样的,若需要跨源文件调用外部函数:
    1、函数必须定义为非静态函数
         使用static关键字定义的函数为静态函数,静态函数作用域仅为本源文件,外部源文件不可访问。
         所以要使函数能跨源文件访问,必须定义为非静态函数,即定义函数时不要使用static关键字
          Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-4.png
    2、不同的源文件中不可定义名称相同的非静态函数
         如果在不同源文件中定义名称相同的非静态函数时,编译器会如下错误提示
          Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-1.png
    3、在需要调用外部函数的源文件内直接声明一下即可
         对于外部函数声明,是否使用extern关键字,编译时都可通过
          Keil小技巧-在多文件项目的源文件中声明并使用外部变量和外部函数-6.png
         如果需要在多个源文件中使用同一个外部函数,可将上面的外部声明语句
         放在.h文件中,在需要调用这个函数的源文件中include一下这个头文件即可

    声明并使用外部变量和外部函数.zip

    47.51 KB, 下载次数: 109

    回复 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9234

    回帖

    1万

    积分

    管理员

    积分
    13942
    发表于 2023-5-2 09:46:32 | 显示全部楼层
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    无聊
    2 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    17

    主题

    528

    回帖

    1209

    积分

    金牌会员

    积分
    1209
    发表于 2023-5-2 08:09:51 | 显示全部楼层
    好贴好文,顶一下
    不停地学习
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    550

    主题

    9234

    回帖

    1万

    积分

    管理员

    积分
    13942
    发表于 2023-5-2 17:11:08 | 显示全部楼层
    延伸阅读:
    如何在 KEIL C251编译器中 将函数编译到指定地址 !
    第一步、直接编译,打开MAP文件,并找到函数funtest的链接名称,如下图

    第二步、在项目选项的“L251 Locate”页进行如下设置

    第三步、重新编译即可

    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 109 天

    [LV.6]常住居民II

    9

    主题

    90

    回帖

    534

    积分

    高级会员

    积分
    534
    发表于 2023-7-10 21:05:39 | 显示全部楼层
    简单的举例说就是先在变量使用的 KEY.C 文件内声明一个全局变量 bit KEY_OK   再在对应的  KEY.H内部声明引用 extern bit KEY_OK;       最后需要调用这个KEY_OK变量的 Uart.C 文件的开头声明下#include  "KEY.H" 就可以调用这个变量并对其进行操作     同样的其他文件调用只要在前面加入#include  "KEY.H"  就可以调用使用了
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    1 小时前
  • 签到天数: 133 天

    [LV.7]常住居民III

    20

    主题

    1036

    回帖

    2449

    积分

    金牌会员

    积分
    2449
    发表于 2023-12-19 17:41:58 | 显示全部楼层
    对于现代的编程思想来说,,单片机的开发已经不在是,一个人一块板一个电脑一晚上了。所以对于外部变量的使用,请给我API让我去调用。对于我的错误输入,应该给我响应的错误反馈。不能在简单的extern 一下就用。当然,,如果这些文件是你自己一个人的,那就无所谓了,无非是降低一点移植性。但如果你是给别人用,,那就会让人很抓马了。编程的思想是不是也应在在论坛里说一说了。
    参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
    技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-29 10:20 , Processed in 0.069009 second(s), 54 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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