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.

关于F28035自带的延迟函数

官方自带了一个延迟程序:

#define DELAY_US(A)  DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)

为什么我每次调用时,就会跳到非法指令的中断中去?

另外还有个问题:

9.0和5.0后面带个L是什么意思?

  • Hi, Lzh4774 

    (1)为了保证代码实行的速率和准确性,DELAY_US()函数需要运行在RAM中,不知道您在调用之前有没有在工程中进行相应的操作?

    (2)编译器默认浮点为double类型,64位, 如果在浮点后面加上F 就指定编译 为float类型 32位;如果在浮点后加上L,就指定为 long double 类型,128位。

  • 没有,我直接下载到FLASH中单步调试的!

  • #pragma CODE_SECTION("XXXXX","ramfuncs")

    这里的XXXXX应该是一个函数的名称,DELAY_US是一个宏定义

    可以直接写成:

    #pragma CODE_SECTION("DELAY_US","ramfuncs")吗?

  • 在工程文件 DSP2803x_usDelay.asm 中,可以找到 DELAY_US() 的定义如下所示:

    从这段代码中可以看出,DELAY_US() 是被定义在 ramfuncs 段中,如果在程序中调用该函数,则 PC 指针会跳转到相应的 RAM 存储空间内执行该函数。

     

    所以:

    (1)不需要在自己的代码中额外地将 DELAY_US() 再次声明为 ramfuncs。

    (2)但是示例工程文件中并没有将 DELAY_US()  从Flash 搬移到 RAM 的相应代码,如果运行在 Flash 中的程序需要调用 DELAY_US() ,则需要在自己的代码中添加代码搬移函数 MemCopy(),并在调用 DELAY_US() 之前先执行 MemCopy()。 

     

    当然,如果工程中没有定义 Memcopy() 函数,还需要对其进行定义,并且声明所用到的全局变量。相关内容已经在之前 ”搬移到RAM中运行“ 的帖子中回复,实现方法相同,在这里就不赘述了。