首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与while(1)并行运行时中断计时器卡住

与while(1)并行运行时中断计时器卡住
EN

Stack Overflow用户
提问于 2012-09-13 18:55:48
回答 1查看 1K关注 0票数 0

第一个代码:

代码语言:javascript
复制
//------------------------------------------------------------------------------
/// Interrupt handlers for TC interrupts. Toggles the state of LEDs
//------------------------------------------------------------------------------
char token = 0;
void TC0_IrqHandler(void) {
    volatile unsigned int dummy;
    dummy = AT91C_BASE_TC0->TC_SR;  
    if(token == 1) {
        PIO_Clear(&leds[0]);
        PIO_Set(&leds[1]);
        token = 0;
        }
    else {
        PIO_Set(&leds[0]);
        PIO_Clear(&leds[1]);
        token = 1;
        }
    }
//------------------------------------------------------------------------------
/// Configure Timer Counter 0 to generate an interrupt every 250ms.
//------------------------------------------------------------------------------
void ConfigureTc(void) {
    unsigned int div;
    unsigned int tcclks;
    AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_TC0;       // Enable peripheral clock
    TC_FindMckDivisor(1, BOARD_MCK, &div, &tcclks);     // Configure TC for a 4Hz frequency and trigger on RC compare
    TC_Configure(AT91C_BASE_TC0, tcclks | AT91C_TC_CPCTRG);
    AT91C_BASE_TC0->TC_RC = (BOARD_MCK / div) / 1;      // timerFreq / desiredFreq
    IRQ_ConfigureIT(AT91C_ID_TC0, 0, TC0_IrqHandler);   // Configure and enable interrupt on RC compare
    AT91C_BASE_TC0->TC_IER = AT91C_TC_CPCS;
    IRQ_EnableIT(AT91C_ID_TC0);
    printf(" -- timer has started \n\r");
    TC_Start(AT91C_BASE_TC0);
    }

它只是中断定时器和事件(处理程序),但当我运行一些

代码语言:javascript
复制
while(1) {
  // action

ConfigureTc()之后,周期计时器和中断计时器都会冻结...为什么会这样呢?我是否应该添加另一个计时器并避免使用while(1)

代码语言:javascript
复制
while(1) {
  printf("hello");
  }

--这会中断(冻结)循环(是的,如果我不使用计时器,它会按它必须的方式工作)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-14 04:17:32

我将在这里冒险给出一个实际的答案。在我的主板‘出去’的时候,99%的时间没有任何输入响应,也没有来自低优先级“闪烁”线程的“心跳”LED闪烁,CPU飞到了一个预取或数据中止处理程序。这些处理程序是通过中断进入的,并且大多数库定义的默认处理程序不会重新启用中断,因此填充了整个系统。通常,它们只是无穷无尽的循环,并且禁用了中断,这就是故事的结尾:

我已经更改了我的默认处理程序,将适当的“严重错误”消息输出到UART (通过轮询它-操作系统/中断是stuft!)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12404674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档