关于ADSP-TigerSHARC的IDLE指令

2024-03-18 04:48
文章标签 指令 idle adsp tigersharc

本文主要是介绍关于ADSP-TigerSHARC的IDLE指令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

手头有一本《ADSP技术与应用》(机械工业出版社),主要讲解SHARC系列。我在书中P58看到待机指令IDLE,对它的说明如下:
 

    DSP进入低功耗等待状态,程序地址不变,直到某个中断出现才执行中断服务程序和后续指令。
      降低功耗,这个比较诱人,因为很多场合电量的提供非常有限。
     上面所说是SHARC的IDLE指令,在TigerSHARC中又如何呢?我在ADSP-TS201 TigerSHARCProcessor Programming Reference中找到下面这段话:
      This instruction causes theTigerSHARC processor to go into IDLE state. In this state theTigerSHARC processor stops executing instructions and waits for anytype of interrupt.
     这段文字说得相当明确,虽然没有说可以降低功耗,但是处理器停止执行指令(...Processor stops executinginstructions...),功耗肯定会下降一些吧。
      为了试验一下这条指令,我写了如下的C程序:


#include <builtins.h>
#include <sysreg.h>
#include <defts201.h>

const char __argv_string[] = "-abc -xyz";

#define IDLE __builtin_idle()
#define RREAD(reg) __builtin_sysreg_read(reg)
#define RWRITE(reg,value) __builtin_sysreg_write(reg,value)

void irq0_isr(void);

int main( int argc, char*argv[] )
{
   
    int v;
    //将FLAG2设为输出模式
   RWRITE(__FLAGREGST,FLAGREG_FLAG2_EN);
    //设置IRQ0服务程序
   RWRITE(__IVIRQ0,(int)irq0_isr);
    //设置跳沿触发
   RWRITE(__INTCTL,0);
    //允许外部IRQ0
   v=RREAD(__IMASKH);
   v|=(1<<INT_IRQ0_P);
    RWRITE(__IMASKH,v);
    //开全局中断使能
   RWRITE(__SQCTLST,SQCTL_GIE);
    v=0;
    IDLE;//调用__builtin_idle()
   v=0;
    return 0;
}

#pragma interrupt
void irq0_isr(void)
{
    static intbutton=0;
    button=!button;
    if(0==button)
    {
       RWRITE(__FLAGREGCL,~FLAGREG_FLAG2_OUT);
    }
    else
    {
       RWRITE(__FLAGREGST,FLAGREG_FLAG2_OUT);
    }
}

      在main函数中的IDLE(注意main函数中的那个IDLE不是汇编指令IDLE,而是我自己定义的一个宏,用来调用__builtin_idle)和return0中间的那句v=0设置一个断点,然后用EZ-KIT运行程序,我们会发现VisualDSP++的状态栏一直显示Running而不会到达断点。如果我们通过按钮触发一个IRQ0,则与FLAG2管脚相连的LED发光(表明中断服务程序被执行),程序马上就到达断点处,验证了执行IDLE指令时DSP的行为。
     函数__builtin_idle就是用来在程序中加入IDLE指令,看一下反汇编就明白了。  

     这样看来,如果我们的DSP程序主要任务都是由中断来触发的话,在main中的那个死循环写成while(1);就是不经济的了,如果写成:
while(1)
    __builtin_idle();
      是否能变得省电呢?应该会吧。可惜手头没有什么仪器测试一下功耗。

     在51及其兼容单片机中,没有IDLE这样的指令,如果程序的任务都是由中断触发,则主程序在完成初始化的任务之后,就会用一句SJMP$进行原地跳转。如果用C51,就写while(1);或for(;;);这两种写法对应的汇编都是一样的:

while(1);的汇编代码:

    58:    while(1);
C:0x0040   80FE     SJMP    C:0040

for(;;);的汇编代码:

   59:        for(;;);
C:0x0040   80FE     SJMP    C:0040

     上面汇编代码SJMP前面的80FE就是对应的机器代码。SJMP指令由两个字节组成,第一个字节是80H,表示它是SJMP指令,第二个字节是一个有符号的整数,表示相对偏移量。这条指令是这样被执行的:

      首先PC加2,因为这条指令有两个字节;

     然后把第二个字节表示的相对偏移量加到PC上,作为下一条指令的地址。

      SJMP$对应的机器码是80FE,因为FE是补码形式,对FE取反得到01,然后加一,得到2,于是FE表示-2。指令80FE就是先让PC+2,然后将PC-2,这一加一减,所以PC仍然指向SJMP$,原地跳转。

 

    可见,没有类似IDLE指令的51及其兼容单片机,在等待中断的时候,依然不停地取指令,执行指令。


这篇关于关于ADSP-TigerSHARC的IDLE指令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/821226

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行

mysql中导入txt文件数据的操作指令

1 表tt的格式:    CREATE TABLE `tt` (   `ind` int NOT NULL auto_increment,   `name` char(100) default NULL,   PRIMARY KEY  (`ind`)  )   2 文件d.txt的内容示例:  1,a  2,b  3,c

可选择的反思指令微调

论文:https://arxiv.org/pdf/2402.10110代码:GitHub - tianyi-lab/Reflection_Tuning: [ACL'24] Selective Reflection-Tuning: Student-Selected Data Recycling for LLM Instruction-Tuning机构:马里兰大学, Adobe Research领

驱动安装注册表指令

HKCR: HKEY_CLASSES_ROOT HKCU: HKEY_CURRENT_USER HKLM: HKEY_LOCAL_MACHINE HKU: HEKY_USER HER: 相对根键

4G模块、WIFI模块、NBIOT模块通过AT指令连接华为云物联网服务器(MQTT协议)

MQTT协议概述 MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用来提供一对多的消息分发和应用之间的通讯,尤其适用于远程位置的设备和高延迟或低带宽的网络。MQTT协议基于客户端-服务器架构,客户端可以订阅任意数量的主题,并可以发布消息到这些主题。服务器(通常称为MQTT Broker)则负责接受来自客户端的连接请求,并转发消

matlab一些基本重要的指令

重点内容 运行MATLAB的帮助demo,在Command Window 输入 “demo”,或在Launch Pad 选项卡“demos” 任何时候都可以: 清除Command Window内容:clc 清除Figure Window(图形窗口) clf 清除workspace 变量内容: clear 注意:M脚本文件和输入指令中的变量都在workspace中,为避免变量冲突,一般在

vue的v-slot指令使用总结

父组件代码:  <template><div id="app"><img alt="Vue logo" src="./assets/logo.png"><slotdemo> <template v-slot:a>this is a </template>asdad</slotdemo></div></template><script>import slotdemo from './compon

maven 指令之package 和install的区别

https://blog.csdn.net/zy103118/article/details/79901357   maven 指令之package 和install的区别 2018年04月11日 19:08:46 brave_zhao 阅读数:2018更多 个人分类: maven maven package 和 install 区别 原创 2016年08月18日 14:55:26