【问题标题】:How do I continue to receive timed interrupts in an embedded C while loop? [duplicate]如何在嵌入式 C while 循环中继续接收定时中断? [复制]
【发布时间】:2020-02-03 16:33:34
【问题描述】:

我需要一个嵌入式设备在一个函数中停留半秒,以允许另一个设备赶上。我使用了 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 循环中并且不执行任何定时中断。谁能解释我如何在一个函数中停留一段时间?

【问题讨论】:

  • 您上周问了完全相同的问题,并让 cmets 指出问题的问题所在。为什么不修改就转发?
  • 在几个人指出了一些错误之后,我发布了一个更新版本。
  • 我不知道您正在使用的系统,但从我一直使用的嵌入式系统中,我似乎记得用作中断处理程序的函数应该用关键字“中断”标记。这是为了使编译器生成用于确认中断和重新启用中断的代码。不确定这是否有帮助。顺便说一句:struct gen_counter 是如何定义的?
  • 顺便说一句:这些行的目的是什么:` //on 1 ms timed interrupt gen_ purpose_1ms_couter();` 对我来说似乎很奇怪。这是一些weak 函数覆盖吗?
  • OT: couter --> counter?

标签: c embedded iar


【解决方案1】:

您没有提供完整的示例,但以下是您的代码未按预期工作的几个可能原因。

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

gen_purpose_1ms_couter 中的断点是否命中?如果不是,则定时器或中断设置不正确。

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

【讨论】:

  • 感谢您的回复,正常运行期间 1mS 计时器应按此进行。这种延迟在一个中断内,我刚才被告知这是一个非常糟糕的主意,因为中断应该非常快。我将它移至简单地设置一个标志,一旦中断完成,它就会开始延迟。这主要是一个新手错误,但感谢您的帮助。不胜感激。
  • @WilliamDussault 在中断中设置延迟不仅是个坏主意:执行 ISR 时会禁用其他中断,因此无法执行定时器中断。您已经创建了一个死锁。
  • 谢谢。我花了几个小时仔细研究数据表,试图证实我死锁处理器的事实。
猜你喜欢
  • 1970-01-01
  • 2020-06-09
  • 2015-05-27
  • 2010-11-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 2015-04-16
  • 2010-09-05
相关资源
最近更新 更多