打印

项目遇到大困难!定时器为什么会停止计数?请高手指点一

[复制链接]
2477|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccjgalaxy|  楼主 | 2009-7-21 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在使用DM642开发板做实验
在bios中单独的网络通信程序,以及单独的定时器程序都运行正常,但是如果把这两个程序合在一块,定时器运行一瞬间就不运行了,不知怎么回事?

下面的程序是我用LOG_printf在bios中用message log输出定时器的计数情况,在message log中只能输出几行,后面的就输不出来了,这是怎么回事?
这是我的定时程序:
#include <std.h>
#include <log.h>
#include <tsk.h>  
#include <sem.h>   
#include <gio.h>
#include <csl.h>
#include <csl_emifa.h>
#include <csl_timer.h>
#include <csl_irq.h>

#include "appData.h"
#include "scom.h"
#include "seeddm642.h"
#include "Tcpip_loopbackcfg.h" 
static TIMER_Handle hTimer1;

static Uint32 TimerEventId;

static int cnt = 0;
static Uint32 TimerControl = 

                        

        TIMER_CTL_RMK

        (

                TIMER_CTL_SPND_EMUSTOP,

                  TIMER_CTL_INVINP_NO,                 // TINP inverter control(INVINP)

                  TIMER_CTL_CLKSRC_CPUOVR8,        // Timer input clock source (CLKSRC)

                TIMER_CTL_CP_PULSE,                 // Clock/pulse mode(CP)

                TIMER_CTL_HLD_YES,                         // Hold(HLD)

                TIMER_CTL_GO_NO,                         // Go bit(GO)-

                                                                        //   resets & starts timer counter

                TIMER_CTL_PWID_ONE,                 // Pulse width(PWID)-

                                                                        //   used only in pulse mode

                TIMER_CTL_DATOUT_0,                 // Data output (DATOUT)

                TIMER_CTL_INVOUT_NO,                 // TOUT inverter control (INVOUT) 

                TIMER_CTL_FUNC_GPIO                 // Function of TOUT pin(FUNC)

        );     
main()
{
              TIMER_Config myTimConfig;
        CSL_init();
/*.................网络通信部分.......................*/
    CACHE_enableCaching(CACHE_EMIFA_CE00);
    CACHE_enableCaching(CACHE_EMIFA_CE01);
    DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
    
    SCOM_init();
    
    CACHE_setL2Queue(0x3, 0x7);
    CACHE_setL2Queue(0x1, 0x7);
    CACHE_setPriL2Req(CACHE_L2PRIHIGH);
  // create all SCOM and message objects                   
    SCOM_create("NETOK", NULL); 
  /*..............................定时器部分............*/

        hTimer1 = TIMER_open(TIMER_DEV1, 0);
        TimerEventId = TIMER_getEventId(hTimer1);
        IRQ_globalDisable();
                IRQ_nmiDisable();
        IRQ_globalEnable();
        IRQ_nmiEnable();
        IRQ_map(TimerEventId, 15);
        IRQ_reset(TimerEventId);
        myTimConfig.cnt = 0x0;
        myTimConfig.ctl = TimerControl;
        myTimConfig.prd = 0x00124f8;//1ms定时,即每1ms,cnt计数增1
        TIMER_config(hTimer1, &myTimConfig);
        IRQ_enable(TimerEventId);
        TIMER_start(hTimer1);
}
void CLK_cnt()
{
   cnt++;
   LOG_printf(&trace,"cnt VAL is %d ", cnt);
}

在message log里输出的结果:
0   cnt VAL is 1

1   cnt VAL is 2

2   cnt VAL is 3        为什么只有这三行呢?下面的就输不出来了,这是怎么回事?

相关帖子

沙发
yxwsz| | 2009-7-21 13:50 | 只看该作者

RE

LOG_printf在DSP的空闲周期(idle)工作,如果DSP负载较重的话,没有输出是正常的。

使用特权

评论回复
板凳
ccjgalaxy|  楼主 | 2009-7-21 14:06 | 只看该作者

谢谢yxwsz,非常感谢您!

不过我觉得,我的程序只不过是用网口向电脑传几个数而已,这也会造成DSP负载过重吗?
那如果不用LOG_printf,还有什么办法知道我的定时器在正常计数吗?

使用特权

评论回复
地板
ccjgalaxy|  楼主 | 2009-7-21 17:38 | 只看该作者

仿真看变量可以吗?

