温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - How do I continue to receive timed interrupts in an embedded C while loop?
c embedded iar

其他 - 如何继续在嵌入式C while循环中接收定时中断?

发布于 2020-04-14 17:53:30

我需要嵌入式设备在功能上停留半秒,以使另一台设备赶上来。我使用了1毫秒的计时器(对于Renesas IAR IDE,是r_cg_cmt.c),并且具有一个静态volatile int delay_time,它每隔1毫秒定时中断递增一次。
使用代码:

//counter.c

 //on 1 mS timed interrupt
 gen_purpose_1ms_couter();

 void gen_purpose_1ms_couter_reset( void ){ 
   gen_c->count = 0;
  }


void gen_purpose_1ms_couter( void ){ 
  gen_c->count++;
 } 


//source_file.h

struct gen_counter {
  unsigned int count;
};

extern struct gen_counter *gen_c;

//source_file.c
#include "counter.h"

struct gen_counter *gen_c;

 gen_purpose_1ms_couter_reset();
 while(1){
   if(gen_c->count > 500){
      break;
   }
 }

但是,这导致处理器(RX231)停留在while循环中,并且不执行任何定时中断。谁能解释我如何在一定时间内停留在功能上?

查看更多

提问者
William Dussault
被浏览
88
kkrambo 2020-02-04 01:50

您没有提供完整的示例,但是有一些可能的原因导致您的代码无法按预期工作。

  1. 计时器未正确配置/启用。
  2. 计时器中断未正确启用。
  3. 中断处理程序未正确注册。
  4. while循环已经过优化,并且gen-c->count每次迭代都不会重新读取,因为它没有声明为volatile。

是否有gen_purpose_1ms_couter击中断点如果不是,则计时器或中断设置不正确。

如果禁用优化,代码是否可以开始工作?如果是这样,则genc->count需要声明为volatile。