TI中文支持网
TI专业的中文技术问题搜集分享网站

关于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是什么意思?

Blake Ma:

Hi, Lzh4774 

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

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

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

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

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

另外还有个问题:

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

Bruce:

回复 Blake Ma:

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

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

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

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

另外还有个问题:

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

Bruce:

回复 Bruce:

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

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

可以直接写成:

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

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

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

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

另外还有个问题:

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

Blake Ma:

回复 Bruce:

在工程文件 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中运行“ 的帖子中回复,实现方法相同,在这里就不赘述了。

 

 

赞(0)
未经允许不得转载:TI中文支持网 » 关于F28035自带的延迟函数
分享到: 更多 (0)