仿真时程序在运行,变量 cnt 在中断函数中,我用了Add to watch window,发现在watch window 中变量的值根本不变。
请问你仿真的时候是怎么观察变量值的?

使用特权

评论回复
5
xj803| | 2009-7-21 17:39 | 只看该作者

真相

使用特权

评论回复
6
ccjgalaxy|  楼主 | 2009-7-22 10:58 | 只看该作者

哎,我发现原因还是定时器会停止计数

我又用串口来检验定时器计数的cnt值,发现电脑上的串口调试助手只能接收到
前面三个cnt的值,后面的就收不到了。
#include <std.h>
#include <log.h>
#include <tsk.h>  
#include <sem.h>   
#include <gio.h>
#include <csl.h>
#include <csl_emifa.h>
#include <csl_timer.h>
#include <csl_irq.h>

#include "appData.h"
#include "scom.h"
#include "seeddm642.h"
#include "Tcpip_loopbackcfg.h" 
static TIMER_Handle hTimer1;

static Uint32 TimerEventId;

static int cnt = 0;
static Uint32 TimerControl = 

                        

        TIMER_CTL_RMK

        (

                TIMER_CTL_SPND_EMUSTOP,

                  TIMER_CTL_INVINP_NO,                 // TINP inverter control(INVINP)

                  TIMER_CTL_CLKSRC_CPUOVR8,        // Timer input clock source (CLKSRC)

                TIMER_CTL_CP_PULSE,                 // Clock/pulse mode(CP)

                TIMER_CTL_HLD_YES,                         // Hold(HLD)

                TIMER_CTL_GO_NO,                         // Go bit(GO)-

                                                                        //   resets & starts timer counter

                TIMER_CTL_PWID_ONE,                 // Pulse width(PWID)-

                                                                        //   used only in pulse mode

                TIMER_CTL_DATOUT_0,                 // Data output (DATOUT)

                TIMER_CTL_INVOUT_NO,                 // TOUT inverter control (INVOUT) 

                TIMER_CTL_FUNC_GPIO                 // Function of TOUT pin(FUNC)

        );     
main()
{
              TIMER_Config myTimConfig;
        CSL_init();
/*.................网络通信部分.......................*/
    CACHE_enableCaching(CACHE_EMIFA_CE00);
    CACHE_enableCaching(CACHE_EMIFA_CE01);
    DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
    
    SCOM_init();
    
    CACHE_setL2Queue(0x3, 0x7);
    CACHE_setL2Queue(0x1, 0x7);
    CACHE_setPriL2Req(CACHE_L2PRIHIGH);
  // create all SCOM and message objects                   
    SCOM_create("NETOK", NULL); 
  /*..............................定时器部分............*/

        hTimer1 = TIMER_open(TIMER_DEV1, 0);
        TimerEventId = TIMER_getEventId(hTimer1);
        IRQ_globalDisable();
                IRQ_nmiDisable();
        IRQ_globalEnable();
        IRQ_nmiEnable();
        IRQ_map(TimerEventId, 15);
        IRQ_reset(TimerEventId);
             IRQ_reset(IRQ_EVT_EXTINT5);
    
          
     SEEDuartHandleA = SEEDDM642_UART_open(SEEDDM642_UARTA, 
                                          SEEDDM642_UART_BAUD9600, 
                                          &UartConfig);
   /* Open UARTB*/
    SEEDuartHandleB = SEEDDM642_UART_open(SEEDDM642_UARTB, 
                                          SEEDDM642_UART_BAUD9600, 
                                          &UartConfig);        
 
        myTimConfig.cnt = 0x0;
        myTimConfig.ctl = TimerControl;
        myTimConfig.prd = 0x00124f8;//1ms定时,即每1ms,cnt计数增1
        TIMER_config(hTimer1, &myTimConfig);
        IRQ_enable(TimerEventId);
        IRQ_enable(IRQ_EVT_EXTINT5);
        TIMER_start(hTimer1);
}
void CLK_cnt()
{
   cnt++;
    SEEDDM642_UART_putChar(0,cnt);//在串口调试助手中只能接收到前三个cnt的值,不知为什么?
}

 void Uart_isr(void)
{
    
     Uint16 Data_Temp;    //Int16 status;
      Data_Temp = SEEDDM642_UART_rget(SEEDuartHandleA,0);
      SEEDDM642_UART_putChar(0, Data_Temp);
      
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

37

帖子

0

粉丝