我需要嵌入式设备在功能上停留半秒,以使另一台设备赶上来。我使用了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循环中,并且不执行任何定时中断。谁能解释我如何在一定时间内停留在功能上?
您没有提供完整的示例,但是有一些可能的原因导致您的代码无法按预期工作。
gen-c->count
每次迭代都不会重新读取,因为它没有声明为volatile。是否有gen_purpose_1ms_couter
击中断点?如果不是,则计时器或中断设置不正确。
如果禁用优化,代码是否可以开始工作?如果是这样,则genc->count
需要声明为volatile。
感谢您的答复,因为1mS计时器会在正常操作期间达到目标。这个延迟是在一个中断中,我刚才被告知这是一个非常糟糕的主意,因为中断应该非常快。我将其移动到只是设置一个标志,并在中断完成后开始延迟。这主要是菜鸟的错误,但感谢您的帮助。感激不尽。
@WilliamDussault在中断内部进行延迟不仅是一个坏主意:执行ISR时会禁用其他中断,因此定时器中断无法执行。您已经创建了死锁。
谢谢。我花了几个小时来浏览数据表,以期弄清我已死锁处理器的事实。