代码之家  ›  专栏  ›  技术社区  ›  GB Ward

通常为MPLAB X、XC8和C。跨函数和源文件使用变量

  •  1
  • GB Ward  · 技术社区  · 10 年前

    我很难将变量传递给函数——尤其是不在同一源文件中的函数。我怀疑这两个问题实际上是同一个问题。我确信这是在互联网上的某个地方,但我已经做了很多搜索,现在我更加困惑。大多数情况下,我需要有人给我一些方向,告诉我应该阅读/搜索什么。

    问题1:

    假设我有一个名为main.c的源文件。在#includes和#defines之后,我声明了一个变量

    int count;
    

    然后我声明一个函数

    void increment () {
    count++;
    }
    

    在函数main()内;我调用函数increment();,然后更新PORTA以以LED显示。“count”和PORTA都在main()之前赋值为零;跑。

    void main () {
         increment();
         PORTA = count;
    }
    

    问题是“计数”似乎有两种版本。如果运行此程序,PORTA将永远不会点亮LED。但是,如果“PORTA=count;”在函数内部移动时,它将正确地递增。此外,所有硬件写入(Port、tris等)在函数内部都能正常工作,但我认为我全局声明的变量却不能。因此,我假设编译器正在为函数调用复制“count”,并在返回时忘记它。

    我通常只从函数返回一个值来解决这个问题,但是PIC的中断例程不能返回值,我必须使用中断。

    我该怎么做?我肯定错过了一个重要的概念!

    问题2:常见问题示例

    假设我正在使用MLA设备库,并加载HID_Mouse的演示材料。尽管它有1000万个文件夹,源文件和头文件相互包含,但我能够编辑一些子程序,并使其符合我的要求。然而,我需要声明一个同时在main中使用的变量。c并由app_device_mouse.c中的函数修改。我如何声明这个东西,以便它全局读/写,但我不会从编译器得到声明错误?

    ../src/app_device_mouse.c:306: error: (192) undefined identifier "position_x"
    

    i、 e“您没有在app_device_mouse.c中声明'int position_x',尽管您在main.c中声明了

    我不确定在这两个地方都声明它的结果,但有件事告诉我这是个坏主意。

    非常感谢您提前抽出时间。我从这个社区学到了很多!
    -国标

    2 回复  |  直到 10 年前
        1
  •  1
  •   GB Ward    10 年前

    对于任何落后的人来说,问题1中的代码实际上是有效的代码。我的错误是不小心将TRISC初始化为1而不是0xff;这意味着我试图关闭一个输出按钮。我应该比那更清楚。

    然而,在其他场合,我通过在main()中声明变量而遇到了这个问题;而不是在功能之外。这意味着我试图修改一个没有声明它的函数内部的局部变量——这给了我空值和垃圾。Pedwards正确地识别出我在处理全局变量和局部变量时遇到了问题;“范围”是一个非常有用的关键词。

    ISR修改变量时,必须将变量声明为volatile。在Oled发表评论后,我在XC8编译器手册第169页上找到了这些信息。

        2
  •  0
  •   Oleg Mazurov    10 年前

    你缺少的是所谓的“范围”。这并不是XC8特有的,任何C书都会帮助您。

    PIC中断不会因某种原因获取/返回任何内容。在定义ISR的同一文件中定义一个全局,并读取/更改该全局。如果要从ISR写入,请将其声明为“volatile”:

    volatile int foo = 0x00;
    

    如果您需要从另一个文件访问它(初学者应避免这样做),请在此文件中声明它为“extern”(或include):

    extern int foo;