c - 使用 MPLAB 在 C 中声明全局变量和局部变量有什么区别?

标签 c mplab

当我执行这个程序时,LED闪烁1秒,然后2秒,然后循环:

#include <htc.h>
#include <pic16f877.h>

#define _XTAL_FREQ 4e6

int count;
int check(int count);

void main(void){
    count = 0;
    TRISD = 0xBF;
    count=check(count);
    count=check(count);
}

int check(count){
    if(count == 0){
        /* blink an led for 1s */
        ++count;
    }else if(count == 1){
        /* blink an led for 2s */
        ++count;
    }
}

但是当我执行这个程序时,发生了两件事:

  1. 如果我在执行完前一个程序后立即执行此程序,LED 会闪烁 1 秒,然后熄灭 2 秒。

  2. 如果我在任何其他时间执行此程序,一旦它不是在前一个程序之后,LED 就会保持关闭状态;甚至连眼睛都不眨一下。

    #include <htc.h>
    #include <pic16f877.h>
    
    #define _XTAL_FREQ 4e6
    
    int check(int count);
    int count = 0;
    
    void main(void){
        TRISD = 0xBF;
        count=check(count);
        count=check(count);
    }
    
    int check(count){
        if(count == 0){
            /* blink an led for 1s */
            ++count;
        }else if(count == 1){
            /* blink an led for 2s */
            ++count;
        }
    }
    

所以我想知道这种行为与我在本地和全局声明变量有什么关系。

最佳答案

就所有实际目的而言,这两个程序是完全等效的。您无需在本地声明变量,也无需在全局声明变量; count 变量在两个程序中都是全局变量。唯一的区别是计数变量在第一个程序中由指令设置为零。但它已经为零,因为它是全局的,并且全局变量在加载时初始化为零。如果您从第一个程序中省略 count = 0 语句,它们就会变得相同。

由于它们相同但表现出不同的行为,因此问题一定出在 mplab 仿真器中。使用模拟器/IDE的step功能来检查check函数中count的值。

问题评论中的所有建议都可以改进代码,但都不是必需的:

  • 没有类型的参数默认为 int。所以count参数是一个int;
  • return 语句将确保返回正确的值,但携带函数返回值的寄存器显然仍然保存计数的递增值,在英特尔汇编器中,这是 ax 寄存器:

mov ax, [计数] 斧头 mov [计数], ax

关于c - 使用 MPLAB 在 C 中声明全局变量和局部变量有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28397513/

相关文章:

c - 大小没有增加,但它存储了更大的数据。这怎么可能?

c - 链表的意外行为

c++ - HEX 的编码类型

c - C语言中一个宏给出了错误的值

c - 有人有使用 PC-Lint 和 Netbeans 或 MPLAB X IDE 的经验吗?

c - 运行有很多输入的 c 程序并保存到文件?

C# - 如何在没有 IDE/Visual Studio 的情况下制作程序?

c - MPLAB XC16 : Mixing C and Assembly

c - 如何在主代码中使用USART中断char变量?

c - PIC24F16KA102 上的定时器 1 不工作