This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6455 Power-Down Controller Command Register (PDCCMD) 问题

原文:

The following software sequence is required to power-down the C64x+ megamodule:
1. Enable power-down by setting the MEGPD field to 1 in the PDCCMD register.
2. Enable the CPU interrupt(s) that you want to wake-up the C64x+ megamodule. Disable all other
interrupts.
3. Execute the IDLE instruction.
The C64x+ megamodule stays in a power-down state until awakened by the interrupt(s) that are enabled
in step 2.

理解:

PDCCMD = 0x00010000,

使能中断,(定时器)

IDLE

然后,DSP进入 休眠模式,等待定时器中断唤醒,执行定时器中断服务程序后,继续执行IDLE之后的指令。

但是,CCS V5.4  simulator,的时候,上述指令后,出现奇怪现象:

1、定时器照计时,溢出也中断,IER使能,IFR置位,但是不执行中断代码

2、第二次定时器中断后,提示:TMS320C64X+: Warning: CPU:Interrupt No. 12 dropped, an earlier interrupt is pending to be taken 

3、当然,IDLE之后的代码也不执行,一直停在IDLE处。

不过,我把指令改为:(只取消了 PDCCMD=0x00010000; 一个与语句)

使能中断,(定时器)

IDLE

则,

IDLE后,程序停在IDLE,

定时器中断唤醒,执行定时器中断服务程序后,继续执行IDLE之后的指令。

一切正常。

奇怪!请高人解释,我是否什么地方理由有误?

  • 能否在硬件上试一下。

  • Shine Zhang 说:

    能否在硬件上试一下。

    我也怀疑,正在找硬件。

    另外,我发现 第一次进DEBUG之后  和 在DEBUG下面Restart,表现也不同。

    现象:

    timer64_period(0,0x1000);                                                            //设置 定时器 溢出周期
    timer_mode_config(0,CSL_TMR_MODE_GP);                            //设置 64位计数模式
    timerlo_countmode_config(0,CSL_COUNTLO_MODE_LOOP);  //设置溢出再循环

    第一次硬件复位,OK;
    软件复位后,有问题,改为下面后,simulator正常

    timerlo_countmode_config(0,CSL_COUNTLO_MODE_LOOP);
    timer64_period(0,0x600);
    timer_mode_config(0,CSL_TMR_MODE_GP);

    感觉,先设置 TGCR0后,再次写 TCR0 同样的值,似乎有问题。反过来,OK。(通过相关寄存器内存地址看过了,没有任何其他数据问题)

    不过,问题虽然看起来 解决了,原因不理解。等有了硬件 还需要 确诊。(应该是不知道哪里出了问题,这个只是表象而已)

  • Shine Zhang 说:

    能否在硬件上试一下。

    目前只是在软件上学习,

    学习 DSP 3周,从C6455入手的,CCS V5.4(太高的话,编译器不支持C6455)

    到昨天为止,CCS 基本功能掌握,可以通过simulator调试一个项目了。

    不过,CCS 的 simulator 对于硬件的模拟,好像不怎么样,目前只 掌握了,模拟 定时器,中断 等 硬件模块。

    了解了 C编译器 ,汇编编译器,连接器等工作原理,

    混合 汇编语言,C语言,自己编写了一个 小型的 mini的 多任务操作系统,可以 调度 31个用户任务。

    int main(void)
    {

        timer_init();

        int_init();

        timer0_enable();


        OSInit();  //加载 我自己的 操作系统 ,然后切换到 用户 Task1 开始
    }

    interrupt void timer0_isr(void)
    {

    task_tick_step();    //定时器 1ms 中断,驱动多任务管理系统 时间片

    return;
    }

    //必须有这个任务
    void Task1(void)
    {
        int i,j;

        os_creat_task(2);  //第一个任务1, 加载任务2
        os_creat_task(3);  //第一个任务1, 加载任务3

        j=3; //任务1 的 临时变量 ,便于观察


    while(1)
    {
        for(i=0;i<j;i++);

        os_wait(2);   //睡眠 2个时间片,把CPU资源交出去,系统切换到 其他任务
    }


    }

    void Task2(void)
    {
    int i,j;

    j=5; //任务2 的 临时变量 ,便于观察
    while(1)
    {
    for(i=0;i<j;i++);

    os_wait(4); //睡眠 4个时间片,把CPU资源交出去,系统切换到 其他任务
    }

    }


    void Task3(void)
    {
    int i,j;

    j=9; //任务3 的 临时变量 ,便于观察
    while(1)
    {
    for(i=0;i<j;i++);

    os_wait(8); //睡眠 8个时间片,把CPU资源交出去,系统切换到 其他任务
    }

    }

    这3个任务,运转正常,切换流畅。

    通过自己写 操作系统,主要就是练手,对于深入 掌握 CCS 的编译环境 很有帮助。当然 对于 DSP CPU的 架构的理解也有帮助。