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.
原文:
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的 架构的理解也有帮助。