一般来说,MPLAB X、XC8和C。跨函数和源文件使用变量

一般来说,MPLAB X、XC8和C。跨函数和源文件使用变量,c,function,variables,pic,mplab,C,Function,Variables,Pic,Mplab,我很难将变量传递给函数——尤其是不在同一源文件中的函数。我怀疑这两个问题实际上是同一个问题。我肯定这是在互联网上的某个地方,但我已经做了很多搜索,现在我更困惑了。主要是我需要有人给我一些我应该阅读/搜索的方向 问题1: 假设我有一个名为main.c的源文件。在#includes和#defines之后,我声明了一个变量 int count; 然后我声明一个函数 void increment () { count++; } 在函数main()中;我调用函数increment();,然后更新POR

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

问题1:

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

int count;
然后我声明一个函数

void increment () {
count++;
}
在函数main()中;我调用函数increment();,然后更新PORTA以在LED中显示它。在main()之前,“count”和PORTA都被赋值为零;跑步

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

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

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

问题2:常见问题的示例

假设我正在使用MLA设备库并加载HID_鼠标的演示材料。虽然它有一千万个文件夹,源文件和头文件,包括彼此,我能够编辑一些子程序,使它做我的出价。但是,我需要声明一个在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中声明了

我不确定在这两个地方宣布它的结果,但有些事情告诉我这是个坏主意

非常感谢您抽出时间。我从这个社区学到了很多东西!

-GB

您缺少的是所谓的“范围”。它不是XC8特有的,任何C语言书籍都会对您有所帮助

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

volatile int foo = 0x00;
如果您需要从其他文件访问它(初学者应避免),请在此文件中声明它为“extern”(或包括):


对于后面的任何人来说,问题1中的代码实际上是工作代码。我的错误是不小心将TRISC初始化为1而不是0xff;这意味着我试图在输出上运行一个按钮。我应该更清楚这一点

但是,在其他情况下,由于在main()中声明变量,我遇到了这个问题;而不是在函数外部。这意味着我试图在一个没有声明它的函数内部修改局部变量-这给了我空值和垃圾。Pedwards正确地识别出我在全局变量和局部变量方面有问题;“scope”是一个非常有用的关键字


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

尝试将您的问题限制为一种语言和一个示例。问题1似乎是您理解本地和本地编译器之间差异的问题全局变量。看看这个问题:学习C如何?这在任何一本书中都有论述。谢谢@pedwards,这非常有帮助。我将来也会限制我的问题。亲爱的上帝,谢谢你。我所要做的就是谷歌“范围”,这一切都是有意义的。另外,添加“volatile”“我的声明是我需要做的一切,让我的中断工作。
volatile int foo = 0x00;
extern int foo;