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.

[参考译文] CCS/UCD3138:在 UCD3138中使用 ramfunc

Guru**** 2428120 points
Other Parts Discussed in Thread: UCD3138

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/664050/ccs-ucd3138-using-ramfunc-in-ucd3138

器件型号:UCD3138

工具/软件:Code Composer Studio

您好!

我正在尝试将标准中断函数放入 RAM 中、该代码的执行速度可以更快。

我使用的是 Code Composer Studio 版本:6.1.0.00104、并尝试在我的标准中断之前放置__attribute___(ramfunc)、

但它不起作用。

 此 CCS 版本是否支持 ramfunc? 是否有任何示例展示了如何在 UCD3138中执行 ramfunc?

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我添加了以下行:
    ram_std_isr:{ isr_standard.obj (.text)} load=pflash,run=RAM,table (BINIT)

    对于 cyclone_128.cmd、编译后、我的 ISR 函数的运行地址似乎可以放置在 RAM 区域中。

    那么下一步是什么?

    复制 load_UCD3138_128.asm 中的以下代码以移动 binit 表中指定的内容?

    是否有示例代码?
     
    tbl_addr .set r0
    VAR_addr .set r1.
    tmp .set R2
    长度:.set R3
    数据:.set R4
    三:.set R5

    MOV Three,#3;
    b rec_chk;

    ;*--------------------------------------------------
    ;*处理初始化记录
    ;*--------------------------------------------------
    记录:ldr var_addr、[tbl_addr、#4];
    添加 tbl_addr,#8;

    ;*--------------------------------------------------
    ;*复制初始化数据
    ;*--------------------------------------------------
    MOV tmp、var_addr;确定对齐
    和 tmp、3;以及按字节复制
    bNE _Bcopy;如果不是字对齐

    MOV tmp,length;用于字复制,条带
    和 tmp、3;输出 NONWORD 部件
    BIC length,three;of the length
    BEQ_wcont;

    _wcopy:ldr 数据,[tbl_addr];
    添加 tbl_addr,#4;
    STR data,[var_addr];copy a word of data
    添加 var_addr,#4;
    亚长,#4;
    bne _wcopy;
    _wcont: MOV length,tmp ;
    BEQ_CONT;

    bcopy:ldrb 数据,[tbl_addr];
    添加 tbl_addr,#1;
    STRB 数据,[var_addr];复制一个数据字节
    添加 var_addr,#1;
    亚长,#1;
    bNE _Bcopy;

    _CONT: MOV tmp,tbl_addr ;
    tmp, three;确保地址
    BEQ rec_chk;字对齐
    BIC tbl_addr,3;
    添加 tbl_addr、#0x4;

    REC_CHK:LDR length,[tbl_addr];进程下一步
    CMP 长度,#0;如果长度是,则记录
    BNE 记录;非零

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定您的代码是否能正常工作。 您可以从 RAM 执行、但在 UCD 上、它的运行速度不会更快。

    我们对 RAM 执行的唯一用途是修改程序闪存。 当一个程序闪存32K 块被写入或擦除时、它将所有 FFs 返回到所有读取。 那么、我们在此时将代码复制到 RAM 中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有一些方法可以使代码运行得更快。 尤其是当您通常用于 DSP 和哈佛架构机器时。

    在 ARM7和许多 ARM 内核上、没有立即的绝对寻址、但有良好的相对寻址。 因此、最好将高速代码段中使用的所有 RAM 变量放入一个单一结构中。 这样、代码会将结构体的地址加载到寄存器中一次、然后使用偏移量对结构体元素进行寻址。 这可以为每个被访问的变量节省3个指令周期、因为这是将一个32位常量加载到寄存器中所需的时间。 如果您单独定义变量、则每次访问变量时会获得额外的3个周期。

    此外、ARM7没有单周期读取修改写入、包括位设置和位清零。 每个位操作都需要将数据从存储器或外设读取到处理器寄存器中、对其进行带区和/或 ORing、并将其写回。 例如、对于外设、如果您只能写入.all 而不是位结构、您将节省一些时间。

    当然、对于高速代码、使用 ARM 模式、而不是 Thumb 模式。

    还可以使用编译器的高速设置。

    如果您不担心汇编代码、快速中断会有一些专用的通用寄存器。 您可以使用指针预加载它们、以便在快速中断执行期间不必加载它们。 C 编译器不支持这一点。 它使用这些寄存器、因此不必将尽可能多的寄存器推入栈。

    否则、标准加速策略的作用是:

    1.只计算快速循环中绝对必须包含的内容-预先计算您可以执行的所有操作
    2.避免除法、如果可以、预计算倒数和乘法
    展开循环
    4.对高速循环调用的所有函数使用内联函数。 为了使内联正常工作、函数和调用函数必须位于同一文件中。
    等等。