通过时间延迟增加整数

Increasing an integer through a time delay

我正在用 C 语言在微处理器上制作游戏。分数取决于你能活多久;分数每 3 秒增加 1。分数是一个全局声明的整数,但从函数中显示。

int score = 0;//globally declared

void draw_score(int score_d)
{
    char score_draw[99];
    sprintf(score_draw,"%d", score_d);
    draw_string(score_draw, 9, 0);
}

我在想一个函数,它只是将分数增加一个并延迟它,但是没有奏效。

void score_increaser(int score)
{
    score++;
    _delay_ms( 3000 );
}

需要while循环吗?无论如何,函数本身都会进入 main 中的 while 循环。

C是按值传递。

score_increaser() 如您的问题所示,仅增加传入内容的 copy

要解决此问题,(主要)有两种选择:

  1. 由于score是全局定义的,所以不要传入任何东西:

    void score_increaser(void) {
      score++;
      _delay_ms( 3000 );
    }
    

    这会直接修改全局 score

  2. 传入score的地址并在函数内部取消引用

    void score_increaser(int * pscore) {
      (*pscore)++;
      _delay_ms( 3000 );
    }
    

    这样称呼它

    ...
    score_increaser(&score);
    ...
    

第三种更复杂的方法(假设目标平台支持信号)将

  1. 设置信号和引用处理程序,然后
  2. 设置一个定时器,每 N 秒发出一个信号。
  3. 此信号随后由处理程序处理,后者又
  4. 增加全局score
  5. 再次启动计时器。

这可能看起来像:

#include <signal.h> /* for signal() and sig_atomic_t */
#include <unistd.h> /* for alarm() */


#define DURATION (3) /* Increase score every 3 seconds. */

sig_atomic_t score = 0;


void set_alarm(unsigned);

void handler_alarm(int sig)
{
  ++score;
  set_alarm(DURATION);
}

void set_alarm(unsigned duration)
{
  signal(SIGALRM, handler_alarm);
  alarm(duration);
}


int main(void)
{
  set_alarm(DURATION);

  ... /* The game's codes here. */
}

后一种方法的优点是您的游戏代码不需要关心增加 score。只要程序运行,score 每 3 秒增加一次。

score 是全局值,如果该函数可以访问该全局值,则不需要在函数中传递它 space

void score_increaser() {
score++;
_delay_ms( 3000 );
}

我建议使用定时器中断。将定时器配置为 3 秒。

volatile int score = 0; //global

void Intr_Init(peripheral_t per)
{
    //Initialize the timer interrupt
}

void draw_score(int score_d)
{
    char score_draw[99];
    sprintf(score_draw,"%d", score_d);
    draw_string(score_draw, 9, 0);
}

int main(void)
{
    Intr_Init(TIMER);
    while(1)
    {
        //Code that makes your game run
        draw_score(score);
    }
}

ISR (TIMER1_COMPA_vect)
{
    //clear disable interrupt
    score++;
    //enable interrupt
}

在嵌入式中,您应该依靠计时器来完成更好的时间关键任务和准确性。 Delay例程的实现方式通常是一个循环或者一个up/down计数器。而计时器通常基于对 SysTick 的计数。 中断的另一个主要优点是让处理器一直执行任务,而不是让它阻塞在延迟循环中。

你不需要分数参数,因为它是全局声明的..

//global 
int score = 0;

void score_increaser()
{
   _delay_ms(3000);
   score++;
}

调用就像:score_increaser(); 应该完成工作.. 我建议你在任何其他 line/function 中检查 score.. 也许你已经重新声明它或不小心更改了值..

希望这对您有所帮助..

这里有一个处理分数的好方法。

在'start game'函数中,

clear 'score' to 0
setup a timer: 
--to expire once each 3 seconds 
--enable the automatic reload feature, 
--enable the timer interrupt
--enable the timer counter

在定时器中断处理函数中

--increment 'score'
--clear the timer interrupt pending flag

在'end game'函数中

disable the timer counter
disable the timer interrupt
display the 'score' value